soc/intel: Remove blank lines before '}' and after '{'
[coreboot2.git] / src / lib / program.ld
blob178444733c3f9d09be1a797b3a39afa85caa1571
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <memlayout.h>
5 /* This file is included inside a SECTIONS block */
7 /* First we place the code and read only data (typically const declared).
8  * This could theoretically be placed in rom.
9  * The '.' in '.text . : {' is actually significant to prevent missing some
10  * SoC's entry points due to artificial alignment restrictions, see
11  * https://sourceware.org/binutils/docs/ld/Output-Section-Address.html
12  */
13 .text . : {
14         _program = .;
15         _text = .;
16 #if !(ENV_X86 && ENV_BOOTBLOCK)
17         *(.init._start);
18         *(.init);
19         *(.init.*);
20 #endif
21         *(.text._start);
22         *(.text.stage_entry);
23         KEEP(*(.metadata_hash_anchor));
24         *(.text);
25         *(.text.*);
27 #if ENV_HAS_CBMEM
28         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
29         _cbmem_init_hooks = .;
30         KEEP(*(.rodata.cbmem_init_hooks_early));
31         KEEP(*(.rodata.cbmem_init_hooks));
32         _ecbmem_init_hooks = .;
33         RECORD_SIZE(cbmem_init_hooks)
34 #endif
36         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
37         _rsbe_init_begin = .;
38         KEEP(*(.rsbe_init));
39         _ersbe_init_begin = .;
40         RECORD_SIZE(rsbe_init_begin)
42 #if ENV_RAMSTAGE
43         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
44         _pci_drivers = .;
45         KEEP(*(.rodata.pci_driver));
46         _epci_drivers = .;
47         RECORD_SIZE(pci_drivers)
48         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
49         _cpu_drivers = .;
50         KEEP(*(.rodata.cpu_driver));
51         _ecpu_drivers = .;
52         RECORD_SIZE(cpu_drivers)
53 #endif
55         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
56         *(.rodata);
57         *(.rodata.*);
58         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
59         _etext = .;
60         RECORD_SIZE(text)
61 } : to_load
63 #if ENV_RAMSTAGE && (CONFIG(COVERAGE) || CONFIG(ASAN_IN_RAMSTAGE))
64 .ctors . : {
65         . = ALIGN(0x100);
66         __CTOR_LIST__ = .;
67         KEEP(*(.ctors));
68         LONG(0);
69         LONG(0);
70         __CTOR_END__ = .;
71 } : to_load
72 #endif
74 /* Include data, bss, and heap in that order. Not defined for all stages. */
75 #if !ENV_SEPARATE_DATA_AND_BSS
76 .data . : {
77         . = ALIGN(ARCH_CACHELINE_ALIGN_SIZE);
78         _data = .;
81  * The postcar phase uses a stack value that is located in the relocatable
82  * module section. While the postcar stage could be linked like smm and
83  * other rmodules the postcar stage needs similar semantics of the more
84  * traditional stages in the coreboot infrastructure. Therefore it's easier
85  * to specialize this case.
86  */
87 #if ENV_RMODULE || ENV_POSTCAR
88         _rmodule_params = .;
89         KEEP(*(.module_parameters));
90         _ermodule_params = .;
91         RECORD_SIZE(rmodule_params)
92 #endif
94         *(.data);
95         *(.data.*);
96         *(.sdata);
97         *(.sdata.*);
99 #if ENV_ROMSTAGE_OR_BEFORE
100         PROVIDE(_preram_cbmem_console = .);
101         PROVIDE(_epreram_cbmem_console = _preram_cbmem_console);
102         PROVIDE(_preram_cbmem_console_size = ABSOLUTE(0));
103 #elif ENV_RAMSTAGE
104         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
105         _bs_init_begin = .;
106         KEEP(*(.bs_init));
107         LONG(0);
108         LONG(0);
109         _ebs_init_begin = .;
110         RECORD_SIZE(bs_init_begin)
111 #endif
113         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
114         _edata = .;
115         RECORD_SIZE(data)
116 } : to_load
117 #endif
119 #if !ENV_SEPARATE_DATA_AND_BSS
120 .bss . (NOLOAD) : {
121         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
122         _bss = .;
123         *(.bss)
124         *(.bss.*)
125         *(.sbss)
126         *(.sbss.*)
127         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
128         _ebss = .;
129         RECORD_SIZE(bss)
130 } : to_load
131 #endif
133 #if ENV_HAS_HEAP_SECTION
134 .heap . (NOLOAD) : {
135         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
136         _heap = .;
137         . += CONFIG_HEAP_SIZE;
138         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
139         _eheap = .;
140         RECORD_SIZE(heap)
141 } : to_load
142 #endif
144 #if ENV_RAMSTAGE && CONFIG(ASAN_IN_RAMSTAGE)
145         _shadow_size = (_eheap - _data) >> 3;
146         REGION(asan_shadow, ., _shadow_size, ARCH_POINTER_ALIGN_SIZE)
147 #endif
149 _eprogram = .;
150 RECORD_SIZE(program)
152 /* The stage cache drops CONFIG_HEAP_SIZE bytes from the end of the in-memory
153    image of the ramstage, so ensure that when moving that many bytes backwards
154    from the program end, we're in the heap (or later), in some region that
155    doesn't contain initialized code or data. */
156 #if ENV_RAMSTAGE
157 _bogus = ASSERT(_eprogram - CONFIG_HEAP_SIZE >= _heap,
158         "HEAP_SIZE and heap misaligned");
159 #endif
161 /* Discard the sections we don't need/want */
163 zeroptr = 0;
165 /DISCARD/ : {
166         *(.comment)
167         *(.comment.*)
168         *(.note)
169         *(.note.*)
170         *(.eh_frame);