xref: /kvm-unit-tests/arm/flat.lds (revision 5a2a737123ec35985030e2151bb07a803d0390bd)
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