1*5a2a7371SAndrew Jones/* 2*5a2a7371SAndrew Jones * init::start will pass stacktop to setup() as the base of free memory. 3*5a2a7371SAndrew Jones * setup() will then move the FDT and initrd to that base before calling 4*5a2a7371SAndrew Jones * mem_init(). With those movements and this linker script, we'll end up 5*5a2a7371SAndrew Jones * having the following memory layout: 6*5a2a7371SAndrew Jones * 7*5a2a7371SAndrew Jones * +----------------------+ <-- top of physical memory 8*5a2a7371SAndrew Jones * | | 9*5a2a7371SAndrew Jones * ~ ~ 10*5a2a7371SAndrew Jones * | | 11*5a2a7371SAndrew Jones * +----------------------+ <-- top of initrd 12*5a2a7371SAndrew Jones * | | 13*5a2a7371SAndrew Jones * +----------------------+ <-- top of FDT 14*5a2a7371SAndrew Jones * | | 15*5a2a7371SAndrew Jones * +----------------------+ <-- top of cpu0's stack 16*5a2a7371SAndrew Jones * | | 17*5a2a7371SAndrew Jones * +----------------------+ <-- top of text/data/bss sections 18*5a2a7371SAndrew Jones * | | 19*5a2a7371SAndrew Jones * | | 20*5a2a7371SAndrew Jones * +----------------------+ <-- load address 21*5a2a7371SAndrew Jones * | | 22*5a2a7371SAndrew Jones * +----------------------+ <-- physical address 0x0 23*5a2a7371SAndrew Jones */ 245e61cba0SAndrew Jones 255e61cba0SAndrew JonesSECTIONS 265e61cba0SAndrew Jones{ 27a09aa3fbSAndrew Jones PROVIDE(_text = .); 285e61cba0SAndrew Jones .text : { *(.init) *(.text) *(.text.*) } 29b26ded10SAndrew Jones . = ALIGN(64K); 30f6416021SAndrew Jones PROVIDE(etext = .); 31f6416021SAndrew Jones 32f6416021SAndrew Jones PROVIDE(reloc_start = .); 33f6416021SAndrew Jones .rela.dyn : { *(.rela.dyn) } 34f6416021SAndrew Jones PROVIDE(reloc_end = .); 35f6416021SAndrew Jones .dynsym : { *(.dynsym) } 36f6416021SAndrew Jones .dynstr : { *(.dynstr) } 37f6416021SAndrew Jones .hash : { *(.hash) } 38f6416021SAndrew Jones .gnu.hash : { *(.gnu.hash) } 39f6416021SAndrew Jones .got : { *(.got) *(.got.plt) } 40f6416021SAndrew Jones .eh_frame : { *(.eh_frame) } 41f6416021SAndrew Jones 42f6416021SAndrew Jones .rodata : { *(.rodata*) } 43f6416021SAndrew Jones .data : { *(.data) } 44993c37beSAndrew Jones . = ALIGN(16); 45993c37beSAndrew Jones PROVIDE(bss = .); 465e61cba0SAndrew Jones .bss : { *(.bss) } 47993c37beSAndrew Jones . = ALIGN(16); 48993c37beSAndrew Jones PROVIDE(ebss = .); 49b26ded10SAndrew Jones . = ALIGN(64K); 50f6416021SAndrew Jones PROVIDE(edata = .); 51f6416021SAndrew Jones 521693644dSAndrew Jones /* 53ad14f089SAndrew Jones * stack depth is 16K for arm and PAGE_SIZE for arm64, see THREAD_SIZE 541693644dSAndrew Jones * sp must be 16 byte aligned for arm64, and 8 byte aligned for arm 551693644dSAndrew Jones * sp must always be strictly less than the true stacktop 561693644dSAndrew Jones */ 57f6416021SAndrew Jones . += 64K; 58f6416021SAndrew Jones . = ALIGN(64K); 59f6416021SAndrew Jones PROVIDE(stackptr = . - 16); 60f6416021SAndrew Jones PROVIDE(stacktop = .); 61f6416021SAndrew Jones 62f6416021SAndrew Jones /DISCARD/ : { 63f6416021SAndrew Jones *(.note*) 64f6416021SAndrew Jones *(.interp) 65f6416021SAndrew Jones *(.debug*) 66f6416021SAndrew Jones *(.comment) 67f6416021SAndrew Jones *(.dynamic) 68f6416021SAndrew Jones } 695e61cba0SAndrew Jones} 705e61cba0SAndrew Jones 715e61cba0SAndrew JonesENTRY(start) 72