1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifdef CONFIG_PPC64
3 #define PROVIDE32(x)	PROVIDE(__unused__##x)
4 #else
5 #define PROVIDE32(x)	PROVIDE(x)
6 #endif
7 
8 #define BSS_FIRST_SECTIONS *(.bss.prominit)
9 #define EMITS_PT_NOTE
10 #define RO_EXCEPTION_TABLE_ALIGN	0
11 #define RUNTIME_DISCARD_EXIT
12 
13 #define SOFT_MASK_TABLE(align)						\
14 	. = ALIGN(align);						\
15 	__soft_mask_table : AT(ADDR(__soft_mask_table) - LOAD_OFFSET) {	\
16 		__start___soft_mask_table = .;				\
17 		KEEP(*(__soft_mask_table))				\
18 		__stop___soft_mask_table = .;				\
19 	}
20 
21 #define RESTART_TABLE(align)						\
22 	. = ALIGN(align);						\
23 	__restart_table : AT(ADDR(__restart_table) - LOAD_OFFSET) {	\
24 		__start___restart_table = .;				\
25 		KEEP(*(__restart_table))				\
26 		__stop___restart_table = .;				\
27 	}
28 
29 #include <asm/page.h>
30 #include <asm-generic/vmlinux.lds.h>
31 #include <asm/cache.h>
32 #include <asm/thread_info.h>
33 
34 #define STRICT_ALIGN_SIZE	(1 << CONFIG_DATA_SHIFT)
35 
36 #if STRICT_ALIGN_SIZE < PAGE_SIZE
37 #error "CONFIG_DATA_SHIFT must be >= PAGE_SHIFT"
38 #endif
39 
40 ENTRY(_stext)
41 
42 PHDRS {
43 	text PT_LOAD FLAGS(7); /* RWX */
44 	note PT_NOTE FLAGS(0);
45 }
46 
47 #ifdef CONFIG_PPC64
48 OUTPUT_ARCH(powerpc:common64)
49 jiffies = jiffies_64;
50 #else
51 OUTPUT_ARCH(powerpc:common)
52 jiffies = jiffies_64 + 4;
53 #endif
54 SECTIONS
55 {
56 	. = KERNELBASE;
57 
58 /*
59  * Text, read only data and other permanent read-only sections
60  */
61 
62 	_text = .;
63 	_stext = .;
64 
65 	/*
66 	 * Head text.
67 	 * This needs to be in its own output section to avoid ld placing
68 	 * branch trampoline stubs randomly throughout the fixed sections,
69 	 * which it will do (even if the branch comes from another section)
70 	 * in order to optimize stub generation.
71 	 */
72 	.head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {
73 #ifdef CONFIG_PPC64
74 		KEEP(*(.head.text.first_256B));
75 #ifdef CONFIG_PPC_BOOK3E_64
76 #else
77 		KEEP(*(.head.text.real_vectors));
78 		*(.head.text.real_trampolines);
79 		KEEP(*(.head.text.virt_vectors));
80 		*(.head.text.virt_trampolines);
81 # if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
82 		KEEP(*(.head.data.fwnmi_page));
83 # endif
84 #endif
85 #else /* !CONFIG_PPC64 */
86 		HEAD_TEXT
87 #endif
88 	} :text
89 
90 	__head_end = .;
91 
92 #ifdef CONFIG_PPC64
93 	/*
94 	 * ALIGN(0) overrides the default output section alignment because
95 	 * this needs to start right after .head.text in order for fixed
96 	 * section placement to work.
97 	 */
98 	.text ALIGN(0) : AT(ADDR(.text) - LOAD_OFFSET) {
99 #ifdef CONFIG_LD_HEAD_STUB_CATCH
100 		KEEP(*(.linker_stub_catch));
101 		. = . ;
102 #endif
103 
104 #else
105 	.text : AT(ADDR(.text) - LOAD_OFFSET) {
106 		ALIGN_FUNCTION();
107 #endif
108 		/* careful! __ftr_alt_* sections need to be close to .text */
109 		*(.text.hot .text.hot.* TEXT_MAIN .text.fixup .text.unlikely .text.unlikely.* .fixup __ftr_alt_* .ref.text);
110 		*(.tramp.ftrace.text);
111 		NOINSTR_TEXT
112 		SCHED_TEXT
113 		LOCK_TEXT
114 		KPROBES_TEXT
115 		IRQENTRY_TEXT
116 		SOFTIRQENTRY_TEXT
117 		/*
118 		 * -Os builds call FP save/restore functions. The powerpc64
119 		 * linker generates those on demand in the .sfpr section.
120 		 * .sfpr gets placed at the beginning of a group of input
121 		 * sections, which can break start-of-text offset if it is
122 		 * included with the main text sections, so put it by itself.
123 		 */
124 		*(.sfpr);
125 		*(.text.asan.* .text.tsan.*)
126 	} :text
127 
128 	. = ALIGN(PAGE_SIZE);
129 	_etext = .;
130 	PROVIDE32 (etext = .);
131 
132 	/* Read-only data */
133 	RO_DATA(PAGE_SIZE)
134 
135 #ifdef CONFIG_PPC32
136 	.sdata2 : AT(ADDR(.sdata2) - LOAD_OFFSET) {
137 		*(.sdata2)
138 	}
139 #endif
140 
141 	.data.rel.ro : AT(ADDR(.data.rel.ro) - LOAD_OFFSET) {
142 		*(.data.rel.ro .data.rel.ro.*)
143 	}
144 
145 	.branch_lt : AT(ADDR(.branch_lt) - LOAD_OFFSET) {
146 		*(.branch_lt)
147 	}
148 
149 #ifdef CONFIG_PPC32
150 	.got1 : AT(ADDR(.got1) - LOAD_OFFSET) {
151 		*(.got1)
152 	}
153 	.got2 : AT(ADDR(.got2) - LOAD_OFFSET) {
154 		__got2_start = .;
155 		*(.got2)
156 		__got2_end = .;
157 	}
158 	.got : AT(ADDR(.got) - LOAD_OFFSET) {
159 		*(.got)
160 		*(.got.plt)
161 	}
162 	.plt : AT(ADDR(.plt) - LOAD_OFFSET) {
163 		/* XXX: is .plt (and .got.plt) required? */
164 		*(.plt)
165 	}
166 
167 #else /* CONFIG_PPC32 */
168 #ifndef CONFIG_PPC_KERNEL_PCREL
169 	.toc1 : AT(ADDR(.toc1) - LOAD_OFFSET) {
170 		*(.toc1)
171 	}
172 #endif
173 
174 	.got : AT(ADDR(.got) - LOAD_OFFSET) ALIGN(256) {
175 #ifdef CONFIG_PPC_KERNEL_PCREL
176 		*(.got)
177 #else
178 		*(.got .toc)
179 #endif
180 	}
181 
182 	SOFT_MASK_TABLE(8)
183 	RESTART_TABLE(8)
184 
185 #ifdef CONFIG_PPC64_ELF_ABI_V1
186 	.opd : AT(ADDR(.opd) - LOAD_OFFSET) {
187 		__start_opd = .;
188 		KEEP(*(.opd))
189 		__end_opd = .;
190 	}
191 #endif
192 
193 	. = ALIGN(8);
194 	__stf_entry_barrier_fixup : AT(ADDR(__stf_entry_barrier_fixup) - LOAD_OFFSET) {
195 		__start___stf_entry_barrier_fixup = .;
196 		*(__stf_entry_barrier_fixup)
197 		__stop___stf_entry_barrier_fixup = .;
198 	}
199 
200 	. = ALIGN(8);
201 	__uaccess_flush_fixup : AT(ADDR(__uaccess_flush_fixup) - LOAD_OFFSET) {
202 		__start___uaccess_flush_fixup = .;
203 		*(__uaccess_flush_fixup)
204 		__stop___uaccess_flush_fixup = .;
205 	}
206 
207 	. = ALIGN(8);
208 	__entry_flush_fixup : AT(ADDR(__entry_flush_fixup) - LOAD_OFFSET) {
209 		__start___entry_flush_fixup = .;
210 		*(__entry_flush_fixup)
211 		__stop___entry_flush_fixup = .;
212 	}
213 
214 	. = ALIGN(8);
215 	__scv_entry_flush_fixup : AT(ADDR(__scv_entry_flush_fixup) - LOAD_OFFSET) {
216 		__start___scv_entry_flush_fixup = .;
217 		*(__scv_entry_flush_fixup)
218 		__stop___scv_entry_flush_fixup = .;
219 	}
220 
221 	. = ALIGN(8);
222 	__stf_exit_barrier_fixup : AT(ADDR(__stf_exit_barrier_fixup) - LOAD_OFFSET) {
223 		__start___stf_exit_barrier_fixup = .;
224 		*(__stf_exit_barrier_fixup)
225 		__stop___stf_exit_barrier_fixup = .;
226 	}
227 
228 	. = ALIGN(8);
229 	__rfi_flush_fixup : AT(ADDR(__rfi_flush_fixup) - LOAD_OFFSET) {
230 		__start___rfi_flush_fixup = .;
231 		*(__rfi_flush_fixup)
232 		__stop___rfi_flush_fixup = .;
233 	}
234 #endif /* CONFIG_PPC32 */
235 
236 #ifdef CONFIG_PPC_BARRIER_NOSPEC
237 	. = ALIGN(8);
238 	__spec_barrier_fixup : AT(ADDR(__spec_barrier_fixup) - LOAD_OFFSET) {
239 		__start___barrier_nospec_fixup = .;
240 		*(__barrier_nospec_fixup)
241 		__stop___barrier_nospec_fixup = .;
242 	}
243 #endif /* CONFIG_PPC_BARRIER_NOSPEC */
244 
245 #ifdef CONFIG_PPC_E500
246 	. = ALIGN(8);
247 	__spec_btb_flush_fixup : AT(ADDR(__spec_btb_flush_fixup) - LOAD_OFFSET) {
248 		__start__btb_flush_fixup = .;
249 		*(__btb_flush_fixup)
250 		__stop__btb_flush_fixup = .;
251 	}
252 #endif
253 
254 	/*
255 	 * Various code relies on __init_begin being at the strict RWX boundary.
256 	 */
257 	. = ALIGN(STRICT_ALIGN_SIZE);
258 	__srwx_boundary = .;
259 	__end_rodata = .;
260 	__init_begin = .;
261 
262 /*
263  * Init sections discarded at runtime
264  */
265 	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
266 		_sinittext = .;
267 		INIT_TEXT
268 
269 		/*
270 		 *.init.text might be RO so we must ensure this section ends on
271 		 * a page boundary.
272 		 */
273 		. = ALIGN(PAGE_SIZE);
274 		_einittext = .;
275 		*(.tramp.ftrace.init);
276 	} :text
277 
278 	/* .exit.text is discarded at runtime, not link time,
279 	 * to deal with references from __bug_table
280 	 */
281 	.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
282 		__exittext_begin = .;
283 		EXIT_TEXT
284 		__exittext_end = .;
285 	}
286 
287 	. = ALIGN(PAGE_SIZE);
288 
289 	INIT_DATA_SECTION(16)
290 
291 	. = ALIGN(8);
292 	__ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
293 		__start___ftr_fixup = .;
294 		KEEP(*(__ftr_fixup))
295 		__stop___ftr_fixup = .;
296 	}
297 	. = ALIGN(8);
298 	__mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
299 		__start___mmu_ftr_fixup = .;
300 		KEEP(*(__mmu_ftr_fixup))
301 		__stop___mmu_ftr_fixup = .;
302 	}
303 	. = ALIGN(8);
304 	__lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
305 		__start___lwsync_fixup = .;
306 		KEEP(*(__lwsync_fixup))
307 		__stop___lwsync_fixup = .;
308 	}
309 #ifdef CONFIG_PPC64
310 	. = ALIGN(8);
311 	__fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
312 		__start___fw_ftr_fixup = .;
313 		KEEP(*(__fw_ftr_fixup))
314 		__stop___fw_ftr_fixup = .;
315 	}
316 #endif
317 
318 	PERCPU_SECTION(L1_CACHE_BYTES)
319 
320 	. = ALIGN(8);
321 	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
322 		__machine_desc_start = . ;
323 		KEEP(*(.machine.desc))
324 		__machine_desc_end = . ;
325 	}
326 #ifdef CONFIG_RELOCATABLE
327 	. = ALIGN(8);
328 	.dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET)
329 	{
330 		__dynamic_symtab = .;
331 		*(.dynsym)
332 	}
333 	.dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
334 	.dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
335 	{
336 		__dynamic_start = .;
337 		*(.dynamic)
338 	}
339 	.hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
340 	.gnu.hash : AT(ADDR(.gnu.hash) - LOAD_OFFSET) { *(.gnu.hash) }
341 	.interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
342 	.rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
343 	{
344 		__rela_dyn_start = .;
345 		*(.rela*)
346 	}
347 #endif
348 	/* .exit.data is discarded at runtime, not link time,
349 	 * to deal with references from .exit.text
350 	 */
351 	.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {
352 		EXIT_DATA
353 	}
354 
355 	/* freed after init ends here */
356 	. = ALIGN(PAGE_SIZE);
357 	__init_end = .;
358 
359 /*
360  * And now the various read/write data
361  */
362 
363 	. = ALIGN(PAGE_SIZE);
364 	_sdata = .;
365 
366 	.data : AT(ADDR(.data) - LOAD_OFFSET) {
367 		DATA_DATA
368 		*(.data.rel*)
369 #ifdef CONFIG_PPC32
370 		*(SDATA_MAIN)
371 #endif
372 	}
373 
374 	/* The initial task and kernel stack */
375 	INIT_TASK_DATA_SECTION(THREAD_ALIGN)
376 
377 	.data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
378 		PAGE_ALIGNED_DATA(PAGE_SIZE)
379 	}
380 
381 	.data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
382 		CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
383 	}
384 
385 	.data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
386 		READ_MOSTLY_DATA(L1_CACHE_BYTES)
387 	}
388 
389 	. = ALIGN(PAGE_SIZE);
390 	.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
391 		NOSAVE_DATA
392 	}
393 
394 	BUG_TABLE
395 
396 	. = ALIGN(PAGE_SIZE);
397 	_edata  =  .;
398 	PROVIDE32 (edata = .);
399 
400 /*
401  * And finally the bss
402  */
403 
404 	BSS_SECTION(0, 0, 0)
405 
406 	. = ALIGN(PAGE_SIZE);
407 	_end = . ;
408 	PROVIDE32 (end = .);
409 
410 	DWARF_DEBUG
411 	ELF_DETAILS
412 
413 	DISCARDS
414 	/DISCARD/ : {
415 		*(*.EMB.apuinfo)
416 		*(.glink .iplt .plt)
417 		*(.gnu.version*)
418 		*(.gnu.attributes)
419 		*(.eh_frame)
420 #ifndef CONFIG_RELOCATABLE
421 		*(.rela*)
422 #endif
423 	}
424 }
425