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