1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <asm-generic/vmlinux.lds.h>
18#include <asm/page.h>
19#include <asm/thread_info.h>
20
21#include <asm/vectors.h>
22#include <variant/core.h>
23#include <platform/hardware.h>
24OUTPUT_ARCH(xtensa)
25ENTRY(_start)
26
27#ifdef __XTENSA_EB__
28jiffies = jiffies_64 + 4;
29#else
30jiffies = jiffies_64;
31#endif
32
33
34
35
36
37
38
39
40
41
42
43#define RELOCATE_ENTRY(sym, section) \
44 LONG(sym
45 LONG(sym
46 LONG(LOADADDR(section))
47
48
49
50
51
52
53
54
55#ifdef CONFIG_VECTORS_OFFSET
56#define SECTION_VECTOR(sym, section, addr, prevsec) \
57 section addr : AT(((LOADADDR(prevsec) + SIZEOF(prevsec)) + 3) & ~ 3) \
58 { \
59 . = ALIGN(4); \
60 sym
61 *(section) \
62 sym
63 }
64#else
65#define SECTION_VECTOR(section, addr) \
66 . = addr; \
67 *(section)
68#endif
69
70
71
72
73
74SECTIONS
75{
76 . = KERNELOFFSET;
77
78
79 _text = .;
80 _stext = .;
81
82 .text :
83 {
84
85 HEAD_TEXT
86
87#ifndef CONFIG_VECTORS_OFFSET
88 . = ALIGN(PAGE_SIZE);
89 _vecbase = .;
90
91 SECTION_VECTOR (.WindowVectors.text, WINDOW_VECTORS_VADDR)
92
93 SECTION_VECTOR (.Level2InterruptVector.text, INTLEVEL2_VECTOR_VADDR)
94#endif
95
96 SECTION_VECTOR (.Level3InterruptVector.text, INTLEVEL3_VECTOR_VADDR)
97#endif
98
99 SECTION_VECTOR (.Level4InterruptVector.text, INTLEVEL4_VECTOR_VADDR)
100#endif
101
102 SECTION_VECTOR (.Level5InterruptVector.text, INTLEVEL5_VECTOR_VADDR)
103#endif
104
105 SECTION_VECTOR (.Level6InterruptVector.text, INTLEVEL6_VECTOR_VADDR)
106#endif
107 SECTION_VECTOR (.DebugInterruptVector.text, DEBUG_VECTOR_VADDR)
108 SECTION_VECTOR (.KernelExceptionVector.text, KERNEL_VECTOR_VADDR)
109 SECTION_VECTOR (.UserExceptionVector.text, USER_VECTOR_VADDR)
110 SECTION_VECTOR (.DoubleExceptionVector.text, DOUBLEEXC_VECTOR_VADDR)
111#endif
112
113 IRQENTRY_TEXT
114 SOFTIRQENTRY_TEXT
115 ENTRY_TEXT
116 TEXT_TEXT
117 SCHED_TEXT
118 CPUIDLE_TEXT
119 LOCK_TEXT
120
121 }
122 _etext = .;
123 PROVIDE (etext = .);
124
125 . = ALIGN(16);
126
127 RODATA
128
129
130
131 .fixup : { *(.fixup) }
132
133 EXCEPTION_TABLE(16)
134
135
136 _sdata = .;
137 RW_DATA_SECTION(XCHAL_ICACHE_LINESIZE, PAGE_SIZE, THREAD_SIZE)
138 _edata = .;
139
140
141
142 . = ALIGN(PAGE_SIZE);
143 __init_begin = .;
144 INIT_TEXT_SECTION(PAGE_SIZE)
145
146 .init.data :
147 {
148 INIT_DATA
149 . = ALIGN(0x4);
150 __tagtable_begin = .;
151 *(.taglist)
152 __tagtable_end = .;
153
154 . = ALIGN(16);
155 __boot_reloc_table_start = ABSOLUTE(.);
156
157#ifdef CONFIG_VECTORS_OFFSET
158 RELOCATE_ENTRY(_WindowVectors_text,
159 .WindowVectors.text);
160
161 RELOCATE_ENTRY(_Level2InterruptVector_text,
162 .Level2InterruptVector.text);
163#endif
164
165 RELOCATE_ENTRY(_Level3InterruptVector_text,
166 .Level3InterruptVector.text);
167#endif
168
169 RELOCATE_ENTRY(_Level4InterruptVector_text,
170 .Level4InterruptVector.text);
171#endif
172
173 RELOCATE_ENTRY(_Level5InterruptVector_text,
174 .Level5InterruptVector.text);
175#endif
176
177 RELOCATE_ENTRY(_Level6InterruptVector_text,
178 .Level6InterruptVector.text);
179#endif
180 RELOCATE_ENTRY(_KernelExceptionVector_text,
181 .KernelExceptionVector.text);
182 RELOCATE_ENTRY(_UserExceptionVector_text,
183 .UserExceptionVector.text);
184 RELOCATE_ENTRY(_DoubleExceptionVector_text,
185 .DoubleExceptionVector.text);
186 RELOCATE_ENTRY(_DebugInterruptVector_text,
187 .DebugInterruptVector.text);
188#endif
189
190 RELOCATE_ENTRY(_SecondaryResetVector_text,
191 .SecondaryResetVector.text);
192#endif
193
194
195 __boot_reloc_table_end = ABSOLUTE(.) ;
196
197 INIT_SETUP(XCHAL_ICACHE_LINESIZE)
198 INIT_CALLS
199 CON_INITCALL
200 INIT_RAM_FS
201 }
202
203 PERCPU_SECTION(XCHAL_ICACHE_LINESIZE)
204
205
206
207 . = ALIGN(4);
208 .dummy : { LONG(0) }
209
210#ifdef CONFIG_VECTORS_OFFSET
211
212
213 SECTION_VECTOR (_WindowVectors_text,
214 .WindowVectors.text,
215 WINDOW_VECTORS_VADDR,
216 .dummy)
217 SECTION_VECTOR (_DebugInterruptVector_text,
218 .DebugInterruptVector.text,
219 DEBUG_VECTOR_VADDR,
220 .WindowVectors.text)
221#undef LAST
222#define LAST .DebugInterruptVector.text
223
224 SECTION_VECTOR (_Level2InterruptVector_text,
225 .Level2InterruptVector.text,
226 INTLEVEL2_VECTOR_VADDR,
227 LAST)
228# undef LAST
229# define LAST .Level2InterruptVector.text
230#endif
231
232 SECTION_VECTOR (_Level3InterruptVector_text,
233 .Level3InterruptVector.text,
234 INTLEVEL3_VECTOR_VADDR,
235 LAST)
236# undef LAST
237# define LAST .Level3InterruptVector.text
238#endif
239
240 SECTION_VECTOR (_Level4InterruptVector_text,
241 .Level4InterruptVector.text,
242 INTLEVEL4_VECTOR_VADDR,
243 LAST)
244# undef LAST
245# define LAST .Level4InterruptVector.text
246#endif
247
248 SECTION_VECTOR (_Level5InterruptVector_text,
249 .Level5InterruptVector.text,
250 INTLEVEL5_VECTOR_VADDR,
251 LAST)
252# undef LAST
253# define LAST .Level5InterruptVector.text
254#endif
255
256 SECTION_VECTOR (_Level6InterruptVector_text,
257 .Level6InterruptVector.text,
258 INTLEVEL6_VECTOR_VADDR,
259 LAST)
260# undef LAST
261# define LAST .Level6InterruptVector.text
262#endif
263 SECTION_VECTOR (_KernelExceptionVector_text,
264 .KernelExceptionVector.text,
265 KERNEL_VECTOR_VADDR,
266 LAST)
267#undef LAST
268 SECTION_VECTOR (_UserExceptionVector_text,
269 .UserExceptionVector.text,
270 USER_VECTOR_VADDR,
271 .KernelExceptionVector.text)
272 SECTION_VECTOR (_DoubleExceptionVector_text,
273 .DoubleExceptionVector.text,
274 DOUBLEEXC_VECTOR_VADDR,
275 .UserExceptionVector.text)
276
277 . = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3;
278
279#endif
280
281
282 SECTION_VECTOR (_SecondaryResetVector_text,
283 .SecondaryResetVector.text,
284 RESET_VECTOR1_VADDR,
285 .DoubleExceptionVector.text)
286
287 . = LOADADDR(.SecondaryResetVector.text)+SIZEOF(.SecondaryResetVector.text);
288
289#endif
290
291 . = ALIGN(PAGE_SIZE);
292
293 __init_end = .;
294
295 BSS_SECTION(0, 8192, 0)
296
297 _end = .;
298
299 .xt.lit : { *(.xt.lit) }
300 .xt.prop : { *(.xt.prop) }
301
302 .debug 0 : { *(.debug) }
303 .line 0 : { *(.line) }
304 .debug_srcinfo 0 : { *(.debug_srcinfo) }
305 .debug_sfnames 0 : { *(.debug_sfnames) }
306 .debug_aranges 0 : { *(.debug_aranges) }
307 .debug_pubnames 0 : { *(.debug_pubnames) }
308 .debug_info 0 : { *(.debug_info) }
309 .debug_abbrev 0 : { *(.debug_abbrev) }
310 .debug_line 0 : { *(.debug_line) }
311 .debug_frame 0 : { *(.debug_frame) }
312 .debug_str 0 : { *(.debug_str) }
313 .debug_loc 0 : { *(.debug_loc) }
314 .debug_macinfo 0 : { *(.debug_macinfo) }
315 .debug_weaknames 0 : { *(.debug_weaknames) }
316 .debug_funcnames 0 : { *(.debug_funcnames) }
317 .debug_typenames 0 : { *(.debug_typenames) }
318 .debug_varnames 0 : { *(.debug_varnames) }
319
320 .xt.insn 0 :
321 {
322 *(.xt.insn)
323 *(.gnu.linkonce.x*)
324 }
325
326 .xt.lit 0 :
327 {
328 *(.xt.lit)
329 *(.gnu.linkonce.p*)
330 }
331
332
333 DISCARDS
334}
335