GNU Linux-libre 4.14.251-gnu1
[releases.git] / arch / arm / kernel / vmlinux-xip.lds.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* ld script to make ARM Linux kernel
3  * taken from the i386 version by Russell King
4  * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
5  */
6
7 /* No __ro_after_init data in the .rodata section - which will always be ro */
8 #define RO_AFTER_INIT_DATA
9
10 #include <asm-generic/vmlinux.lds.h>
11 #include <asm/cache.h>
12 #include <asm/thread_info.h>
13 #include <asm/memory.h>
14 #include <asm/page.h>
15
16 #define PROC_INFO                                                       \
17         . = ALIGN(4);                                                   \
18         VMLINUX_SYMBOL(__proc_info_begin) = .;                          \
19         *(.proc.info.init)                                              \
20         VMLINUX_SYMBOL(__proc_info_end) = .;
21
22 #define IDMAP_TEXT                                                      \
23         ALIGN_FUNCTION();                                               \
24         VMLINUX_SYMBOL(__idmap_text_start) = .;                         \
25         *(.idmap.text)                                                  \
26         VMLINUX_SYMBOL(__idmap_text_end) = .;                           \
27         . = ALIGN(PAGE_SIZE);                                           \
28         VMLINUX_SYMBOL(__hyp_idmap_text_start) = .;                     \
29         *(.hyp.idmap.text)                                              \
30         VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
31
32 #ifdef CONFIG_HOTPLUG_CPU
33 #define ARM_CPU_DISCARD(x)
34 #define ARM_CPU_KEEP(x)         x
35 #else
36 #define ARM_CPU_DISCARD(x)      x
37 #define ARM_CPU_KEEP(x)
38 #endif
39
40 #if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
41         defined(CONFIG_GENERIC_BUG)
42 #define ARM_EXIT_KEEP(x)        x
43 #define ARM_EXIT_DISCARD(x)
44 #else
45 #define ARM_EXIT_KEEP(x)
46 #define ARM_EXIT_DISCARD(x)     x
47 #endif
48
49 OUTPUT_ARCH(arm)
50 ENTRY(stext)
51
52 #ifndef __ARMEB__
53 jiffies = jiffies_64;
54 #else
55 jiffies = jiffies_64 + 4;
56 #endif
57
58 SECTIONS
59 {
60         /*
61          * XXX: The linker does not define how output sections are
62          * assigned to input sections when there are multiple statements
63          * matching the same input section name.  There is no documented
64          * order of matching.
65          *
66          * unwind exit sections must be discarded before the rest of the
67          * unwind sections get included.
68          */
69         /DISCARD/ : {
70                 *(.ARM.exidx.exit.text)
71                 *(.ARM.extab.exit.text)
72                 ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
73                 ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
74                 ARM_EXIT_DISCARD(EXIT_TEXT)
75                 ARM_EXIT_DISCARD(EXIT_DATA)
76                 EXIT_CALL
77 #ifndef CONFIG_MMU
78                 *(.text.fixup)
79                 *(__ex_table)
80 #endif
81 #ifndef CONFIG_SMP_ON_UP
82                 *(.alt.smp.init)
83 #endif
84                 *(.discard)
85                 *(.discard.*)
86         }
87
88         . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
89         _xiprom = .;                    /* XIP ROM area to be mapped */
90
91         .head.text : {
92                 _text = .;
93                 HEAD_TEXT
94         }
95
96         .text : {                       /* Real text segment            */
97                 _stext = .;             /* Text and read-only data      */
98                         IDMAP_TEXT
99                         __exception_text_start = .;
100                         *(.exception.text)
101                         __exception_text_end = .;
102                         IRQENTRY_TEXT
103                         TEXT_TEXT
104                         SCHED_TEXT
105                         CPUIDLE_TEXT
106                         LOCK_TEXT
107                         KPROBES_TEXT
108                         *(.gnu.warning)
109                         *(.glue_7)
110                         *(.glue_7t)
111                 . = ALIGN(4);
112                 *(.got)                 /* Global offset table          */
113                         ARM_CPU_KEEP(PROC_INFO)
114         }
115
116         RO_DATA(PAGE_SIZE)
117
118         . = ALIGN(4);
119         __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
120                 __start___ex_table = .;
121 #ifdef CONFIG_MMU
122                 *(__ex_table)
123 #endif
124                 __stop___ex_table = .;
125         }
126
127 #ifdef CONFIG_ARM_UNWIND
128         /*
129          * Stack unwinding tables
130          */
131         . = ALIGN(8);
132         .ARM.unwind_idx : {
133                 __start_unwind_idx = .;
134                 *(.ARM.exidx*)
135                 __stop_unwind_idx = .;
136         }
137         .ARM.unwind_tab : {
138                 __start_unwind_tab = .;
139                 *(.ARM.extab*)
140                 __stop_unwind_tab = .;
141         }
142 #endif
143
144         NOTES
145
146         _etext = .;                     /* End of text and rodata section */
147
148         /*
149          * The vectors and stubs are relocatable code, and the
150          * only thing that matters is their relative offsets
151          */
152         __vectors_start = .;
153         .vectors 0xffff0000 : AT(__vectors_start) {
154                 *(.vectors)
155         }
156         . = __vectors_start + SIZEOF(.vectors);
157         __vectors_end = .;
158
159         __stubs_start = .;
160         .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {
161                 *(.stubs)
162         }
163         . = __stubs_start + SIZEOF(.stubs);
164         __stubs_end = .;
165
166         PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
167
168         INIT_TEXT_SECTION(8)
169         .exit.text : {
170                 ARM_EXIT_KEEP(EXIT_TEXT)
171         }
172         .init.proc.info : {
173                 ARM_CPU_DISCARD(PROC_INFO)
174         }
175         .init.arch.info : {
176                 __arch_info_begin = .;
177                 *(.arch.info.init)
178                 __arch_info_end = .;
179         }
180         .init.tagtable : {
181                 __tagtable_begin = .;
182                 *(.taglist.init)
183                 __tagtable_end = .;
184         }
185 #ifdef CONFIG_SMP_ON_UP
186         .init.smpalt : {
187                 __smpalt_begin = .;
188                 *(.alt.smp.init)
189                 __smpalt_end = .;
190         }
191 #endif
192         .init.pv_table : {
193                 __pv_table_begin = .;
194                 *(.pv_table)
195                 __pv_table_end = .;
196         }
197         .init.data : {
198                 INIT_SETUP(16)
199                 INIT_CALLS
200                 CON_INITCALL
201                 SECURITY_INITCALL
202                 INIT_RAM_FS
203         }
204
205 #ifdef CONFIG_SMP
206         PERCPU_SECTION(L1_CACHE_BYTES)
207 #endif
208
209         _exiprom = .;                   /* End of XIP ROM area */
210         __data_loc = ALIGN(4);          /* location in binary */
211         . = PAGE_OFFSET + TEXT_OFFSET;
212
213         .data : AT(__data_loc) {
214                 _data = .;              /* address in memory */
215                 _sdata = .;
216
217                 /*
218                  * first, the init task union, aligned
219                  * to an 8192 byte boundary.
220                  */
221                 INIT_TASK_DATA(THREAD_SIZE)
222
223                 . = ALIGN(PAGE_SIZE);
224                 __init_begin = .;
225                 INIT_DATA
226                 ARM_EXIT_KEEP(EXIT_DATA)
227                 . = ALIGN(PAGE_SIZE);
228                 __init_end = .;
229
230                 *(.data..ro_after_init)
231
232                 NOSAVE_DATA
233                 CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
234                 READ_MOSTLY_DATA(L1_CACHE_BYTES)
235
236                 /*
237                  * and the usual data section
238                  */
239                 DATA_DATA
240                 CONSTRUCTORS
241
242                 _edata = .;
243         }
244         _edata_loc = __data_loc + SIZEOF(.data);
245
246         BUG_TABLE
247
248 #ifdef CONFIG_HAVE_TCM
249         /*
250          * We align everything to a page boundary so we can
251          * free it after init has commenced and TCM contents have
252          * been copied to its destination.
253          */
254         .tcm_start : {
255                 . = ALIGN(PAGE_SIZE);
256                 __tcm_start = .;
257                 __itcm_start = .;
258         }
259
260         /*
261          * Link these to the ITCM RAM
262          * Put VMA to the TCM address and LMA to the common RAM
263          * and we'll upload the contents from RAM to TCM and free
264          * the used RAM after that.
265          */
266         .text_itcm ITCM_OFFSET : AT(__itcm_start)
267         {
268                 __sitcm_text = .;
269                 *(.tcm.text)
270                 *(.tcm.rodata)
271                 . = ALIGN(4);
272                 __eitcm_text = .;
273         }
274
275         /*
276          * Reset the dot pointer, this is needed to create the
277          * relative __dtcm_start below (to be used as extern in code).
278          */
279         . = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
280
281         .dtcm_start : {
282                 __dtcm_start = .;
283         }
284
285         /* TODO: add remainder of ITCM as well, that can be used for data! */
286         .data_dtcm DTCM_OFFSET : AT(__dtcm_start)
287         {
288                 . = ALIGN(4);
289                 __sdtcm_data = .;
290                 *(.tcm.data)
291                 . = ALIGN(4);
292                 __edtcm_data = .;
293         }
294
295         /* Reset the dot pointer or the linker gets confused */
296         . = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
297
298         /* End marker for freeing TCM copy in linked object */
299         .tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
300                 . = ALIGN(PAGE_SIZE);
301                 __tcm_end = .;
302         }
303 #endif
304
305         BSS_SECTION(0, 0, 0)
306         _end = .;
307
308         STABS_DEBUG
309 }
310
311 /*
312  * These must never be empty
313  * If you have to comment these two assert statements out, your
314  * binutils is too old (for other reasons as well)
315  */
316 ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
317 ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
318
319 /*
320  * The HYP init code can't be more than a page long,
321  * and should not cross a page boundary.
322  * The above comment applies as well.
323  */
324 ASSERT(__hyp_idmap_text_end - (__hyp_idmap_text_start & PAGE_MASK) <= PAGE_SIZE,
325         "HYP init code too big or misaligned")