1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#define RO_EXCEPTION_TABLE_ALIGN 16
18
19#include <asm-generic/vmlinux.lds.h>
20#include <asm/page.h>
21#include <asm/thread_info.h>
22
23#include <asm/core.h>
24#include <asm/vectors.h>
25
26OUTPUT_ARCH(xtensa)
27ENTRY(_start)
28
29#ifdef __XTENSA_EB__
30jiffies = jiffies_64 + 4;
31#else
32jiffies = jiffies_64;
33#endif
34
35
36
37
38
39
40
41
42
43
44
45#define RELOCATE_ENTRY(sym, section) \
46 LONG(sym
47 LONG(sym
48 LONG(LOADADDR(section))
49
50
51#define MERGED_VECTORS 1
52#else
53#define MERGED_VECTORS 0
54#endif
55
56
57
58
59
60
61
62
63#define SECTION_VECTOR4(sym, section, addr, prevsec) \
64 section addr : AT(((LOADADDR(prevsec) + SIZEOF(prevsec)) + 3) & ~ 3) \
65 { \
66 . = ALIGN(4); \
67 sym
68 *(section) \
69 sym
70 }
71
72#define SECTION_VECTOR2(section, addr) \
73 . = addr; \
74 *(section)
75
76
77
78
79
80SECTIONS
81{
82 . = KERNELOFFSET;
83
84
85 _text = .;
86 _stext = .;
87
88 .text :
89 {
90
91 HEAD_TEXT
92
93
94 . = ALIGN(PAGE_SIZE);
95 _vecbase = .;
96
97 SECTION_VECTOR2 (.WindowVectors.text, WINDOW_VECTORS_VADDR)
98
99 SECTION_VECTOR2 (.Level2InterruptVector.text, INTLEVEL2_VECTOR_VADDR)
100#endif
101
102 SECTION_VECTOR2 (.Level3InterruptVector.text, INTLEVEL3_VECTOR_VADDR)
103#endif
104
105 SECTION_VECTOR2 (.Level4InterruptVector.text, INTLEVEL4_VECTOR_VADDR)
106#endif
107
108 SECTION_VECTOR2 (.Level5InterruptVector.text, INTLEVEL5_VECTOR_VADDR)
109#endif
110
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)
117
118 *(.exception.text)
119#endif
120
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 = .);
132
133 . = ALIGN(16);
134
135 RO_DATA(4096)
136
137
138
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 = .;
145
146
147
148 . = ALIGN(PAGE_SIZE);
149 __init_begin = .;
150 INIT_TEXT_SECTION(PAGE_SIZE)
151
152 .init.data :
153 {
154 INIT_DATA
155 }
156#endif
157
158 .init.rodata :
159 {
160 . = ALIGN(0x4);
161 __tagtable_begin = .;
162 *(.taglist)
163 __tagtable_end = .;
164
165 . = ALIGN(16);
166 __boot_reloc_table_start = ABSOLUTE(.);
167
168
169 RELOCATE_ENTRY(_WindowVectors_text,
170 .WindowVectors.text);
171
172 RELOCATE_ENTRY(_Level2InterruptVector_text,
173 .Level2InterruptVector.text);
174#endif
175
176 RELOCATE_ENTRY(_Level3InterruptVector_text,
177 .Level3InterruptVector.text);
178#endif
179
180 RELOCATE_ENTRY(_Level4InterruptVector_text,
181 .Level4InterruptVector.text);
182#endif
183
184 RELOCATE_ENTRY(_Level5InterruptVector_text,
185 .Level5InterruptVector.text);
186#endif
187
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
207 RELOCATE_ENTRY(_SecondaryResetVector_text,
208 .SecondaryResetVector.text);
209#endif
210
211 __boot_reloc_table_end = ABSOLUTE(.) ;
212
213 INIT_SETUP(XCHAL_ICACHE_LINESIZE)
214 INIT_CALLS
215 CON_INITCALL
216 INIT_RAM_FS
217 }
218
219 PERCPU_SECTION(XCHAL_ICACHE_LINESIZE)
220
221
222
223 . = ALIGN(4);
224 .dummy : { LONG(0) }
225
226#undef LAST
227#define LAST .dummy
228
229
230
231
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
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
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
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
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
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
296
297#endif
298
299
300 SECTION_VECTOR4 (_SecondaryResetVector_text,
301 .SecondaryResetVector.text,
302 RESET_VECTOR1_VADDR,
303 LAST)
304#undef LAST
305#define LAST .SecondaryResetVector.text
306
307#endif
308
309 SECTION_VECTOR4 (_exception_text,
310 .exception.text,
311 ,
312 LAST)
313#undef LAST
314#define LAST .exception.text
315
316#endif
317 . = (LOADADDR(LAST) + SIZEOF(LAST) + 3) & ~ 3;
318
319 .dummy1 : AT(ADDR(.dummy1)) { LONG(0) }
320 . = ALIGN(PAGE_SIZE);
321
322#ifndef CONFIG_XIP_KERNEL
323 __init_end = .;
324
325 BSS_SECTION(0, 8192, 0)
326#endif
327
328 _end = .;
329
330#ifdef CONFIG_XIP_KERNEL
331 . = CONFIG_XIP_DATA_ADDR;
332
333 _xip_start = .;
334
335#undef LOAD_OFFSET
336#define LOAD_OFFSET \
337 (CONFIG_XIP_DATA_ADDR - (LOADADDR(.dummy1) + SIZEOF(.dummy1) + 3) & ~ 3)
338
339 _xip_data_start = .;
340 _sdata = .;
341 RW_DATA(XCHAL_ICACHE_LINESIZE, PAGE_SIZE, THREAD_SIZE)
342 _edata = .;
343 _xip_data_end = .;
344
345
346
347 STRUCT_ALIGN();
348
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)
358
359 _xip_end = .;
360
361#undef LOAD_OFFSET
362#endif
363
364 DWARF_DEBUG
365
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*)) }
369
370
371 DISCARDS
372}
373