1
0
Fork 0
mirror of https://gitlab.com/bztsrc/bootboot.git synced 2023-02-13 20:54:32 -05:00

More address checks

This commit is contained in:
bzt 2021-04-08 18:02:09 +02:00
parent d8f3aa0084
commit 98fbe4c589
16 changed files with 114 additions and 65 deletions

1
.gitignore vendored
View file

@ -7,6 +7,7 @@ aarch64-rpi/*.dat
aarch64-rpi/*.elf
dist/bootbootcb.elf
images/*
mkbootimg/*.o
mkbootimg/mkbootimg

View file

@ -166,7 +166,7 @@ typedef struct {
} pe_sym;
/*** Raspberry Pi specific defines ***/
static uint64_t mmio_base;
static uint64_t mmio_base, emmc_base;
#define PM_RTSC ((volatile uint32_t*)(mmio_base+0x0010001c))
#define PM_WATCHDOG ((volatile uint32_t*)(mmio_base+0x00100024))
@ -264,6 +264,9 @@ void uart_dump(void *ptr,uint32_t l) {
void uart_exc(uint64_t idx, uint64_t esr, uint64_t elr, uint64_t spsr, uint64_t far, uint64_t sctlr, uint64_t tcr)
{
register uint64_t r;
/* only report exceptions for the BSP */
asm volatile ("mrs x8, mpidr_el1; and x8, x8, #3; cbz x8, 2f; 1: wfe; b 1b; 2:;" : : : "x8");
asm volatile ("msr ttbr0_el1, %0;tlbi vmalle1" : : "r" ((uint64_t)&__paging+1));
asm volatile ("dsb ish; isb; mrs %0, sctlr_el1" : "=r" (r));
// set mandatory reserved bits
@ -353,23 +356,23 @@ int hex2bin(unsigned char *s, int n){ int r=0;while(n-->0){r<<=4;
#endif
/* sdcard */
#define EMMC_ARG2 ((volatile uint32_t*)(mmio_base+0x00300000))
#define EMMC_BLKSIZECNT ((volatile uint32_t*)(mmio_base+0x00300004))
#define EMMC_ARG1 ((volatile uint32_t*)(mmio_base+0x00300008))
#define EMMC_CMDTM ((volatile uint32_t*)(mmio_base+0x0030000C))
#define EMMC_RESP0 ((volatile uint32_t*)(mmio_base+0x00300010))
#define EMMC_RESP1 ((volatile uint32_t*)(mmio_base+0x00300014))
#define EMMC_RESP2 ((volatile uint32_t*)(mmio_base+0x00300018))
#define EMMC_RESP3 ((volatile uint32_t*)(mmio_base+0x0030001C))
#define EMMC_DATA ((volatile uint32_t*)(mmio_base+0x00300020))
#define EMMC_STATUS ((volatile uint32_t*)(mmio_base+0x00300024))
#define EMMC_CONTROL0 ((volatile uint32_t*)(mmio_base+0x00300028))
#define EMMC_CONTROL1 ((volatile uint32_t*)(mmio_base+0x0030002C))
#define EMMC_INTERRUPT ((volatile uint32_t*)(mmio_base+0x00300030))
#define EMMC_INT_MASK ((volatile uint32_t*)(mmio_base+0x00300034))
#define EMMC_INT_EN ((volatile uint32_t*)(mmio_base+0x00300038))
#define EMMC_CONTROL2 ((volatile uint32_t*)(mmio_base+0x0030003C))
#define EMMC_SLOTISR_VER ((volatile uint32_t*)(mmio_base+0x003000FC))
#define EMMC_ARG2 ((volatile uint32_t*)(emmc_base+0x00000000))
#define EMMC_BLKSIZECNT ((volatile uint32_t*)(emmc_base+0x00000004))
#define EMMC_ARG1 ((volatile uint32_t*)(emmc_base+0x00000008))
#define EMMC_CMDTM ((volatile uint32_t*)(emmc_base+0x0000000C))
#define EMMC_RESP0 ((volatile uint32_t*)(emmc_base+0x00000010))
#define EMMC_RESP1 ((volatile uint32_t*)(emmc_base+0x00000014))
#define EMMC_RESP2 ((volatile uint32_t*)(emmc_base+0x00000018))
#define EMMC_RESP3 ((volatile uint32_t*)(emmc_base+0x0000001C))
#define EMMC_DATA ((volatile uint32_t*)(emmc_base+0x00000020))
#define EMMC_STATUS ((volatile uint32_t*)(emmc_base+0x00000024))
#define EMMC_CONTROL0 ((volatile uint32_t*)(emmc_base+0x00000028))
#define EMMC_CONTROL1 ((volatile uint32_t*)(emmc_base+0x0000002C))
#define EMMC_INTERRUPT ((volatile uint32_t*)(emmc_base+0x00000030))
#define EMMC_INT_MASK ((volatile uint32_t*)(emmc_base+0x00000034))
#define EMMC_INT_EN ((volatile uint32_t*)(emmc_base+0x00000038))
#define EMMC_CONTROL2 ((volatile uint32_t*)(emmc_base+0x0000003C))
#define EMMC_SLOTISR_VER ((volatile uint32_t*)(emmc_base+0x000000FC))
// command flags
#define CMD_NEED_APP 0x80000000
@ -619,6 +622,7 @@ int sd_init()
#if SD_DEBUG
uart_puts("EMMC: reset OK\n");
#endif
*EMMC_CONTROL0 = 0xF << 8; // set voltage to 3.3
*EMMC_CONTROL1 |= C1_CLK_INTLEN | C1_TOUNIT_MAX;
delaym(10);
// Set clock to setup frequency.
@ -792,7 +796,7 @@ unsigned char *kne;
char *cfgname="sys/config";
uint64_t entrypoint=0, bss=0, *paging, reg, pa;
uint8_t bsp_done=0;
static volatile uint8_t bsp_done=0;
/**
* SHA-256
@ -1175,8 +1179,8 @@ int bootboot_main()
/* first things first, get the base address */
asm volatile ("mrs %0, midr_el1" : "=r" (reg));
switch(reg&0xFFF0) {
case 0xD030: mmio_base = 0x3F000000; break; /* Raspberry Pi 3 */
default: mmio_base = 0xFE000000; break; /* Raspberry Pi 4 */
case 0xD030: mmio_base = 0x3F000000; emmc_base = 0x3F300000; break; /* Raspberry Pi 3 */
default: mmio_base = 0xFE000000; emmc_base = 0xFE340000; break; /* Raspberry Pi 4 */
}
/* initialize UART */
@ -1829,7 +1833,7 @@ viderr:
uart_hex(entrypoint,8);
uart_putc('\n');
if(initstack != 1024) {
uart_puts(" * Stack Size ");
uart_puts(" * Stack Size ");
uart_hex(initstack,8);
uart_putc('\n');
}

Binary file not shown.

Binary file not shown.

BIN
dist/bootboot.img vendored

Binary file not shown.

File diff suppressed because one or more lines are too long

View file

@ -6,8 +6,8 @@ extern unsigned char binary_boot_bin[512];
extern unsigned char binary_bootboot_bin[9284];
#define sizeof_bootboot_efi 103614
extern unsigned char binary_bootboot_efi[46349];
#define sizeof_bootboot_img 35496
extern unsigned char binary_bootboot_img[20143];
#define sizeof_bootboot_img 35384
extern unsigned char binary_bootboot_img[20069];
#define sizeof_bootboot_rv64 8192
extern unsigned char binary_bootboot_rv64[31];
#define sizeof_LICENCE_broadcom 1594

View file

@ -55,6 +55,8 @@ char *dict[NUMLANGS][NUMTEXTS + 1] = {
"not in the higher half top -1G",
"not %d bytes aligned",
"not page aligned",
"address collusion",
"invalid size",
"segment is bigger than 16M",
"unable to write",
"unable to locate kernel",
@ -101,6 +103,8 @@ char *dict[NUMLANGS][NUMTEXTS + 1] = {
"nincs a felső memória -1G tartományában",
"nem %d bájtra igazított",
"nincs laphatárra igazítva",
"címütközés",
"hibás méret",
"szegmens nagyobb, mint 16M",
"nem tudom írni",
"nem találom a kernelt benne",
@ -147,6 +151,8 @@ char *dict[NUMLANGS][NUMTEXTS + 1] = {
"nie znajduje się w \"higher half top -1G\"",
"brak wyrównania do %d bajtów",
"brak wyrównania do stron",
"zmowa adresowa",
"nieprawidłowy rozmiar",
"segment jest większy niż 16Mb",
"nie może zapisać",
"nie może znaleźć jądra",

View file

@ -47,6 +47,8 @@ enum {
ERR_BADADDR,
ERR_BADALIGN,
ERR_PAGEALIGN,
ERR_ADDRCOL,
ERR_BADSIZE,
ERR_BIGSEG,
ERR_WRITE,
ERR_LOCKRNL,

View file

@ -210,6 +210,7 @@ void parsekernel(int idx, unsigned char *data, int v)
pe_sym *ps;
uint32_t i, n = 0, bss = 0, strsz = 0, syment = 0, ma, fa;
uint64_t core_ptr = 0, core_size = 0, core_addr = 0, entrypoint = 0, mm_addr = 0, fb_addr = 0, bb_addr = 0, env_addr = 0;
uint64_t initstack = 0;
char *strtable, *name;
ehdr=(Elf64_Ehdr *)(data);
pehdr=(pe_hdr*)(data + ((mz_hdr*)(data))->peaddr);
@ -229,14 +230,22 @@ void parsekernel(int idx, unsigned char *data, int v)
n++;
core_size = phdr->p_filesz + (ehdr->e_type==3?0x4000:0);
bss = phdr->p_memsz - core_size;
core_ptr = phdr->p_offset;
core_addr = phdr->p_vaddr;
entrypoint = ehdr->e_entry;
/* these are just warnings, hopefully not a problem, but better to be fixed in the kernel linker script */
if(v) {
if(phdr->p_vaddr != phdr->p_paddr)
fprintf(stderr,"mkbootimg: phdr #%d p_vaddr %016" LL "x != p_paddr %016" LL "x ???\r\n",n,phdr->p_vaddr,phdr->p_paddr);
if(phdr->p_align > 4096)
fprintf(stderr,"mkbootimg: phdr #%d %s (p_align %" LL "d)\r\n",n,lang[ERR_PAGEALIGN],phdr->p_align);
}
break;
}
phdr=(Elf64_Phdr *)((uint8_t *)phdr+ehdr->e_phentsize);
}
if(n != 1) { fprintf(stderr,"mkbootimg: %s\r\n",lang[ERR_MORESEG]); exit(1); }
if(v) printf("Entry point: %08" LL "x ", entrypoint);
if(v) printf("Entry point: %016" LL "x ", entrypoint);
if(entrypoint < core_addr || entrypoint > core_addr+core_size)
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: %s\r\n",lang[ERR_BADENTRYP]); exit(1); }
if(ehdr->e_shoff > 0) {
@ -258,6 +267,7 @@ void parsekernel(int idx, unsigned char *data, int v)
if(!memcmp(strtable + s->st_name, "environment", 12)) env_addr = s->st_value;
if(!memcmp(strtable + s->st_name, "mmio", 4)) mm_addr = s->st_value;
if(!memcmp(strtable + s->st_name, "fb", 3)) fb_addr = s->st_value;
if(!memcmp(strtable + s->st_name, "initstack", 10)) initstack = s->st_value;
}
}
}
@ -275,7 +285,7 @@ void parsekernel(int idx, unsigned char *data, int v)
bss = pehdr->bss_size;
core_addr = (int64_t)pehdr->code_base;
entrypoint = (int64_t)pehdr->entry_point;
if(v) printf("Entry point: %08" LL "x ", entrypoint);
if(v) printf("Entry point: %016" LL "x ", entrypoint);
if(entrypoint < core_addr || entrypoint > core_addr+pehdr->text_size)
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: %s\r\n",lang[ERR_BADENTRYP]); exit(1); }
if(pehdr->sym_table > 0 && pehdr->numsym > 0) {
@ -287,6 +297,7 @@ void parsekernel(int idx, unsigned char *data, int v)
if(!memcmp(name, "environment", 12)) env_addr = (int64_t)ps->value;
if(!memcmp(name, "mmio", 4)) mm_addr = (int64_t)ps->value;
if(!memcmp(name, "fb", 3)) fb_addr = (int64_t)ps->value;
if(!memcmp(name, "initstack", 10)) initstack = (int64_t)ps->value;
i += ps->auxsyms;
}
}
@ -297,33 +308,60 @@ void parsekernel(int idx, unsigned char *data, int v)
}
if(v) printf("OK\r\n");
if(mm_addr) {
if(v) printf("mmio: %08" LL "x ", mm_addr);
if(v) printf("mmio: %016" LL "x ", mm_addr);
if(!ISHH(mm_addr)) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: mmio %s\r\n",lang[ERR_BADADDR]); exit(1); }
if(mm_addr & ma) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: mmio ");fprintf(stderr,lang[ERR_BADALIGN],ma+1);fprintf(stderr,"\r\n"); exit(1); }
if(v) printf("OK\r\n");
}
if(fb_addr) {
if(v) printf("fb: %08" LL "x ", fb_addr);
if(v) printf("fb: %016" LL "x ", fb_addr);
if(!ISHH(fb_addr)) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: fb %s\r\n",lang[ERR_BADALIGN]); exit(1); }
if(fb_addr & fa) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: fb ");fprintf(stderr,lang[ERR_BADALIGN],fa+1);fprintf(stderr,"\r\n"); exit(1); }
if((fb_addr >= mm_addr && fb_addr < mm_addr + 16*1024*1024) || (fb_addr + 16*1024*1024 > mm_addr && fb_addr + 16*1024*1024 <= mm_addr + 16*1024*1024))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: mmio/fb %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if(v) printf("OK\r\n");
}
if(bb_addr) {
if(v) printf("bootboot: %08" LL "x ", bb_addr);
if(v) printf("bootboot: %016" LL "x ", bb_addr);
if(!ISHH(bb_addr)) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: bootboot %s\r\n",lang[ERR_BADADDR]); exit(1); }
if(bb_addr & 4095) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: bootboot %s\r\n",lang[ERR_PAGEALIGN]); exit(1); }
if((bb_addr >= mm_addr && bb_addr < mm_addr + 16*1024*1024) || (bb_addr + 4096 > mm_addr && bb_addr + 4096 <= mm_addr + 16*1024*1024))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: mmio/bootboot %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if((bb_addr >= fb_addr && bb_addr < fb_addr + 16*1024*1024) || (bb_addr + 4096 > fb_addr && bb_addr + 4096 <= fb_addr + 16*1024*1024))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: fb/bootboot %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if(v) printf("OK\r\n");
}
if(env_addr) {
if(v) printf("environment: %08" LL "x ", env_addr);
if(v) printf("environment: %016" LL "x ", env_addr);
if(!ISHH(env_addr)) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: environment %s\r\n",lang[ERR_BADADDR]); exit(1); }
if(env_addr & 4095) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: environment %s\r\n",lang[ERR_PAGEALIGN]); exit(1); }
if((env_addr >= mm_addr && env_addr < mm_addr + 16*1024*1024) || (env_addr + 4096 > mm_addr && env_addr + 4096 <= mm_addr + 16*1024*1024))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: mmio/environment %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if((env_addr >= fb_addr && env_addr < fb_addr + 16*1024*1024) || (env_addr + 4096 > fb_addr && env_addr + 4096 <= fb_addr + 16*1024*1024))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: fb/enviroment %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if(env_addr == bb_addr)
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: bootboot/enviroment %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if(v) printf("OK\r\n");
}
if(v) printf("Load segment: %08" LL "x size %" LL "dK offs %" LL "x ", core_addr, (core_size + bss + 1024)/1024, core_ptr);
if(initstack) {
if(v) printf("initstack: %016" LL "x ", initstack);
if(initstack != 1024 && initstack != 2048 && initstack != 4096 && initstack != 8192 && initstack != 16384)
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: initstack %s\r\n",lang[ERR_BADSIZE]); exit(1); }
if(v) printf("OK\r\n");
}
if(v) printf("Load segment: %016" LL "x size %" LL "dK offs %" LL "x ", core_addr, (core_size + bss + 1024)/1024, core_ptr);
if(!ISHH(core_addr)) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: segment %s\r\n",lang[ERR_BADADDR]); exit(1); }
if(core_addr & 4095) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: segment %s\r\n",lang[ERR_PAGEALIGN]); exit(1); }
if(core_size + bss > 16 * 1024 * 1024) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: %s\r\n",lang[ERR_BIGSEG]); exit(1); }
if(core_size + bss > 16 * 1024 * 1024) { if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: segment %s\r\n",lang[ERR_BIGSEG]); exit(1); }
if((mm_addr >= core_addr && mm_addr < core_addr + core_size) || (mm_addr + 16*1024*1024 > core_addr && mm_addr + 16*1024*1024 <= core_addr + core_size))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: mmio/segment %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if((fb_addr >= core_addr && fb_addr < core_addr + core_size) || (fb_addr + 16*1024*1024 > core_addr && fb_addr + 16*1024*1024 <= core_addr + core_size))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: fb/segment %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
/* we check for the entrypoint as the lower boundary, because it's okay if the segment is at 0xfffffffe00000 */
if((bb_addr >= entrypoint && bb_addr < core_addr + core_size) || (bb_addr + 4096 > entrypoint && bb_addr + 4096 <= core_addr + core_size))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: bootboot/segment %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if((env_addr >= entrypoint && env_addr < core_addr + core_size) || (env_addr + 4096 > entrypoint && env_addr + 4096 <= core_addr + core_size))
{ if(v) { printf("invalid\r\n"); } fprintf(stderr,"mkbootimg: environment/segment %s\r\n",lang[ERR_ADDRCOL]); exit(1); }
if(v) {
if(!mm_addr && !fb_addr && !bb_addr && !env_addr)
printf("OK\r\nComplies with BOOTBOOT Protocol Level 1, %s\r\n",lang[STATADDR]);

View file

@ -30,8 +30,10 @@
ENTRY(_ada_kernel)
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
bootboot = 0xffffffffffe00000;
environment = 0xffffffffffe01000;
/* initstack = 1024; */
PHDRS
{
@ -39,9 +41,7 @@ PHDRS
}
SECTIONS
{
. = 0xffffffffffe00000;
bootboot = .; . += 4096;
environment = .; . += 4096;
. = 0xffffffffffe02000;
.text : {
KEEP(*(.text.boot)) *(.text .text.*) /* code */
*(.rodata .rodata.*) /* data */

View file

@ -28,8 +28,10 @@
*
*/
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
bootboot = 0xffffffffffe00000;
environment = 0xffffffffffe01000;
/* initstack = 1024; */
PHDRS
{
@ -37,9 +39,7 @@ PHDRS
}
SECTIONS
{
. = 0xffffffffffe00000;
bootboot = .; . += 4096;
environment = .; . += 4096;
. = 0xffffffffffe02000;
.text : {
KEEP(*(.text.boot)) *(.text .text.*) /* code */
*(.rodata .rodata.*) /* data */

View file

@ -30,8 +30,10 @@
ENTRY(main)
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
bootboot = 0xffffffffffe00000;
environment = 0xffffffffffe01000;
/* initstack = 1024; */
PHDRS
{
@ -39,9 +41,7 @@ PHDRS
}
SECTIONS
{
. = 0xffffffffffe00000;
bootboot = .; . += 4096;
environment = .; . += 4096;
. = 0xffffffffffe02000;
.text : {
KEEP(*(.text.boot)) *(.text .text.*) /* code */
*(.rodata .rodata.*) /* data */

View file

@ -32,8 +32,10 @@
ENTRY(go.kernel.go.kernel..init0)
/* you can't access these labels from Go, so make sure the constants match */
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
bootboot = 0xffffffffffe00000;
environment = 0xffffffffffe01000;
/* initstack = 1024; */
PHDRS
{
@ -41,9 +43,7 @@ PHDRS
}
SECTIONS
{
. = 0xffffffffffe00000;
bootboot = .; . += 4096;
environment = .; . += 4096;
. = 0xffffffffffe02000;
.text : {
KEEP(*(.text.boot)) *(.text .text.*) /* code */
*(.rodata .rodata.*) /* data */

View file

@ -28,8 +28,10 @@
*
*/
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
bootboot = 0xffffffffffe00000;
environment = 0xffffffffffe01000;
/* initstack = 1024; */
PHDRS
{
@ -37,9 +39,7 @@ PHDRS
}
SECTIONS
{
. = 0xffffffffffe00000;
bootboot = .; . += 4096;
environment = .; . += 4096;
. = 0xffffffffffe02000;
.text : {
KEEP(*(.text.boot)) *(.text .text.*) /* code */
*(.rodata .rodata.*) /* data */

View file

@ -28,7 +28,10 @@
*
*/
KERNEL_OFFSET = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
mmio = 0xfffffffff8000000; /* these are configurable for level 2 loaders */
fb = 0xfffffffffc000000;
bootboot = 0xffffffffffe00000;
environment = 0xffffffffffe01000;
initstack = 4096;
PHDRS
@ -37,12 +40,7 @@ PHDRS
}
SECTIONS
{
. = KERNEL_OFFSET;
mmio = .; . += 0x4000000;
fb = .; . += 0x3E00000;
bootboot = .; . += 4096;
environment = .; . += 4096;
. = 0xffffffffffe02000;
.text . + SIZEOF_HEADERS : AT(ADDR(.text) - KERNEL_OFFSET + SIZEOF_HEADERS) {
__text_start = .;
KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) /* code */