xref: /linux/arch/powerpc/kernel/vmlinux.lds.S (revision 7f3edee81fbd49114c28057512906f169caa0bed)
1#ifdef CONFIG_PPC64
2#include <asm/page.h>
3#define PROVIDE32(x)	PROVIDE(__unused__##x)
4#else
5#define PAGE_SIZE	4096
6#define KERNELBASE	CONFIG_KERNEL_START
7#define PROVIDE32(x)	PROVIDE(x)
8#endif
9#include <asm-generic/vmlinux.lds.h>
10#include <asm/cache.h>
11
12ENTRY(_stext)
13
14#ifdef CONFIG_PPC64
15OUTPUT_ARCH(powerpc:common64)
16jiffies = jiffies_64;
17#else
18OUTPUT_ARCH(powerpc:common)
19jiffies = jiffies_64 + 4;
20#endif
21SECTIONS
22{
23	/* Sections to be discarded. */
24	/DISCARD/ : {
25	*(.exitcall.exit)
26	*(.exit.data)
27	}
28
29	. = KERNELBASE;
30
31/*
32 * Text, read only data and other permanent read-only sections
33 */
34
35	/* Text and gots */
36	.text : {
37		ALIGN_FUNCTION();
38		*(.text.head)
39		_text = .;
40		*(.text .fixup .text.init.refok .exit.text.refok)
41		SCHED_TEXT
42		LOCK_TEXT
43		KPROBES_TEXT
44
45#ifdef CONFIG_PPC32
46		*(.got1)
47		__got2_start = .;
48		*(.got2)
49		__got2_end = .;
50#endif /* CONFIG_PPC32 */
51
52		. = ALIGN(PAGE_SIZE);
53		_etext = .;
54		PROVIDE32 (etext = .);
55	}
56
57	/* Read-only data */
58	RODATA
59
60	/* Exception & bug tables */
61	__ex_table : {
62		__start___ex_table = .;
63		*(__ex_table)
64		__stop___ex_table = .;
65	}
66
67	NOTES
68
69	BUG_TABLE
70
71/*
72 * Init sections discarded at runtime
73 */
74	. = ALIGN(PAGE_SIZE);
75	__init_begin = .;
76
77	.init.text : {
78		_sinittext = .;
79		*(.init.text)
80		_einittext = .;
81	}
82
83	/* .exit.text is discarded at runtime, not link time,
84	 * to deal with references from __bug_table
85	 */
86	.exit.text : { *(.exit.text) }
87
88	.init.data : {
89		*(.init.data);
90		__vtop_table_begin = .;
91		*(.vtop_fixup);
92		__vtop_table_end = .;
93		__ptov_table_begin = .;
94		*(.ptov_fixup);
95		__ptov_table_end = .;
96#ifdef CONFIG_PPC_ISERIES
97		__dt_strings_start = .;
98		*(.dt_strings);
99		__dt_strings_end = .;
100#endif
101	}
102
103	. = ALIGN(16);
104	.init.setup : {
105		__setup_start = .;
106		*(.init.setup)
107		__setup_end = .;
108	}
109
110	.initcall.init : {
111		__initcall_start = .;
112		INITCALLS
113		__initcall_end = .;
114		}
115
116	.con_initcall.init : {
117		__con_initcall_start = .;
118		*(.con_initcall.init)
119		__con_initcall_end = .;
120	}
121
122	SECURITY_INIT
123
124	. = ALIGN(8);
125	__ftr_fixup : {
126		__start___ftr_fixup = .;
127		*(__ftr_fixup)
128		__stop___ftr_fixup = .;
129	}
130#ifdef CONFIG_PPC64
131	. = ALIGN(8);
132	__fw_ftr_fixup : {
133		__start___fw_ftr_fixup = .;
134		*(__fw_ftr_fixup)
135		__stop___fw_ftr_fixup = .;
136	}
137#endif
138#ifdef CONFIG_BLK_DEV_INITRD
139	. = ALIGN(PAGE_SIZE);
140	.init.ramfs : {
141		__initramfs_start = .;
142		*(.init.ramfs)
143		__initramfs_end = .;
144	}
145#endif
146	. = ALIGN(PAGE_SIZE);
147	.data.percpu : {
148		__per_cpu_start = .;
149		*(.data.percpu)
150		*(.data.percpu.shared_aligned)
151		__per_cpu_end = .;
152	}
153
154	. = ALIGN(8);
155	.machine.desc : {
156		__machine_desc_start = . ;
157		*(.machine.desc)
158		__machine_desc_end = . ;
159	}
160
161	/* freed after init ends here */
162	. = ALIGN(PAGE_SIZE);
163	__init_end = .;
164
165/*
166 * And now the various read/write data
167 */
168
169	. = ALIGN(PAGE_SIZE);
170	_sdata = .;
171
172#ifdef CONFIG_PPC32
173	.data    :
174	{
175		DATA_DATA
176		*(.sdata)
177		*(.got.plt) *(.got)
178	}
179#else
180	.data : {
181		DATA_DATA
182		*(.data.rel*)
183		*(.toc1)
184		*(.branch_lt)
185	}
186
187	.opd : {
188		*(.opd)
189	}
190
191	.got : {
192		__toc_start = .;
193		*(.got)
194		*(.toc)
195	}
196#endif
197
198	. = ALIGN(PAGE_SIZE);
199	_edata  =  .;
200	PROVIDE32 (edata = .);
201
202	/* The initial task and kernel stack */
203#ifdef CONFIG_PPC32
204	. = ALIGN(8192);
205#else
206	. = ALIGN(16384);
207#endif
208	.data.init_task : {
209		*(.data.init_task)
210	}
211
212	. = ALIGN(PAGE_SIZE);
213	.data.page_aligned : {
214		*(.data.page_aligned)
215	}
216
217	.data.cacheline_aligned : {
218		*(.data.cacheline_aligned)
219	}
220
221	. = ALIGN(L1_CACHE_BYTES);
222	.data.read_mostly : {
223		*(.data.read_mostly)
224	}
225
226	. = ALIGN(PAGE_SIZE);
227	__data_nosave : {
228		__nosave_begin = .;
229		*(.data.nosave)
230		. = ALIGN(PAGE_SIZE);
231		__nosave_end = .;
232	}
233
234/*
235 * And finally the bss
236 */
237
238	.bss : {
239		__bss_start = .;
240		*(.sbss) *(.scommon)
241		*(.dynbss)
242		*(.bss)
243		*(COMMON)
244		__bss_stop = .;
245	}
246
247	. = ALIGN(PAGE_SIZE);
248	_end = . ;
249	PROVIDE32 (end = .);
250}
251