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