arm64: dts: Revert "specify console via command line"
[linux/fpc-iii.git] / arch / xtensa / kernel / vmlinux.lds.S
blobd23a6e38f06253d0d21970c92f9da821627eac77
1 /*
2  * arch/xtensa/kernel/vmlinux.lds.S
3  *
4  * Xtensa linker script
5  *
6  * This file is subject to the terms and conditions of the GNU General Public
7  * License.  See the file "COPYING" in the main directory of this archive
8  * for more details.
9  *
10  * Copyright (C) 2001 - 2008 Tensilica Inc.
11  *
12  * Chris Zankel <chris@zankel.net>
13  * Marc Gauthier <marc@tensilica.com, marc@alumni.uwaterloo.ca>
14  * Joe Taylor <joe@tensilica.com, joetylr@yahoo.com>
15  */
17 #define RO_EXCEPTION_TABLE_ALIGN        16
19 #include <asm-generic/vmlinux.lds.h>
20 #include <asm/page.h>
21 #include <asm/thread_info.h>
23 #include <asm/core.h>
24 #include <asm/vectors.h>
26 OUTPUT_ARCH(xtensa)
27 ENTRY(_start)
29 #ifdef __XTENSA_EB__
30 jiffies = jiffies_64 + 4;
31 #else
32 jiffies = jiffies_64;
33 #endif
35 /* Note: In the following macros, it would be nice to specify only the
36    vector name and section kind and construct "sym" and "section" using
37    CPP concatenation, but that does not work reliably.  Concatenating a
38    string with "." produces an invalid token.  CPP will not print a
39    warning because it thinks this is an assembly file, but it leaves
40    them as multiple tokens and there may or may not be whitespace
41    between them.  */
43 /* Macro for a relocation entry */
45 #define RELOCATE_ENTRY(sym, section)            \
46         LONG(sym ## _start);                    \
47         LONG(sym ## _end);                      \
48         LONG(LOADADDR(section))
50 #if !defined(CONFIG_VECTORS_ADDR) && XCHAL_HAVE_VECBASE
51 #define MERGED_VECTORS 1
52 #else
53 #define MERGED_VECTORS 0
54 #endif
57  * Macro to define a section for a vector. When MERGED_VECTORS is 0
58  * code for every vector is located with other init data. At startup
59  * time head.S copies code for every vector to its final position according
60  * to description recorded in the corresponding RELOCATE_ENTRY.
61  */
63 #define SECTION_VECTOR4(sym, section, addr, prevsec)                        \
64   section addr : AT(((LOADADDR(prevsec) + SIZEOF(prevsec)) + 3) & ~ 3)      \
65   {                                                                         \
66     . = ALIGN(4);                                                           \
67     sym ## _start = ABSOLUTE(.);                                            \
68     *(section)                                                              \
69     sym ## _end = ABSOLUTE(.);                                              \
70   }
72 #define SECTION_VECTOR2(section, addr)                                      \
73   . = addr;                                                                 \
74   *(section)
77  *  Mapping of input sections to output sections when linking.
78  */
80 SECTIONS
82   . = KERNELOFFSET;
83   /* .text section */
85   _text = .;
86   _stext = .;
88   .text :
89   {
90     /* The HEAD_TEXT section must be the first section! */
91     HEAD_TEXT
93 #if MERGED_VECTORS
94     . = ALIGN(PAGE_SIZE);
95     _vecbase = .;
97     SECTION_VECTOR2 (.WindowVectors.text, WINDOW_VECTORS_VADDR)
98 #if XCHAL_EXCM_LEVEL >= 2
99     SECTION_VECTOR2 (.Level2InterruptVector.text, INTLEVEL2_VECTOR_VADDR)
100 #endif
101 #if XCHAL_EXCM_LEVEL >= 3
102     SECTION_VECTOR2 (.Level3InterruptVector.text, INTLEVEL3_VECTOR_VADDR)
103 #endif
104 #if XCHAL_EXCM_LEVEL >= 4
105     SECTION_VECTOR2 (.Level4InterruptVector.text, INTLEVEL4_VECTOR_VADDR)
106 #endif
107 #if XCHAL_EXCM_LEVEL >= 5
108     SECTION_VECTOR2 (.Level5InterruptVector.text, INTLEVEL5_VECTOR_VADDR)
109 #endif
110 #if XCHAL_EXCM_LEVEL >= 6
111     SECTION_VECTOR2 (.Level6InterruptVector.text, INTLEVEL6_VECTOR_VADDR)
112 #endif
113     SECTION_VECTOR2 (.DebugInterruptVector.text, DEBUG_VECTOR_VADDR)
114     SECTION_VECTOR2 (.KernelExceptionVector.text, KERNEL_VECTOR_VADDR)
115     SECTION_VECTOR2 (.UserExceptionVector.text, USER_VECTOR_VADDR)
116     SECTION_VECTOR2 (.DoubleExceptionVector.text, DOUBLEEXC_VECTOR_VADDR)
118     *(.exception.text)
119 #endif
121     IRQENTRY_TEXT
122     SOFTIRQENTRY_TEXT
123     ENTRY_TEXT
124     TEXT_TEXT
125     SCHED_TEXT
126     CPUIDLE_TEXT
127     LOCK_TEXT
128     *(.fixup)
129   }
130   _etext = .;
131   PROVIDE (etext = .);
133   . = ALIGN(16);
135   RO_DATA(4096)
137   /* Data section */
139 #ifdef CONFIG_XIP_KERNEL
140   INIT_TEXT_SECTION(PAGE_SIZE)
141 #else
142   _sdata = .;
143   RW_DATA(XCHAL_ICACHE_LINESIZE, PAGE_SIZE, THREAD_SIZE)
144   _edata = .;
146   /* Initialization code and data: */
148   . = ALIGN(PAGE_SIZE);
149   __init_begin = .;
150   INIT_TEXT_SECTION(PAGE_SIZE)
152   .init.data :
153   {
154     INIT_DATA
155   }
156 #endif
158   .init.rodata :
159   {
160     . = ALIGN(0x4);
161     __tagtable_begin = .;
162     *(.taglist)
163     __tagtable_end = .;
165     . = ALIGN(16);
166     __boot_reloc_table_start = ABSOLUTE(.);
168 #if !MERGED_VECTORS
169     RELOCATE_ENTRY(_WindowVectors_text,
170                    .WindowVectors.text);
171 #if XCHAL_EXCM_LEVEL >= 2
172     RELOCATE_ENTRY(_Level2InterruptVector_text,
173                    .Level2InterruptVector.text);
174 #endif
175 #if XCHAL_EXCM_LEVEL >= 3
176     RELOCATE_ENTRY(_Level3InterruptVector_text,
177                    .Level3InterruptVector.text);
178 #endif
179 #if XCHAL_EXCM_LEVEL >= 4
180     RELOCATE_ENTRY(_Level4InterruptVector_text,
181                    .Level4InterruptVector.text);
182 #endif
183 #if XCHAL_EXCM_LEVEL >= 5
184     RELOCATE_ENTRY(_Level5InterruptVector_text,
185                    .Level5InterruptVector.text);
186 #endif
187 #if XCHAL_EXCM_LEVEL >= 6
188     RELOCATE_ENTRY(_Level6InterruptVector_text,
189                    .Level6InterruptVector.text);
190 #endif
191     RELOCATE_ENTRY(_KernelExceptionVector_text,
192                    .KernelExceptionVector.text);
193     RELOCATE_ENTRY(_UserExceptionVector_text,
194                    .UserExceptionVector.text);
195     RELOCATE_ENTRY(_DoubleExceptionVector_text,
196                    .DoubleExceptionVector.text);
197     RELOCATE_ENTRY(_DebugInterruptVector_text,
198                    .DebugInterruptVector.text);
199     RELOCATE_ENTRY(_exception_text,
200                    .exception.text);
201 #endif
202 #ifdef CONFIG_XIP_KERNEL
203     RELOCATE_ENTRY(_xip_data, .data);
204     RELOCATE_ENTRY(_xip_init_data, .init.data);
205 #endif
206 #if defined(CONFIG_SMP)
207     RELOCATE_ENTRY(_SecondaryResetVector_text,
208                    .SecondaryResetVector.text);
209 #endif
211     __boot_reloc_table_end = ABSOLUTE(.) ;
213     INIT_SETUP(XCHAL_ICACHE_LINESIZE)
214     INIT_CALLS
215     CON_INITCALL
216     INIT_RAM_FS
217   }
219   PERCPU_SECTION(XCHAL_ICACHE_LINESIZE)
221   /* We need this dummy segment here */
223   . = ALIGN(4);
224   .dummy : { LONG(0) }
226 #undef LAST
227 #define LAST    .dummy
229 #if !MERGED_VECTORS
230   /* The vectors are relocated to the real position at startup time */
232   SECTION_VECTOR4 (_WindowVectors_text,
233                   .WindowVectors.text,
234                   WINDOW_VECTORS_VADDR,
235                   .dummy)
236   SECTION_VECTOR4 (_DebugInterruptVector_text,
237                   .DebugInterruptVector.text,
238                   DEBUG_VECTOR_VADDR,
239                   .WindowVectors.text)
240 #undef LAST
241 #define LAST    .DebugInterruptVector.text
242 #if XCHAL_EXCM_LEVEL >= 2
243   SECTION_VECTOR4 (_Level2InterruptVector_text,
244                   .Level2InterruptVector.text,
245                   INTLEVEL2_VECTOR_VADDR,
246                   LAST)
247 # undef LAST
248 # define LAST   .Level2InterruptVector.text
249 #endif
250 #if XCHAL_EXCM_LEVEL >= 3
251   SECTION_VECTOR4 (_Level3InterruptVector_text,
252                   .Level3InterruptVector.text,
253                   INTLEVEL3_VECTOR_VADDR,
254                   LAST)
255 # undef LAST
256 # define LAST   .Level3InterruptVector.text
257 #endif
258 #if XCHAL_EXCM_LEVEL >= 4
259   SECTION_VECTOR4 (_Level4InterruptVector_text,
260                   .Level4InterruptVector.text,
261                   INTLEVEL4_VECTOR_VADDR,
262                   LAST)
263 # undef LAST
264 # define LAST   .Level4InterruptVector.text
265 #endif
266 #if XCHAL_EXCM_LEVEL >= 5
267   SECTION_VECTOR4 (_Level5InterruptVector_text,
268                   .Level5InterruptVector.text,
269                   INTLEVEL5_VECTOR_VADDR,
270                   LAST)
271 # undef LAST
272 # define LAST   .Level5InterruptVector.text
273 #endif
274 #if XCHAL_EXCM_LEVEL >= 6
275   SECTION_VECTOR4 (_Level6InterruptVector_text,
276                   .Level6InterruptVector.text,
277                   INTLEVEL6_VECTOR_VADDR,
278                   LAST)
279 # undef LAST
280 # define LAST   .Level6InterruptVector.text
281 #endif
282   SECTION_VECTOR4 (_KernelExceptionVector_text,
283                   .KernelExceptionVector.text,
284                   KERNEL_VECTOR_VADDR,
285                   LAST)
286 #undef LAST
287   SECTION_VECTOR4 (_UserExceptionVector_text,
288                   .UserExceptionVector.text,
289                   USER_VECTOR_VADDR,
290                   .KernelExceptionVector.text)
291   SECTION_VECTOR4 (_DoubleExceptionVector_text,
292                   .DoubleExceptionVector.text,
293                   DOUBLEEXC_VECTOR_VADDR,
294                   .UserExceptionVector.text)
295 #define LAST .DoubleExceptionVector.text
297 #endif
298 #if defined(CONFIG_SMP)
300   SECTION_VECTOR4 (_SecondaryResetVector_text,
301                   .SecondaryResetVector.text,
302                   RESET_VECTOR1_VADDR,
303                   LAST)
304 #undef LAST
305 #define LAST .SecondaryResetVector.text
307 #endif
308 #if !MERGED_VECTORS
309   SECTION_VECTOR4 (_exception_text,
310                   .exception.text,
311                   ,
312                   LAST)
313 #undef LAST
314 #define LAST .exception.text
316 #endif
317   . = (LOADADDR(LAST) + SIZEOF(LAST) + 3) & ~ 3;
319   .dummy1 : AT(ADDR(.dummy1)) { LONG(0) }
320   . = ALIGN(PAGE_SIZE);
322 #ifndef CONFIG_XIP_KERNEL
323   __init_end = .;
325   BSS_SECTION(0, 8192, 0)
326 #endif
328   _end = .;
330 #ifdef CONFIG_XIP_KERNEL
331   . = CONFIG_XIP_DATA_ADDR;
333   _xip_start = .;
335 #undef LOAD_OFFSET
336 #define LOAD_OFFSET \
337   (CONFIG_XIP_DATA_ADDR - (LOADADDR(.dummy1) + SIZEOF(.dummy1) + 3) & ~ 3)
339   _xip_data_start = .;
340   _sdata = .;
341   RW_DATA(XCHAL_ICACHE_LINESIZE, PAGE_SIZE, THREAD_SIZE)
342   _edata = .;
343   _xip_data_end = .;
345   /* Initialization data: */
347   STRUCT_ALIGN();
349   _xip_init_data_start = .;
350   __init_begin = .;
351   .init.data :
352   {
353     INIT_DATA
354   }
355   _xip_init_data_end = .;
356   __init_end = .;
357   BSS_SECTION(0, 8192, 0)
359   _xip_end = .;
361 #undef LOAD_OFFSET
362 #endif
364   DWARF_DEBUG
366   .xt.prop 0 : { KEEP(*(.xt.prop .xt.prop.* .gnu.linkonce.prop.*)) }
367   .xt.insn 0 : { KEEP(*(.xt.insn .xt.insn.* .gnu.linkonce.x*)) }
368   .xt.lit  0 : { KEEP(*(.xt.lit  .xt.lit.*  .gnu.linkonce.p*)) }
370   /* Sections to be discarded */
371   DISCARDS