powerpc/64: Tool to check head sections location sanity
[linux-2.6-block.git] / arch / powerpc / kernel / vmlinux.lds.S
CommitLineData
c51e3a41 1#ifdef CONFIG_PPC64
e8222502 2#define PROVIDE32(x) PROVIDE(__unused__##x)
c51e3a41 3#else
e8222502 4#define PROVIDE32(x) PROVIDE(x)
c51e3a41 5#endif
4846c5de 6#include <asm/page.h>
14cf11af 7#include <asm-generic/vmlinux.lds.h>
bd67fcf9 8#include <asm/cache.h>
62bef288 9#include <asm/thread_info.h>
14cf11af 10
e19e4ab4
ME
11ENTRY(_stext)
12
c69cccc9
SB
13PHDRS {
14 kernel PT_LOAD FLAGS(7); /* RWX */
15 notes PT_NOTE FLAGS(0);
16 dummy PT_NOTE FLAGS(0);
17
18 /* binutils < 2.18 has a bug that makes it misbehave when taking an
19 ELF file with all segments at load address 0 as input. This
20 happens when running "strip" on vmlinux, because of the AT() magic
21 in this linker script. People using GCC >= 4.2 won't run into
22 this problem, because the "build-id" support will put some data
23 into the "notes" segment (at a non-zero load address).
24
25 To work around this, we force some data into both the "dummy"
26 segment and the kernel segment, so the dummy segment will get a
27 non-zero load address. It's not enough to always create the
28 "notes" segment, since if nothing gets assigned to it, its load
29 address will be zero. */
30}
31
cabb5587
SR
32#ifdef CONFIG_PPC64
33OUTPUT_ARCH(powerpc:common64)
34jiffies = jiffies_64;
35#else
14cf11af
PM
36OUTPUT_ARCH(powerpc:common)
37jiffies = jiffies_64 + 4;
cabb5587 38#endif
14cf11af
PM
39SECTIONS
40{
e8222502 41 . = KERNELBASE;
14cf11af 42
e8222502
BH
43/*
44 * Text, read only data and other permanent read-only sections
45 */
46
57f26649
NP
47 _text = .;
48 _stext = .;
49
50 /*
51 * Head text.
52 * This needs to be in its own output section to avoid ld placing
53 * branch trampoline stubs randomly throughout the fixed sections,
54 * which it will do (even if the branch comes from another section)
55 * in order to optimize stub generation.
56 */
57 .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {
58#ifdef CONFIG_PPC64
59 KEEP(*(.head.text.first_256B));
60#ifdef CONFIG_PPC_BOOK3E
57f26649
NP
61#else
62 KEEP(*(.head.text.real_vectors));
63 *(.head.text.real_trampolines);
64 KEEP(*(.head.text.virt_vectors));
65 *(.head.text.virt_trampolines);
66# if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
67 KEEP(*(.head.data.fwnmi_page));
57f26649
NP
68# endif
69#endif
57f26649
NP
70#else /* !CONFIG_PPC64 */
71 HEAD_TEXT
72#endif
73 } :kernel
74
7aa5b018
NR
75 __head_end = .;
76
dadc4a1b
NP
77#ifdef CONFIG_PPC64
78 /*
79 * BLOCK(0) overrides the default output section alignment because
80 * this needs to start right after .head.text in order for fixed
81 * section placement to work.
82 */
83 .text BLOCK(0) : AT(ADDR(.text) - LOAD_OFFSET) {
951eedeb
NP
84#ifdef CONFIG_LD_HEAD_STUB_CATCH
85 *(.linker_stub_catch);
86 . = . ;
87#endif
88
dadc4a1b 89#else
366234f6 90 .text : AT(ADDR(.text) - LOAD_OFFSET) {
748a7683 91 ALIGN_FUNCTION();
dadc4a1b 92#endif
13beadd9
TA
93 /* careful! __ftr_alt_* sections need to be close to .text */
94 *(.text .fixup __ftr_alt_* .ref.text)
e8222502 95 SCHED_TEXT
6727ad9e 96 CPUIDLE_TEXT
e8222502
BH
97 LOCK_TEXT
98 KPROBES_TEXT
6794c782 99 IRQENTRY_TEXT
be7635e7 100 SOFTIRQENTRY_TEXT
e8c68825
NP
101 /*
102 * -Os builds call FP save/restore functions. The powerpc64
103 * linker generates those on demand in the .sfpr section.
104 * .sfpr gets placed at the beginning of a group of input
105 * sections, which can break start-of-text offset if it is
106 * included with the main text sections, so put it by itself.
107 */
108 *(.sfpr);
7de3b27b
ME
109 MEM_KEEP(init.text)
110 MEM_KEEP(exit.text)
14cf11af 111
e8222502
BH
112#ifdef CONFIG_PPC32
113 *(.got1)
114 __got2_start = .;
115 *(.got2)
116 __got2_end = .;
117#endif /* CONFIG_PPC32 */
118
c69cccc9 119 } :kernel
e8222502 120
303996da
SR
121 . = ALIGN(PAGE_SIZE);
122 _etext = .;
123 PROVIDE32 (etext = .);
124
e8222502
BH
125 /* Read-only data */
126 RODATA
127
62bef288 128 EXCEPTION_TABLE(0)
14cf11af 129
c69cccc9
SB
130 NOTES :kernel :notes
131
132 /* The dummy segment contents for the bug workaround mentioned above
133 near PHDRS. */
80c60bf9 134 .dummy : AT(ADDR(.dummy) - LOAD_OFFSET) {
e16459c6
MM
135 LONG(0)
136 LONG(0)
137 LONG(0)
c69cccc9 138 } :kernel :dummy
8fb775ee 139
e8222502
BH
140/*
141 * Init sections discarded at runtime
142 */
143 . = ALIGN(PAGE_SIZE);
144 __init_begin = .;
62bef288 145 INIT_TEXT_SECTION(PAGE_SIZE) :kernel
e8222502
BH
146
147 /* .exit.text is discarded at runtime, not link time,
148 * to deal with references from __bug_table
149 */
366234f6 150 .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
01ba2bdc
SR
151 EXIT_TEXT
152 }
e8222502 153
366234f6 154 .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
01ba2bdc 155 INIT_DATA
e8222502
BH
156 __vtop_table_begin = .;
157 *(.vtop_fixup);
158 __vtop_table_end = .;
159 __ptov_table_begin = .;
160 *(.ptov_fixup);
161 __ptov_table_end = .;
162 }
163
366234f6 164 .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
62bef288 165 INIT_SETUP(16)
e8222502
BH
166 }
167
366234f6 168 .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
62bef288
TA
169 INIT_CALLS
170 }
e8222502 171
366234f6 172 .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
62bef288 173 CON_INITCALL
e8222502
BH
174 }
175
176 SECURITY_INIT
177
178 . = ALIGN(8);
366234f6 179 __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
cabb5587
SR
180 __start___ftr_fixup = .;
181 *(__ftr_fixup)
182 __stop___ftr_fixup = .;
183 }
2d1b2027 184 . = ALIGN(8);
7c03d653
BH
185 __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
186 __start___mmu_ftr_fixup = .;
187 *(__mmu_ftr_fixup)
188 __stop___mmu_ftr_fixup = .;
189 }
190 . = ALIGN(8);
2d1b2027
KG
191 __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
192 __start___lwsync_fixup = .;
193 *(__lwsync_fixup)
194 __stop___lwsync_fixup = .;
195 }
3f639ee8
SR
196#ifdef CONFIG_PPC64
197 . = ALIGN(8);
366234f6 198 __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
3f639ee8
SR
199 __start___fw_ftr_fixup = .;
200 *(__fw_ftr_fixup)
201 __stop___fw_ftr_fixup = .;
202 }
203#endif
366234f6 204 .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
62bef288 205 INIT_RAM_FS
e8222502 206 }
62bef288 207
0415b00d 208 PERCPU_SECTION(L1_CACHE_BYTES)
14cf11af 209
e8222502 210 . = ALIGN(8);
366234f6 211 .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
e8222502
BH
212 __machine_desc_start = . ;
213 *(.machine.desc)
214 __machine_desc_end = . ;
215 }
2a4b9c5a 216#ifdef CONFIG_RELOCATABLE
549e8152 217 . = ALIGN(8);
9c5f7d39
SP
218 .dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET)
219 {
27d11496 220#ifdef CONFIG_PPC32
9c5f7d39
SP
221 __dynamic_symtab = .;
222#endif
223 *(.dynsym)
224 }
549e8152
PM
225 .dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
226 .dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
227 {
228 __dynamic_start = .;
229 *(.dynamic)
230 }
231 .hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
232 .interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
233 .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
234 {
235 __rela_dyn_start = .;
236 *(.rela*)
237 }
2a4b9c5a 238#endif
4c812318
SR
239 /* .exit.data is discarded at runtime, not link time,
240 * to deal with references from .exit.text
241 */
242 .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {
243 EXIT_DATA
244 }
e8222502
BH
245
246 /* freed after init ends here */
247 . = ALIGN(PAGE_SIZE);
248 __init_end = .;
249
250/*
251 * And now the various read/write data
252 */
253
254 . = ALIGN(PAGE_SIZE);
255 _sdata = .;
14cf11af 256
cabb5587 257#ifdef CONFIG_PPC32
366234f6 258 .data : AT(ADDR(.data) - LOAD_OFFSET) {
ca967258 259 DATA_DATA
e8222502
BH
260 *(.sdata)
261 *(.got.plt) *(.got)
262 }
cabb5587 263#else
366234f6 264 .data : AT(ADDR(.data) - LOAD_OFFSET) {
3ae0aa9f
MD
265 DATA_DATA
266 *(.data.rel*)
267 *(.toc1)
e8222502
BH
268 *(.branch_lt)
269 }
14cf11af 270
366234f6 271 .opd : AT(ADDR(.opd) - LOAD_OFFSET) {
e8222502
BH
272 *(.opd)
273 }
274
5e95235c 275 . = ALIGN(256);
366234f6 276 .got : AT(ADDR(.got) - LOAD_OFFSET) {
e8222502 277 __toc_start = .;
5ac47f7a
AB
278#ifndef CONFIG_RELOCATABLE
279 __prom_init_toc_start = .;
280 arch/powerpc/kernel/prom_init.o*(.toc .got)
281 __prom_init_toc_end = .;
282#endif
e8222502
BH
283 *(.got)
284 *(.toc)
285 }
cabb5587 286#endif
14cf11af 287
e8222502 288 /* The initial task and kernel stack */
2af7687f 289 INIT_TASK_DATA_SECTION(THREAD_SIZE)
14cf11af 290
75b13483 291 .data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
62bef288 292 PAGE_ALIGNED_DATA(PAGE_SIZE)
e8222502 293 }
14cf11af 294
4af57b78 295 .data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
62bef288 296 CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
e8222502 297 }
14cf11af 298
54cb27a7 299 .data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
62bef288 300 READ_MOSTLY_DATA(L1_CACHE_BYTES)
bd67fcf9
TB
301 }
302
5be2a213 303 . = ALIGN(PAGE_SIZE);
366234f6 304 .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
62bef288 305 NOSAVE_DATA
e8222502 306 }
4a288563 307
b5effd38
PZ
308 BUG_TABLE
309
903444e4
ME
310 . = ALIGN(PAGE_SIZE);
311 _edata = .;
312 PROVIDE32 (edata = .);
313
e8222502
BH
314/*
315 * And finally the bss
316 */
317
62bef288 318 BSS_SECTION(0, 0, 0)
14cf11af 319
e8222502
BH
320 . = ALIGN(PAGE_SIZE);
321 _end = . ;
322 PROVIDE32 (end = .);
023bf6f1
TH
323
324 /* Sections to be discarded. */
325 DISCARDS
14cf11af 326}