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