xref: /linux/arch/powerpc/kernel/vmlinux.lds.S (revision 6794c78243bfda020ab184d6d578944f8e90d26c)
1c51e3a41SPaul Mackerras#ifdef CONFIG_PPC64
2e8222502SBenjamin Herrenschmidt#define PROVIDE32(x)	PROVIDE(__unused__##x)
3c51e3a41SPaul Mackerras#else
4e8222502SBenjamin Herrenschmidt#define PROVIDE32(x)	PROVIDE(x)
5c51e3a41SPaul Mackerras#endif
64846c5deSKumar Gala#include <asm/page.h>
714cf11afSPaul Mackerras#include <asm-generic/vmlinux.lds.h>
8bd67fcf9STony Breeds#include <asm/cache.h>
914cf11afSPaul Mackerras
10e19e4ab4SMichael EllermanENTRY(_stext)
11e19e4ab4SMichael Ellerman
12c69cccc9SSegher BoessenkoolPHDRS {
13c69cccc9SSegher Boessenkool	kernel PT_LOAD FLAGS(7); /* RWX */
14c69cccc9SSegher Boessenkool	notes PT_NOTE FLAGS(0);
15c69cccc9SSegher Boessenkool	dummy PT_NOTE FLAGS(0);
16c69cccc9SSegher Boessenkool
17c69cccc9SSegher Boessenkool	/* binutils < 2.18 has a bug that makes it misbehave when taking an
18c69cccc9SSegher Boessenkool	   ELF file with all segments at load address 0 as input.  This
19c69cccc9SSegher Boessenkool	   happens when running "strip" on vmlinux, because of the AT() magic
20c69cccc9SSegher Boessenkool	   in this linker script.  People using GCC >= 4.2 won't run into
21c69cccc9SSegher Boessenkool	   this problem, because the "build-id" support will put some data
22c69cccc9SSegher Boessenkool	   into the "notes" segment (at a non-zero load address).
23c69cccc9SSegher Boessenkool
24c69cccc9SSegher Boessenkool	   To work around this, we force some data into both the "dummy"
25c69cccc9SSegher Boessenkool	   segment and the kernel segment, so the dummy segment will get a
26c69cccc9SSegher Boessenkool	   non-zero load address.  It's not enough to always create the
27c69cccc9SSegher Boessenkool	   "notes" segment, since if nothing gets assigned to it, its load
28c69cccc9SSegher Boessenkool	   address will be zero.  */
29c69cccc9SSegher Boessenkool}
30c69cccc9SSegher Boessenkool
31cabb5587SStephen Rothwell#ifdef CONFIG_PPC64
32cabb5587SStephen RothwellOUTPUT_ARCH(powerpc:common64)
33cabb5587SStephen Rothwelljiffies = jiffies_64;
34cabb5587SStephen Rothwell#else
3514cf11afSPaul MackerrasOUTPUT_ARCH(powerpc:common)
3614cf11afSPaul Mackerrasjiffies = jiffies_64 + 4;
37cabb5587SStephen Rothwell#endif
3814cf11afSPaul MackerrasSECTIONS
3914cf11afSPaul Mackerras{
40cabb5587SStephen Rothwell	/* Sections to be discarded. */
41cabb5587SStephen Rothwell	/DISCARD/ : {
42cabb5587SStephen Rothwell	*(.exitcall.exit)
4301ba2bdcSSam Ravnborg	EXIT_DATA
44cabb5587SStephen Rothwell	}
45cabb5587SStephen Rothwell
46e19e4ab4SMichael Ellerman	. = KERNELBASE;
47cabb5587SStephen Rothwell
48e8222502SBenjamin Herrenschmidt/*
49e8222502SBenjamin Herrenschmidt * Text, read only data and other permanent read-only sections
50e8222502SBenjamin Herrenschmidt */
51e8222502SBenjamin Herrenschmidt
52e8222502SBenjamin Herrenschmidt	/* Text and gots */
53366234f6SKumar Gala	.text : AT(ADDR(.text) - LOAD_OFFSET) {
54748a7683SKumar Gala		ALIGN_FUNCTION();
55748a7683SKumar Gala		*(.text.head)
56fd593d12SEric W. Biederman		_text = .;
57fac23fe4SMichael Ellerman		*(.text .fixup .text.init.refok .exit.text.refok __ftr_alt_*)
5814cf11afSPaul Mackerras		SCHED_TEXT
5914cf11afSPaul Mackerras		LOCK_TEXT
60cabb5587SStephen Rothwell		KPROBES_TEXT
61*6794c782SSteven Rostedt		IRQENTRY_TEXT
62e8222502SBenjamin Herrenschmidt
63cabb5587SStephen Rothwell#ifdef CONFIG_PPC32
6414cf11afSPaul Mackerras		*(.got1)
6514cf11afSPaul Mackerras		__got2_start = .;
6614cf11afSPaul Mackerras		*(.got2)
6714cf11afSPaul Mackerras		__got2_end = .;
68e8222502SBenjamin Herrenschmidt#endif /* CONFIG_PPC32 */
69e8222502SBenjamin Herrenschmidt
70303996daSStephen Rothwell	} :kernel
71303996daSStephen Rothwell
72cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
73cabb5587SStephen Rothwell	_etext = .;
74e8222502SBenjamin Herrenschmidt	PROVIDE32 (etext = .);
7514cf11afSPaul Mackerras
76e8222502SBenjamin Herrenschmidt	/* Read-only data */
7714cf11afSPaul Mackerras	RODATA
7814cf11afSPaul Mackerras
79e8222502SBenjamin Herrenschmidt	/* Exception & bug tables */
80366234f6SKumar Gala	__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
8114cf11afSPaul Mackerras		__start___ex_table = .;
8214cf11afSPaul Mackerras		*(__ex_table)
8314cf11afSPaul Mackerras		__stop___ex_table = .;
8414cf11afSPaul Mackerras	}
8514cf11afSPaul Mackerras
86c69cccc9SSegher Boessenkool	NOTES :kernel :notes
87c69cccc9SSegher Boessenkool
88c69cccc9SSegher Boessenkool	/* The dummy segment contents for the bug workaround mentioned above
89c69cccc9SSegher Boessenkool	   near PHDRS.  */
9080c60bf9SSegher Boessenkool	.dummy : AT(ADDR(.dummy) - LOAD_OFFSET) {
91e16459c6SMilton Miller		LONG(0)
92e16459c6SMilton Miller		LONG(0)
93e16459c6SMilton Miller		LONG(0)
94c69cccc9SSegher Boessenkool	} :kernel :dummy
958fb775eeSRoland McGrath
96e8222502SBenjamin Herrenschmidt/*
97e8222502SBenjamin Herrenschmidt * Init sections discarded at runtime
98e8222502SBenjamin Herrenschmidt */
99cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
10014cf11afSPaul Mackerras	__init_begin = .;
101e8222502SBenjamin Herrenschmidt
102366234f6SKumar Gala	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
10314cf11afSPaul Mackerras		_sinittext = .;
10401ba2bdcSSam Ravnborg		INIT_TEXT
10514cf11afSPaul Mackerras		_einittext = .;
106c69cccc9SSegher Boessenkool	} :kernel
107e8222502SBenjamin Herrenschmidt
10814cf11afSPaul Mackerras	/* .exit.text is discarded at runtime, not link time,
109e8222502SBenjamin Herrenschmidt	 * to deal with references from __bug_table
110e8222502SBenjamin Herrenschmidt	 */
111366234f6SKumar Gala	.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
11201ba2bdcSSam Ravnborg		EXIT_TEXT
11301ba2bdcSSam Ravnborg	}
114e8222502SBenjamin Herrenschmidt
115366234f6SKumar Gala	.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
11601ba2bdcSSam Ravnborg		INIT_DATA
11714cf11afSPaul Mackerras		__vtop_table_begin = .;
11814cf11afSPaul Mackerras		*(.vtop_fixup);
11914cf11afSPaul Mackerras		__vtop_table_end = .;
12014cf11afSPaul Mackerras		__ptov_table_begin = .;
12114cf11afSPaul Mackerras		*(.ptov_fixup);
12214cf11afSPaul Mackerras		__ptov_table_end = .;
123c4e3ea25SStephen Rothwell#ifdef CONFIG_PPC_ISERIES
124c4e3ea25SStephen Rothwell		__dt_strings_start = .;
125c4e3ea25SStephen Rothwell		*(.dt_strings);
126c4e3ea25SStephen Rothwell		__dt_strings_end = .;
127c4e3ea25SStephen Rothwell#endif
12814cf11afSPaul Mackerras	}
129cabb5587SStephen Rothwell
13014cf11afSPaul Mackerras	. = ALIGN(16);
131366234f6SKumar Gala	.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
132cabb5587SStephen Rothwell		__setup_start = .;
133cabb5587SStephen Rothwell		*(.init.setup)
13414cf11afSPaul Mackerras		__setup_end = .;
135cabb5587SStephen Rothwell	}
136cabb5587SStephen Rothwell
137366234f6SKumar Gala	.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
138cabb5587SStephen Rothwell		__initcall_start = .;
13961ce1efeSAndrew Morton		INITCALLS
140cabb5587SStephen Rothwell		__initcall_end = .;
14114cf11afSPaul Mackerras		}
14214cf11afSPaul Mackerras
143366234f6SKumar Gala	.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
144cabb5587SStephen Rothwell		__con_initcall_start = .;
145cabb5587SStephen Rothwell		*(.con_initcall.init)
14614cf11afSPaul Mackerras		__con_initcall_end = .;
147cabb5587SStephen Rothwell	}
14814cf11afSPaul Mackerras
14914cf11afSPaul Mackerras	SECURITY_INIT
15014cf11afSPaul Mackerras
151e8222502SBenjamin Herrenschmidt	. = ALIGN(8);
152366234f6SKumar Gala	__ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
15314cf11afSPaul Mackerras		__start___ftr_fixup = .;
154e8222502SBenjamin Herrenschmidt		*(__ftr_fixup)
15514cf11afSPaul Mackerras		__stop___ftr_fixup = .;
156e8222502SBenjamin Herrenschmidt	}
1572d1b2027SKumar Gala	. = ALIGN(8);
1587c03d653SBenjamin Herrenschmidt	__mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
1597c03d653SBenjamin Herrenschmidt		__start___mmu_ftr_fixup = .;
1607c03d653SBenjamin Herrenschmidt		*(__mmu_ftr_fixup)
1617c03d653SBenjamin Herrenschmidt		__stop___mmu_ftr_fixup = .;
1627c03d653SBenjamin Herrenschmidt	}
1637c03d653SBenjamin Herrenschmidt	. = ALIGN(8);
1642d1b2027SKumar Gala	__lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
1652d1b2027SKumar Gala		__start___lwsync_fixup = .;
1662d1b2027SKumar Gala		*(__lwsync_fixup)
1672d1b2027SKumar Gala		__stop___lwsync_fixup = .;
1682d1b2027SKumar Gala	}
1693f639ee8SStephen Rothwell#ifdef CONFIG_PPC64
1703f639ee8SStephen Rothwell	. = ALIGN(8);
171366234f6SKumar Gala	__fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
1723f639ee8SStephen Rothwell		__start___fw_ftr_fixup = .;
1733f639ee8SStephen Rothwell		*(__fw_ftr_fixup)
1743f639ee8SStephen Rothwell		__stop___fw_ftr_fixup = .;
1753f639ee8SStephen Rothwell	}
1763f639ee8SStephen Rothwell#endif
17767d38229SJean-Paul Saman#ifdef CONFIG_BLK_DEV_INITRD
178cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
179366234f6SKumar Gala	.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
180cabb5587SStephen Rothwell		__initramfs_start = .;
181cabb5587SStephen Rothwell		*(.init.ramfs)
182cabb5587SStephen Rothwell		__initramfs_end = .;
183cabb5587SStephen Rothwell	}
18467d38229SJean-Paul Saman#endif
185b6e3590fSJeremy Fitzhardinge	. = ALIGN(PAGE_SIZE);
186366234f6SKumar Gala	.data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
187cabb5587SStephen Rothwell		__per_cpu_start = .;
188cabb5587SStephen Rothwell		*(.data.percpu)
1895fb7dc37SFenghua Yu		*(.data.percpu.shared_aligned)
19014cf11afSPaul Mackerras		__per_cpu_end = .;
191cabb5587SStephen Rothwell	}
19214cf11afSPaul Mackerras
193e8222502SBenjamin Herrenschmidt	. = ALIGN(8);
194366234f6SKumar Gala	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
195e8222502SBenjamin Herrenschmidt		__machine_desc_start = . ;
196e8222502SBenjamin Herrenschmidt		*(.machine.desc)
197e8222502SBenjamin Herrenschmidt		__machine_desc_end = . ;
198e8222502SBenjamin Herrenschmidt	}
1992a4b9c5aSPaul Mackerras#ifdef CONFIG_RELOCATABLE
200549e8152SPaul Mackerras	. = ALIGN(8);
201549e8152SPaul Mackerras	.dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET) { *(.dynsym) }
202549e8152SPaul Mackerras	.dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
203549e8152SPaul Mackerras	.dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
204549e8152SPaul Mackerras	{
205549e8152SPaul Mackerras		__dynamic_start = .;
206549e8152SPaul Mackerras		*(.dynamic)
207549e8152SPaul Mackerras	}
208549e8152SPaul Mackerras	.hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
209549e8152SPaul Mackerras	.interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
210549e8152SPaul Mackerras	.rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
211549e8152SPaul Mackerras	{
212549e8152SPaul Mackerras		__rela_dyn_start = .;
213549e8152SPaul Mackerras		*(.rela*)
214549e8152SPaul Mackerras	}
2152a4b9c5aSPaul Mackerras#endif
216e8222502SBenjamin Herrenschmidt
217cabb5587SStephen Rothwell	/* freed after init ends here */
218cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
219e8222502SBenjamin Herrenschmidt	__init_end = .;
220e8222502SBenjamin Herrenschmidt
221e8222502SBenjamin Herrenschmidt/*
222e8222502SBenjamin Herrenschmidt * And now the various read/write data
223e8222502SBenjamin Herrenschmidt */
224e8222502SBenjamin Herrenschmidt
225e8222502SBenjamin Herrenschmidt	. = ALIGN(PAGE_SIZE);
2264a288563SPaul Mackerras	_sdata = .;
227cabb5587SStephen Rothwell
228e8222502SBenjamin Herrenschmidt#ifdef CONFIG_PPC32
229366234f6SKumar Gala	.data : AT(ADDR(.data) - LOAD_OFFSET) {
230ca967258SSam Ravnborg		DATA_DATA
231e8222502SBenjamin Herrenschmidt		*(.sdata)
232e8222502SBenjamin Herrenschmidt		*(.got.plt) *(.got)
233cabb5587SStephen Rothwell	}
234e8222502SBenjamin Herrenschmidt#else
235366234f6SKumar Gala	.data : AT(ADDR(.data) - LOAD_OFFSET) {
2363ae0aa9fSMathieu Desnoyers		DATA_DATA
2373ae0aa9fSMathieu Desnoyers		*(.data.rel*)
2383ae0aa9fSMathieu Desnoyers		*(.toc1)
239cabb5587SStephen Rothwell		*(.branch_lt)
240cabb5587SStephen Rothwell	}
241cabb5587SStephen Rothwell
242366234f6SKumar Gala	.opd : AT(ADDR(.opd) - LOAD_OFFSET) {
243cabb5587SStephen Rothwell		*(.opd)
244cabb5587SStephen Rothwell	}
245cabb5587SStephen Rothwell
246366234f6SKumar Gala	.got : AT(ADDR(.got) - LOAD_OFFSET) {
247cabb5587SStephen Rothwell		__toc_start = .;
248cabb5587SStephen Rothwell		*(.got)
249cabb5587SStephen Rothwell		*(.toc)
250e8222502SBenjamin Herrenschmidt	}
251e8222502SBenjamin Herrenschmidt#endif
252e8222502SBenjamin Herrenschmidt
253cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
254cabb5587SStephen Rothwell	_edata  =  .;
255e8222502SBenjamin Herrenschmidt	PROVIDE32 (edata = .);
256e8222502SBenjamin Herrenschmidt
257e8222502SBenjamin Herrenschmidt	/* The initial task and kernel stack */
258e8222502SBenjamin Herrenschmidt#ifdef CONFIG_PPC32
259e8222502SBenjamin Herrenschmidt	. = ALIGN(8192);
260e8222502SBenjamin Herrenschmidt#else
261e8222502SBenjamin Herrenschmidt	. = ALIGN(16384);
262e8222502SBenjamin Herrenschmidt#endif
263366234f6SKumar Gala	.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
264e8222502SBenjamin Herrenschmidt		*(.data.init_task)
265cabb5587SStephen Rothwell	}
266cabb5587SStephen Rothwell
267cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
268366234f6SKumar Gala	.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
269e8222502SBenjamin Herrenschmidt		*(.data.page_aligned)
270cabb5587SStephen Rothwell	}
27114cf11afSPaul Mackerras
272366234f6SKumar Gala	.data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
273e8222502SBenjamin Herrenschmidt		*(.data.cacheline_aligned)
274e8222502SBenjamin Herrenschmidt	}
27514cf11afSPaul Mackerras
276bd67fcf9STony Breeds	. = ALIGN(L1_CACHE_BYTES);
277366234f6SKumar Gala	.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
278bd67fcf9STony Breeds		*(.data.read_mostly)
279bd67fcf9STony Breeds	}
280bd67fcf9STony Breeds
281e8222502SBenjamin Herrenschmidt	. = ALIGN(PAGE_SIZE);
282366234f6SKumar Gala	.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
283e8222502SBenjamin Herrenschmidt		__nosave_begin = .;
284e8222502SBenjamin Herrenschmidt		*(.data.nosave)
285e8222502SBenjamin Herrenschmidt		. = ALIGN(PAGE_SIZE);
286e8222502SBenjamin Herrenschmidt		__nosave_end = .;
287e8222502SBenjamin Herrenschmidt	}
28814cf11afSPaul Mackerras
289e8222502SBenjamin Herrenschmidt/*
290e8222502SBenjamin Herrenschmidt * And finally the bss
291e8222502SBenjamin Herrenschmidt */
2924a288563SPaul Mackerras
293366234f6SKumar Gala	.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
294cabb5587SStephen Rothwell		__bss_start = .;
29514cf11afSPaul Mackerras		*(.sbss) *(.scommon)
29614cf11afSPaul Mackerras		*(.dynbss)
29714cf11afSPaul Mackerras		*(.bss)
29814cf11afSPaul Mackerras		*(COMMON)
29914cf11afSPaul Mackerras		__bss_stop = .;
30014cf11afSPaul Mackerras	}
301cabb5587SStephen Rothwell
302cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
303cabb5587SStephen Rothwell	_end = . ;
304e8222502SBenjamin Herrenschmidt	PROVIDE32 (end = .);
30514cf11afSPaul Mackerras}
306