crt1.S revision 1.1 1 1.1 mrg /* Copyright (C) 2000-2013 Free Software Foundation, Inc.
2 1.1 mrg This file was pretty much copied from newlib.
3 1.1 mrg
4 1.1 mrg This file is part of GCC.
5 1.1 mrg
6 1.1 mrg GCC is free software; you can redistribute it and/or modify it
7 1.1 mrg under the terms of the GNU General Public License as published by the
8 1.1 mrg Free Software Foundation; either version 3, or (at your option) any
9 1.1 mrg later version.
10 1.1 mrg
11 1.1 mrg GCC is distributed in the hope that it will be useful,
12 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 1.1 mrg General Public License for more details.
15 1.1 mrg
16 1.1 mrg Under Section 7 of GPL version 3, you are granted additional
17 1.1 mrg permissions described in the GCC Runtime Library Exception, version
18 1.1 mrg 3.1, as published by the Free Software Foundation.
19 1.1 mrg
20 1.1 mrg You should have received a copy of the GNU General Public License and
21 1.1 mrg a copy of the GCC Runtime Library Exception along with this program;
22 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 1.1 mrg <http://www.gnu.org/licenses/>. */
24 1.1 mrg
25 1.1 mrg
26 1.1 mrg #ifdef MMU_SUPPORT
27 1.1 mrg /* Section used for exception/timer interrupt stack area */
28 1.1 mrg .section .data.vbr.stack,"aw"
29 1.1 mrg .align 4
30 1.1 mrg .global __ST_VBR
31 1.1 mrg __ST_VBR:
32 1.1 mrg .zero 1024 * 2 /* ; 2k for VBR handlers */
33 1.1 mrg /* Label at the highest stack address where the stack grows from */
34 1.1 mrg __timer_stack:
35 1.1 mrg #endif /* MMU_SUPPORT */
36 1.1 mrg
37 1.1 mrg /* ;----------------------------------------
38 1.1 mrg Normal newlib crt1.S */
39 1.1 mrg
40 1.1 mrg #ifdef __SH5__
41 1.1 mrg .section .data,"aw"
42 1.1 mrg .global ___data
43 1.1 mrg ___data:
44 1.1 mrg
45 1.1 mrg .section .rodata,"a"
46 1.1 mrg .global ___rodata
47 1.1 mrg ___rodata:
48 1.1 mrg
49 1.1 mrg #define ICCR_BASE 0x01600000
50 1.1 mrg #define OCCR_BASE 0x01e00000
51 1.1 mrg #define MMUIR_BASE 0x00000000
52 1.1 mrg #define MMUDR_BASE 0x00800000
53 1.1 mrg
54 1.1 mrg #define PTE_ENABLED 1
55 1.1 mrg #define PTE_DISABLED 0
56 1.1 mrg
57 1.1 mrg #define PTE_SHARED (1 << 1)
58 1.1 mrg #define PTE_NOT_SHARED 0
59 1.1 mrg
60 1.1 mrg #define PTE_CB_UNCACHEABLE 0
61 1.1 mrg #define PTE_CB_DEVICE 1
62 1.1 mrg #define PTE_CB_CACHEABLE_WB 2
63 1.1 mrg #define PTE_CB_CACHEABLE_WT 3
64 1.1 mrg
65 1.1 mrg #define PTE_SZ_4KB (0 << 3)
66 1.1 mrg #define PTE_SZ_64KB (1 << 3)
67 1.1 mrg #define PTE_SZ_1MB (2 << 3)
68 1.1 mrg #define PTE_SZ_512MB (3 << 3)
69 1.1 mrg
70 1.1 mrg #define PTE_PRR (1 << 6)
71 1.1 mrg #define PTE_PRX (1 << 7)
72 1.1 mrg #define PTE_PRW (1 << 8)
73 1.1 mrg #define PTE_PRU (1 << 9)
74 1.1 mrg
75 1.1 mrg #define SR_MMU_BIT 31
76 1.1 mrg #define SR_BL_BIT 28
77 1.1 mrg
78 1.1 mrg #define ALIGN_4KB (0xfff)
79 1.1 mrg #define ALIGN_1MB (0xfffff)
80 1.1 mrg #define ALIGN_512MB (0x1fffffff)
81 1.1 mrg
82 1.1 mrg #define DYNACON_BASE 0x0f000000
83 1.1 mrg #define DM_CB_DLINK_BASE 0x0c000000
84 1.1 mrg #define DM_DB_DLINK_BASE 0x0b000000
85 1.1 mrg
86 1.1 mrg #define FEMI_AREA_0 0x00000000
87 1.1 mrg #define FEMI_AREA_1 0x04000000
88 1.1 mrg #define FEMI_AREA_2 0x05000000
89 1.1 mrg #define FEMI_AREA_3 0x06000000
90 1.1 mrg #define FEMI_AREA_4 0x07000000
91 1.1 mrg #define FEMI_CB 0x08000000
92 1.1 mrg
93 1.1 mrg #define EMI_BASE 0X80000000
94 1.1 mrg
95 1.1 mrg #define DMA_BASE 0X0e000000
96 1.1 mrg
97 1.1 mrg #define CPU_BASE 0X0d000000
98 1.1 mrg
99 1.1 mrg #define PERIPH_BASE 0X09000000
100 1.1 mrg #define DMAC_BASE 0x0e000000
101 1.1 mrg #define INTC_BASE 0x0a000000
102 1.1 mrg #define CPRC_BASE 0x0a010000
103 1.1 mrg #define TMU_BASE 0x0a020000
104 1.1 mrg #define SCIF_BASE 0x0a030000
105 1.1 mrg #define RTC_BASE 0x0a040000
106 1.1 mrg
107 1.1 mrg
108 1.1 mrg
109 1.1 mrg #define LOAD_CONST32(val, reg) \
110 1.1 mrg movi ((val) >> 16) & 65535, reg; \
111 1.1 mrg shori (val) & 65535, reg
112 1.1 mrg
113 1.1 mrg #define LOAD_PTEH_VAL(sym, align, bits, scratch_reg, reg) \
114 1.1 mrg LOAD_ADDR (sym, reg); \
115 1.1 mrg LOAD_CONST32 ((align), scratch_reg); \
116 1.1 mrg andc reg, scratch_reg, reg; \
117 1.1 mrg LOAD_CONST32 ((bits), scratch_reg); \
118 1.1 mrg or reg, scratch_reg, reg
119 1.1 mrg
120 1.1 mrg #define LOAD_PTEL_VAL(sym, align, bits, scratch_reg, reg) \
121 1.1 mrg LOAD_ADDR (sym, reg); \
122 1.1 mrg LOAD_CONST32 ((align), scratch_reg); \
123 1.1 mrg andc reg, scratch_reg, reg; \
124 1.1 mrg LOAD_CONST32 ((bits), scratch_reg); \
125 1.1 mrg or reg, scratch_reg, reg
126 1.1 mrg
127 1.1 mrg #define SET_PTE(pte_addr_reg, pteh_val_reg, ptel_val_reg) \
128 1.1 mrg putcfg pte_addr_reg, 0, r63; \
129 1.1 mrg putcfg pte_addr_reg, 1, ptel_val_reg; \
130 1.1 mrg putcfg pte_addr_reg, 0, pteh_val_reg
131 1.1 mrg
132 1.1 mrg #if __SH5__ == 64
133 1.1 mrg .section .text,"ax"
134 1.1 mrg #define LOAD_ADDR(sym, reg) \
135 1.1 mrg movi (sym >> 48) & 65535, reg; \
136 1.1 mrg shori (sym >> 32) & 65535, reg; \
137 1.1 mrg shori (sym >> 16) & 65535, reg; \
138 1.1 mrg shori sym & 65535, reg
139 1.1 mrg #else
140 1.1 mrg .mode SHmedia
141 1.1 mrg .section .text..SHmedia32,"ax"
142 1.1 mrg #define LOAD_ADDR(sym, reg) \
143 1.1 mrg movi (sym >> 16) & 65535, reg; \
144 1.1 mrg shori sym & 65535, reg
145 1.1 mrg #endif
146 1.1 mrg .global start
147 1.1 mrg start:
148 1.1 mrg LOAD_ADDR (_stack, r15)
149 1.1 mrg
150 1.1 mrg #ifdef MMU_SUPPORT
151 1.1 mrg ! Set up the VM using the MMU and caches
152 1.1 mrg
153 1.1 mrg ! .vm_ep is first instruction to execute
154 1.1 mrg ! after VM initialization
155 1.1 mrg pt/l .vm_ep, tr1
156 1.1 mrg
157 1.1 mrg ! Configure instruction cache (ICCR)
158 1.1 mrg movi 3, r2
159 1.1 mrg movi 0, r3
160 1.1 mrg LOAD_ADDR (ICCR_BASE, r1)
161 1.1 mrg putcfg r1, 0, r2
162 1.1 mrg putcfg r1, 1, r3
163 1.1 mrg
164 1.1 mrg ! movi 7, r2 ! write through
165 1.1 mrg ! Configure operand cache (OCCR)
166 1.1 mrg LOAD_ADDR (OCCR_BASE, r1)
167 1.1 mrg putcfg r1, 0, r2
168 1.1 mrg putcfg r1, 1, r3
169 1.1 mrg
170 1.1 mrg ! Disable all PTE translations
171 1.1 mrg LOAD_ADDR (MMUIR_BASE, r1)
172 1.1 mrg LOAD_ADDR (MMUDR_BASE, r2)
173 1.1 mrg movi 64, r3
174 1.1 mrg pt/l .disable_ptes_loop, tr0
175 1.1 mrg .disable_ptes_loop:
176 1.1 mrg putcfg r1, 0, r63
177 1.1 mrg putcfg r2, 0, r63
178 1.1 mrg addi r1, 16, r1
179 1.1 mrg addi r2, 16, r2
180 1.1 mrg addi r3, -1, r3
181 1.1 mrg bgt r3, r63, tr0
182 1.1 mrg
183 1.1 mrg LOAD_ADDR (MMUIR_BASE, r1)
184 1.1 mrg
185 1.1 mrg ! FEMI instruction mappings
186 1.1 mrg ! Area 0 - 1Mb cacheable at 0x00000000
187 1.1 mrg ! Area 1 - None
188 1.1 mrg ! Area 2 - 1Mb cacheable at 0x05000000
189 1.1 mrg ! - 1Mb cacheable at 0x05100000
190 1.1 mrg ! Area 3 - None
191 1.1 mrg ! Area 4 - None
192 1.1 mrg
193 1.1 mrg ! Map a 1Mb page for instructions at 0x00000000
194 1.1 mrg LOAD_PTEH_VAL (FEMI_AREA_0, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
195 1.1 mrg LOAD_PTEL_VAL (FEMI_AREA_0, ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRX | PTE_PRU, r25, r3)
196 1.1 mrg SET_PTE (r1, r2, r3)
197 1.1 mrg
198 1.1 mrg ! Map a 1Mb page for instructions at 0x05000000
199 1.1 mrg addi r1, 16, r1
200 1.1 mrg LOAD_PTEH_VAL (FEMI_AREA_2, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
201 1.1 mrg LOAD_PTEL_VAL (FEMI_AREA_2, ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRX | PTE_PRU, r25, r3)
202 1.1 mrg SET_PTE (r1, r2, r3)
203 1.1 mrg
204 1.1 mrg ! Map a 1Mb page for instructions at 0x05100000
205 1.1 mrg addi r1, 16, r1
206 1.1 mrg LOAD_PTEH_VAL ((FEMI_AREA_2+0x100000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
207 1.1 mrg LOAD_PTEL_VAL ((FEMI_AREA_2+0x100000), ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRX | PTE_PRU, r25, r3)
208 1.1 mrg SET_PTE (r1, r2, r3)
209 1.1 mrg
210 1.1 mrg ! Map a 512M page for instructions at EMI base
211 1.1 mrg addi r1, 16, r1
212 1.1 mrg LOAD_PTEH_VAL (EMI_BASE, ALIGN_512MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
213 1.1 mrg LOAD_PTEL_VAL (EMI_BASE, ALIGN_512MB, PTE_CB_CACHEABLE_WB | PTE_SZ_512MB | PTE_PRX | PTE_PRU, r25, r3)
214 1.1 mrg SET_PTE (r1, r2, r3)
215 1.1 mrg
216 1.1 mrg ! Map a 4K page for instructions at DM_DB_DLINK_BASE
217 1.1 mrg addi r1, 16, r1
218 1.1 mrg LOAD_PTEH_VAL (DM_DB_DLINK_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
219 1.1 mrg LOAD_PTEL_VAL (DM_DB_DLINK_BASE, ALIGN_4KB, PTE_CB_CACHEABLE_WB | PTE_SZ_4KB | PTE_PRX | PTE_PRU, r25, r3)
220 1.1 mrg SET_PTE (r1, r2, r3)
221 1.1 mrg
222 1.1 mrg LOAD_ADDR (MMUDR_BASE, r1)
223 1.1 mrg
224 1.1 mrg ! FEMI data mappings
225 1.1 mrg ! Area 0 - 1Mb cacheable at 0x00000000
226 1.1 mrg ! Area 1 - 1Mb device at 0x04000000
227 1.1 mrg ! Area 2 - 1Mb cacheable at 0x05000000
228 1.1 mrg ! - 1Mb cacheable at 0x05100000
229 1.1 mrg ! Area 3 - None
230 1.1 mrg ! Area 4 - None
231 1.1 mrg ! CB - 1Mb device at 0x08000000
232 1.1 mrg
233 1.1 mrg ! Map a 1Mb page for data at 0x00000000
234 1.1 mrg LOAD_PTEH_VAL (FEMI_AREA_0, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
235 1.1 mrg LOAD_PTEL_VAL (FEMI_AREA_0, ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
236 1.1 mrg SET_PTE (r1, r2, r3)
237 1.1 mrg
238 1.1 mrg ! Map a 1Mb page for data at 0x04000000
239 1.1 mrg addi r1, 16, r1
240 1.1 mrg LOAD_PTEH_VAL (FEMI_AREA_1, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
241 1.1 mrg LOAD_PTEL_VAL (FEMI_AREA_1, ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
242 1.1 mrg SET_PTE (r1, r2, r3)
243 1.1 mrg
244 1.1 mrg ! Map a 1Mb page for data at 0x05000000
245 1.1 mrg addi r1, 16, r1
246 1.1 mrg LOAD_PTEH_VAL (FEMI_AREA_2, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
247 1.1 mrg LOAD_PTEL_VAL (FEMI_AREA_2, ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
248 1.1 mrg SET_PTE (r1, r2, r3)
249 1.1 mrg
250 1.1 mrg ! Map a 1Mb page for data at 0x05100000
251 1.1 mrg addi r1, 16, r1
252 1.1 mrg LOAD_PTEH_VAL ((FEMI_AREA_2+0x100000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
253 1.1 mrg LOAD_PTEL_VAL ((FEMI_AREA_2+0x100000), ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
254 1.1 mrg SET_PTE (r1, r2, r3)
255 1.1 mrg
256 1.1 mrg ! Map a 4K page for registers at 0x08000000
257 1.1 mrg addi r1, 16, r1
258 1.1 mrg LOAD_PTEH_VAL (FEMI_CB, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
259 1.1 mrg LOAD_PTEL_VAL (FEMI_CB, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
260 1.1 mrg SET_PTE (r1, r2, r3)
261 1.1 mrg
262 1.1 mrg ! Map a 512M page for data at EMI
263 1.1 mrg addi r1, 16, r1
264 1.1 mrg LOAD_PTEH_VAL (EMI_BASE, ALIGN_512MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
265 1.1 mrg LOAD_PTEL_VAL (EMI_BASE, ALIGN_512MB, PTE_CB_CACHEABLE_WB | PTE_SZ_512MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
266 1.1 mrg SET_PTE (r1, r2, r3)
267 1.1 mrg
268 1.1 mrg ! Map a 4K page for DYNACON at DYNACON_BASE
269 1.1 mrg addi r1, 16, r1
270 1.1 mrg LOAD_PTEH_VAL (DYNACON_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
271 1.1 mrg LOAD_PTEL_VAL (DYNACON_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
272 1.1 mrg SET_PTE (r1, r2, r3)
273 1.1 mrg
274 1.1 mrg ! Map a 4K page for instructions at DM_DB_DLINK_BASE
275 1.1 mrg addi r1, 16, r1
276 1.1 mrg LOAD_PTEH_VAL (DM_DB_DLINK_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
277 1.1 mrg LOAD_PTEL_VAL (DM_DB_DLINK_BASE, ALIGN_4KB, PTE_CB_CACHEABLE_WB | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
278 1.1 mrg SET_PTE (r1, r2, r3)
279 1.1 mrg
280 1.1 mrg ! Map a 4K page for data at DM_DB_DLINK_BASE+0x1000
281 1.1 mrg addi r1, 16, r1
282 1.1 mrg LOAD_PTEH_VAL ((DM_DB_DLINK_BASE+0x1000), ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
283 1.1 mrg LOAD_PTEL_VAL ((DM_DB_DLINK_BASE+0x1000), ALIGN_4KB, PTE_CB_UNCACHEABLE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
284 1.1 mrg SET_PTE (r1, r2, r3)
285 1.1 mrg
286 1.1 mrg ! Map a 4K page for stack DM_DB_DLINK_BASE+0x2000
287 1.1 mrg addi r1, 16, r1
288 1.1 mrg LOAD_PTEH_VAL ((DM_DB_DLINK_BASE+0x2000), ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
289 1.1 mrg LOAD_PTEL_VAL ((DM_DB_DLINK_BASE+0x2000), ALIGN_4KB, PTE_CB_CACHEABLE_WB | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
290 1.1 mrg SET_PTE (r1, r2, r3)
291 1.1 mrg
292 1.1 mrg ! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
293 1.1 mrg ! 0x0c000000 - 0x0c0fffff
294 1.1 mrg addi r1, 16, r1
295 1.1 mrg LOAD_PTEH_VAL (DM_CB_DLINK_BASE, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
296 1.1 mrg LOAD_PTEL_VAL (DM_CB_DLINK_BASE, ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
297 1.1 mrg SET_PTE (r1, r2, r3)
298 1.1 mrg
299 1.1 mrg ! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
300 1.1 mrg ! 0x0c100000 - 0x0c1fffff
301 1.1 mrg addi r1, 16, r1
302 1.1 mrg LOAD_PTEH_VAL ((DM_CB_DLINK_BASE+0x100000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
303 1.1 mrg LOAD_PTEL_VAL ((DM_CB_DLINK_BASE+0x100000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
304 1.1 mrg SET_PTE (r1, r2, r3)
305 1.1 mrg
306 1.1 mrg ! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
307 1.1 mrg ! 0x0c200000 - 0x0c2fffff
308 1.1 mrg addi r1, 16, r1
309 1.1 mrg LOAD_PTEH_VAL ((DM_CB_DLINK_BASE+0x200000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
310 1.1 mrg LOAD_PTEL_VAL ((DM_CB_DLINK_BASE+0x200000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
311 1.1 mrg SET_PTE (r1, r2, r3)
312 1.1 mrg
313 1.1 mrg ! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
314 1.1 mrg ! 0x0c400000 - 0x0c4fffff
315 1.1 mrg addi r1, 16, r1
316 1.1 mrg LOAD_PTEH_VAL ((DM_CB_DLINK_BASE+0x400000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
317 1.1 mrg LOAD_PTEL_VAL ((DM_CB_DLINK_BASE+0x400000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
318 1.1 mrg SET_PTE (r1, r2, r3)
319 1.1 mrg
320 1.1 mrg ! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
321 1.1 mrg ! 0x0c800000 - 0x0c8fffff
322 1.1 mrg addi r1, 16, r1
323 1.1 mrg LOAD_PTEH_VAL ((DM_CB_DLINK_BASE+0x800000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
324 1.1 mrg LOAD_PTEL_VAL ((DM_CB_DLINK_BASE+0x800000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
325 1.1 mrg SET_PTE (r1, r2, r3)
326 1.1 mrg
327 1.1 mrg ! Map a 4K page for DMA control registers
328 1.1 mrg addi r1, 16, r1
329 1.1 mrg LOAD_PTEH_VAL (DMA_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
330 1.1 mrg LOAD_PTEL_VAL (DMA_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
331 1.1 mrg SET_PTE (r1, r2, r3)
332 1.1 mrg
333 1.1 mrg ! Map lots of 4K pages for peripherals
334 1.1 mrg
335 1.1 mrg ! /* peripheral */
336 1.1 mrg addi r1, 16, r1
337 1.1 mrg LOAD_PTEH_VAL (PERIPH_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
338 1.1 mrg LOAD_PTEL_VAL (PERIPH_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
339 1.1 mrg SET_PTE (r1, r2, r3)
340 1.1 mrg ! /* dmac */
341 1.1 mrg addi r1, 16, r1
342 1.1 mrg LOAD_PTEH_VAL (DMAC_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
343 1.1 mrg LOAD_PTEL_VAL (DMAC_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
344 1.1 mrg SET_PTE (r1, r2, r3)
345 1.1 mrg ! /* intc */
346 1.1 mrg addi r1, 16, r1
347 1.1 mrg LOAD_PTEH_VAL (INTC_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
348 1.1 mrg LOAD_PTEL_VAL (INTC_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
349 1.1 mrg SET_PTE (r1, r2, r3)
350 1.1 mrg ! /* rtc */
351 1.1 mrg addi r1, 16, r1
352 1.1 mrg LOAD_PTEH_VAL (RTC_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
353 1.1 mrg LOAD_PTEL_VAL (RTC_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
354 1.1 mrg SET_PTE (r1, r2, r3)
355 1.1 mrg ! /* dmac */
356 1.1 mrg addi r1, 16, r1
357 1.1 mrg LOAD_PTEH_VAL (TMU_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
358 1.1 mrg LOAD_PTEL_VAL (TMU_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
359 1.1 mrg SET_PTE (r1, r2, r3)
360 1.1 mrg ! /* scif */
361 1.1 mrg addi r1, 16, r1
362 1.1 mrg LOAD_PTEH_VAL (SCIF_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
363 1.1 mrg LOAD_PTEL_VAL (SCIF_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
364 1.1 mrg SET_PTE (r1, r2, r3)
365 1.1 mrg ! /* cprc */
366 1.1 mrg addi r1, 16, r1
367 1.1 mrg LOAD_PTEH_VAL (CPRC_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
368 1.1 mrg LOAD_PTEL_VAL (CPRC_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
369 1.1 mrg SET_PTE (r1, r2, r3)
370 1.1 mrg
371 1.1 mrg ! Map CPU WPC registers
372 1.1 mrg addi r1, 16, r1
373 1.1 mrg LOAD_PTEH_VAL (CPU_BASE, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
374 1.1 mrg LOAD_PTEL_VAL (CPU_BASE, ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
375 1.1 mrg SET_PTE (r1, r2, r3)
376 1.1 mrg addi r1, 16, r1
377 1.1 mrg
378 1.1 mrg LOAD_PTEH_VAL ((CPU_BASE+0x100000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
379 1.1 mrg LOAD_PTEL_VAL ((CPU_BASE+0x100000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
380 1.1 mrg SET_PTE (r1, r2, r3)
381 1.1 mrg
382 1.1 mrg addi r1, 16, r1
383 1.1 mrg LOAD_PTEH_VAL ((CPU_BASE+0x200000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
384 1.1 mrg LOAD_PTEL_VAL ((CPU_BASE+0x200000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
385 1.1 mrg SET_PTE (r1, r2, r3)
386 1.1 mrg
387 1.1 mrg addi r1, 16, r1
388 1.1 mrg LOAD_PTEH_VAL ((CPU_BASE+0x400000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
389 1.1 mrg LOAD_PTEL_VAL ((CPU_BASE+0x400000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
390 1.1 mrg SET_PTE (r1, r2, r3)
391 1.1 mrg
392 1.1 mrg ! Switch over to virtual addressing and enabled cache
393 1.1 mrg getcon sr, r1
394 1.1 mrg movi 1, r2
395 1.1 mrg shlli r2, SR_BL_BIT, r2
396 1.1 mrg or r1, r2, r1
397 1.1 mrg putcon r1, ssr
398 1.1 mrg getcon sr, r1
399 1.1 mrg movi 1, r2
400 1.1 mrg shlli r2, SR_MMU_BIT, r2
401 1.1 mrg or r1, r2, r1
402 1.1 mrg putcon r1, ssr
403 1.1 mrg gettr tr1, r1
404 1.1 mrg putcon r1, spc
405 1.1 mrg synco
406 1.1 mrg rte
407 1.1 mrg
408 1.1 mrg ! VM entry point. From now on, we are in VM mode.
409 1.1 mrg .vm_ep:
410 1.1 mrg
411 1.1 mrg ! Install the trap handler, by seeding vbr with the
412 1.1 mrg ! correct value, and by assigning sr.bl = 0.
413 1.1 mrg
414 1.1 mrg LOAD_ADDR (vbr_start, r1)
415 1.1 mrg putcon r1, vbr
416 1.1 mrg movi ~(1<<28), r1
417 1.1 mrg getcon sr, r2
418 1.1 mrg and r1, r2, r2
419 1.1 mrg putcon r2, sr
420 1.1 mrg #endif /* MMU_SUPPORT */
421 1.1 mrg
422 1.1 mrg pt/l .Lzero_bss_loop, tr0
423 1.1 mrg pt/l _init, tr5
424 1.1 mrg pt/l ___setup_argv_and_call_main, tr6
425 1.1 mrg pt/l _exit, tr7
426 1.1 mrg
427 1.1 mrg ! zero out bss
428 1.1 mrg LOAD_ADDR (_edata, r0)
429 1.1 mrg LOAD_ADDR (_end, r1)
430 1.1 mrg .Lzero_bss_loop:
431 1.1 mrg stx.q r0, r63, r63
432 1.1 mrg addi r0, 8, r0
433 1.1 mrg bgt/l r1, r0, tr0
434 1.1 mrg
435 1.1 mrg LOAD_ADDR (___data, r26)
436 1.1 mrg LOAD_ADDR (___rodata, r27)
437 1.1 mrg
438 1.1 mrg #ifdef __SH_FPU_ANY__
439 1.1 mrg getcon sr, r0
440 1.1 mrg ! enable the FP unit, by resetting SR.FD
441 1.1 mrg ! also zero out SR.FR, SR.SZ and SR.PR, as mandated by the ABI
442 1.1 mrg movi 0, r1
443 1.1 mrg shori 0xf000, r1
444 1.1 mrg andc r0, r1, r0
445 1.1 mrg putcon r0, sr
446 1.1 mrg #if __SH5__ == 32
447 1.1 mrg pt/l ___set_fpscr, tr0
448 1.1 mrg movi 0, r4
449 1.1 mrg blink tr0, r18
450 1.1 mrg #endif
451 1.1 mrg #endif
452 1.1 mrg
453 1.1 mrg ! arrange for exit to call fini
454 1.1 mrg pt/l _atexit, tr1
455 1.1 mrg LOAD_ADDR (_fini, r2)
456 1.1 mrg blink tr1, r18
457 1.1 mrg
458 1.1 mrg ! call init
459 1.1 mrg blink tr5, r18
460 1.1 mrg
461 1.1 mrg ! call the mainline
462 1.1 mrg blink tr6, r18
463 1.1 mrg
464 1.1 mrg ! call exit
465 1.1 mrg blink tr7, r18
466 1.1 mrg ! We should never return from _exit but in case we do we would enter the
467 1.1 mrg ! the following tight loop. This avoids executing any data that might follow.
468 1.1 mrg limbo:
469 1.1 mrg pt/l limbo, tr0
470 1.1 mrg blink tr0, r63
471 1.1 mrg
472 1.1 mrg #ifdef MMU_SUPPORT
473 1.1 mrg ! All these traps are handled in the same place.
474 1.1 mrg .balign 256
475 1.1 mrg vbr_start:
476 1.1 mrg pt/l handler, tr0 ! tr0 trashed.
477 1.1 mrg blink tr0, r63
478 1.1 mrg .balign 256
479 1.1 mrg vbr_100:
480 1.1 mrg pt/l handler, tr0 ! tr0 trashed.
481 1.1 mrg blink tr0, r63
482 1.1 mrg vbr_100_end:
483 1.1 mrg .balign 256
484 1.1 mrg vbr_200:
485 1.1 mrg pt/l handler, tr0 ! tr0 trashed.
486 1.1 mrg blink tr0, r63
487 1.1 mrg .balign 256
488 1.1 mrg vbr_300:
489 1.1 mrg pt/l handler, tr0 ! tr0 trashed.
490 1.1 mrg blink tr0, r63
491 1.1 mrg .balign 256
492 1.1 mrg vbr_400: ! Should be at vbr+0x400
493 1.1 mrg handler:
494 1.1 mrg /* If the trap handler is there call it */
495 1.1 mrg LOAD_ADDR (__superh_trap_handler, r2)
496 1.1 mrg pta chandler,tr2
497 1.1 mrg beq r2, r63, tr2 /* If zero, ie not present branch around to chandler */
498 1.1 mrg /* Now call the trap handler with as much of the context unchanged as possible.
499 1.1 mrg Move trapping address into R18 to make it look like the trap point */
500 1.1 mrg getcon spc, r18
501 1.1 mrg pt/l __superh_trap_handler, tr0
502 1.1 mrg blink tr0, r7
503 1.1 mrg chandler:
504 1.1 mrg getcon spc, r62
505 1.1 mrg getcon expevt, r2
506 1.1 mrg pt/l _exit, tr0
507 1.1 mrg blink tr0, r63
508 1.1 mrg
509 1.1 mrg /* Simulated trap handler */
510 1.1 mrg .section .text..SHmedia32,"ax"
511 1.1 mrg gcc2_compiled.:
512 1.1 mrg .section .debug_abbrev
513 1.1 mrg .Ldebug_abbrev0:
514 1.1 mrg .section .text..SHmedia32
515 1.1 mrg .Ltext0:
516 1.1 mrg .section .debug_info
517 1.1 mrg .Ldebug_info0:
518 1.1 mrg .section .debug_line
519 1.1 mrg .Ldebug_line0:
520 1.1 mrg .section .text..SHmedia32,"ax"
521 1.1 mrg .align 5
522 1.1 mrg .global __superh_trap_handler
523 1.1 mrg .type __superh_trap_handler,@function
524 1.1 mrg __superh_trap_handler:
525 1.1 mrg .LFB1:
526 1.1 mrg ptabs r18, tr0
527 1.1 mrg addi.l r15, -8, r15
528 1.1 mrg st.l r15, 4, r14
529 1.1 mrg addi.l r15, -8, r15
530 1.1 mrg add.l r15, r63, r14
531 1.1 mrg st.l r14, 0, r2
532 1.1 mrg ptabs r7, tr0
533 1.1 mrg addi.l r14, 8, r14
534 1.1 mrg add.l r14, r63, r15
535 1.1 mrg ld.l r15, 4, r14
536 1.1 mrg addi.l r15, 8, r15
537 1.1 mrg blink tr0, r63
538 1.1 mrg .LFE1:
539 1.1 mrg .Lfe1:
540 1.1 mrg .size __superh_trap_handler,.Lfe1-__superh_trap_handler
541 1.1 mrg
542 1.1 mrg .section .text..SHmedia32
543 1.1 mrg .Letext0:
544 1.1 mrg
545 1.1 mrg .section .debug_info
546 1.1 mrg .ualong 0xa7
547 1.1 mrg .uaword 0x2
548 1.1 mrg .ualong .Ldebug_abbrev0
549 1.1 mrg .byte 0x4
550 1.1 mrg .byte 0x1
551 1.1 mrg .ualong .Ldebug_line0
552 1.1 mrg .ualong .Letext0
553 1.1 mrg .ualong .Ltext0
554 1.1 mrg .string "trap_handler.c"
555 1.1 mrg
556 1.1 mrg .string "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
557 1.1 mrg
558 1.1 mrg .string "GNU C 2.97-sh5-010522"
559 1.1 mrg
560 1.1 mrg .byte 0x1
561 1.1 mrg .byte 0x2
562 1.1 mrg .ualong 0x9a
563 1.1 mrg .byte 0x1
564 1.1 mrg .string "_superh_trap_handler"
565 1.1 mrg
566 1.1 mrg .byte 0x1
567 1.1 mrg .byte 0x2
568 1.1 mrg .byte 0x1
569 1.1 mrg .ualong .LFB1
570 1.1 mrg .ualong .LFE1
571 1.1 mrg .byte 0x1
572 1.1 mrg .byte 0x5e
573 1.1 mrg .byte 0x3
574 1.1 mrg .string "trap_reason"
575 1.1 mrg
576 1.1 mrg .byte 0x1
577 1.1 mrg .byte 0x1
578 1.1 mrg .ualong 0x9a
579 1.1 mrg .byte 0x2
580 1.1 mrg .byte 0x91
581 1.1 mrg .byte 0x0
582 1.1 mrg .byte 0x0
583 1.1 mrg .byte 0x4
584 1.1 mrg .string "unsigned int"
585 1.1 mrg
586 1.1 mrg .byte 0x4
587 1.1 mrg .byte 0x7
588 1.1 mrg .byte 0x0
589 1.1 mrg
590 1.1 mrg .section .debug_abbrev
591 1.1 mrg .byte 0x1
592 1.1 mrg .byte 0x11
593 1.1 mrg .byte 0x1
594 1.1 mrg .byte 0x10
595 1.1 mrg .byte 0x6
596 1.1 mrg .byte 0x12
597 1.1 mrg .byte 0x1
598 1.1 mrg .byte 0x11
599 1.1 mrg .byte 0x1
600 1.1 mrg .byte 0x3
601 1.1 mrg .byte 0x8
602 1.1 mrg .byte 0x1b
603 1.1 mrg .byte 0x8
604 1.1 mrg .byte 0x25
605 1.1 mrg .byte 0x8
606 1.1 mrg .byte 0x13
607 1.1 mrg .byte 0xb
608 1.1 mrg .byte 0,0
609 1.1 mrg .byte 0x2
610 1.1 mrg .byte 0x2e
611 1.1 mrg .byte 0x1
612 1.1 mrg .byte 0x1
613 1.1 mrg .byte 0x13
614 1.1 mrg .byte 0x3f
615 1.1 mrg .byte 0xc
616 1.1 mrg .byte 0x3
617 1.1 mrg .byte 0x8
618 1.1 mrg .byte 0x3a
619 1.1 mrg .byte 0xb
620 1.1 mrg .byte 0x3b
621 1.1 mrg .byte 0xb
622 1.1 mrg .byte 0x27
623 1.1 mrg .byte 0xc
624 1.1 mrg .byte 0x11
625 1.1 mrg .byte 0x1
626 1.1 mrg .byte 0x12
627 1.1 mrg .byte 0x1
628 1.1 mrg .byte 0x40
629 1.1 mrg .byte 0xa
630 1.1 mrg .byte 0,0
631 1.1 mrg .byte 0x3
632 1.1 mrg .byte 0x5
633 1.1 mrg .byte 0x0
634 1.1 mrg .byte 0x3
635 1.1 mrg .byte 0x8
636 1.1 mrg .byte 0x3a
637 1.1 mrg .byte 0xb
638 1.1 mrg .byte 0x3b
639 1.1 mrg .byte 0xb
640 1.1 mrg .byte 0x49
641 1.1 mrg .byte 0x13
642 1.1 mrg .byte 0x2
643 1.1 mrg .byte 0xa
644 1.1 mrg .byte 0,0
645 1.1 mrg .byte 0x4
646 1.1 mrg .byte 0x24
647 1.1 mrg .byte 0x0
648 1.1 mrg .byte 0x3
649 1.1 mrg .byte 0x8
650 1.1 mrg .byte 0xb
651 1.1 mrg .byte 0xb
652 1.1 mrg .byte 0x3e
653 1.1 mrg .byte 0xb
654 1.1 mrg .byte 0,0
655 1.1 mrg .byte 0
656 1.1 mrg
657 1.1 mrg .section .debug_pubnames
658 1.1 mrg .ualong 0x27
659 1.1 mrg .uaword 0x2
660 1.1 mrg .ualong .Ldebug_info0
661 1.1 mrg .ualong 0xab
662 1.1 mrg .ualong 0x5b
663 1.1 mrg .string "_superh_trap_handler"
664 1.1 mrg
665 1.1 mrg .ualong 0x0
666 1.1 mrg
667 1.1 mrg .section .debug_aranges
668 1.1 mrg .ualong 0x1c
669 1.1 mrg .uaword 0x2
670 1.1 mrg .ualong .Ldebug_info0
671 1.1 mrg .byte 0x4
672 1.1 mrg .byte 0x0
673 1.1 mrg .uaword 0x0,0
674 1.1 mrg .ualong .Ltext0
675 1.1 mrg .ualong .Letext0-.Ltext0
676 1.1 mrg .ualong 0x0
677 1.1 mrg .ualong 0x0
678 1.1 mrg .ident "GCC: (GNU) 2.97-sh5-010522"
679 1.1 mrg #endif /* MMU_SUPPORT */
680 1.1 mrg #else /* ! __SH5__ */
681 1.1 mrg
682 1.1 mrg ! make a place to keep any previous value of the vbr register
683 1.1 mrg ! this will only have a value if it has been set by redboot (for example)
684 1.1 mrg .section .bss
685 1.1 mrg old_vbr:
686 1.1 mrg .long 0
687 1.1 mrg #ifdef PROFILE
688 1.1 mrg profiling_enabled:
689 1.1 mrg .long 0
690 1.1 mrg #endif
691 1.1 mrg
692 1.1 mrg
693 1.1 mrg .section .text
694 1.1 mrg .global start
695 1.1 mrg .import ___rtos_profiler_start_timer
696 1.1 mrg .weak ___rtos_profiler_start_timer
697 1.1 mrg start:
698 1.1 mrg mov.l stack_k,r15
699 1.1 mrg
700 1.1 mrg #if defined (__SH3__) || (defined (__SH_FPU_ANY__) && ! defined (__SH2A__)) || defined (__SH4_NOFPU__)
701 1.1 mrg #define VBR_SETUP
702 1.1 mrg ! before zeroing the bss ...
703 1.1 mrg ! if the vbr is already set to vbr_start then the program has been restarted
704 1.1 mrg ! (i.e. it is not the first time the program has been run since reset)
705 1.1 mrg ! reset the vbr to its old value before old_vbr (in bss) is wiped
706 1.1 mrg ! this ensures that the later code does not create a circular vbr chain
707 1.1 mrg stc vbr, r1
708 1.1 mrg mov.l vbr_start_k, r2
709 1.1 mrg cmp/eq r1, r2
710 1.1 mrg bf 0f
711 1.1 mrg ! reset the old vbr value
712 1.1 mrg mov.l old_vbr_k, r1
713 1.1 mrg mov.l @r1, r2
714 1.1 mrg ldc r2, vbr
715 1.1 mrg 0:
716 1.1 mrg #endif /* VBR_SETUP */
717 1.1 mrg
718 1.1 mrg ! zero out bss
719 1.1 mrg mov.l edata_k,r0
720 1.1 mrg mov.l end_k,r1
721 1.1 mrg mov #0,r2
722 1.1 mrg start_l:
723 1.1 mrg mov.l r2,@r0
724 1.1 mrg add #4,r0
725 1.1 mrg cmp/ge r0,r1
726 1.1 mrg bt start_l
727 1.1 mrg
728 1.1 mrg #if defined (__SH_FPU_ANY__)
729 1.1 mrg mov.l set_fpscr_k, r1
730 1.1 mrg mov #4,r4
731 1.1 mrg jsr @r1
732 1.1 mrg shll16 r4 ! Set DN bit (flush denormal inputs to zero)
733 1.1 mrg lds r3,fpscr ! Switch to default precision
734 1.1 mrg #endif /* defined (__SH_FPU_ANY__) */
735 1.1 mrg
736 1.1 mrg #ifdef VBR_SETUP
737 1.1 mrg ! save the existing contents of the vbr
738 1.1 mrg ! there will only be a prior value when using something like redboot
739 1.1 mrg ! otherwise it will be zero
740 1.1 mrg stc vbr, r1
741 1.1 mrg mov.l old_vbr_k, r2
742 1.1 mrg mov.l r1, @r2
743 1.1 mrg ! setup vbr
744 1.1 mrg mov.l vbr_start_k, r1
745 1.1 mrg ldc r1,vbr
746 1.1 mrg #endif /* VBR_SETUP */
747 1.1 mrg
748 1.1 mrg ! if an rtos is exporting a timer start fn,
749 1.1 mrg ! then pick up an SR which does not enable ints
750 1.1 mrg ! (the rtos will take care of this)
751 1.1 mrg mov.l rtos_start_fn, r0
752 1.1 mrg mov.l sr_initial_bare, r1
753 1.1 mrg tst r0, r0
754 1.1 mrg bt set_sr
755 1.1 mrg
756 1.1 mrg mov.l sr_initial_rtos, r1
757 1.1 mrg
758 1.1 mrg set_sr:
759 1.1 mrg ! Set status register (sr)
760 1.1 mrg ldc r1, sr
761 1.1 mrg
762 1.1 mrg ! arrange for exit to call fini
763 1.1 mrg mov.l atexit_k,r0
764 1.1 mrg mov.l fini_k,r4
765 1.1 mrg jsr @r0
766 1.1 mrg nop
767 1.1 mrg
768 1.1 mrg #ifdef PROFILE
769 1.1 mrg ! arrange for exit to call _mcleanup (via stop_profiling)
770 1.1 mrg mova stop_profiling,r0
771 1.1 mrg mov.l atexit_k,r1
772 1.1 mrg jsr @r1
773 1.1 mrg mov r0, r4
774 1.1 mrg
775 1.1 mrg ! Call profiler startup code
776 1.1 mrg mov.l monstartup_k, r0
777 1.1 mrg mov.l start_k, r4
778 1.1 mrg mov.l etext_k, r5
779 1.1 mrg jsr @r0
780 1.1 mrg nop
781 1.1 mrg
782 1.1 mrg ! enable profiling trap
783 1.1 mrg ! until now any trap 33s will have been ignored
784 1.1 mrg ! This means that all library functions called before this point
785 1.1 mrg ! (directly or indirectly) may have the profiling trap at the start.
786 1.1 mrg ! Therefore, only mcount itself may not have the extra header.
787 1.1 mrg mov.l profiling_enabled_k2, r0
788 1.1 mrg mov #1, r1
789 1.1 mrg mov.l r1, @r0
790 1.1 mrg #endif /* PROFILE */
791 1.1 mrg
792 1.1 mrg ! call init
793 1.1 mrg mov.l init_k,r0
794 1.1 mrg jsr @r0
795 1.1 mrg nop
796 1.1 mrg
797 1.1 mrg ! call the mainline
798 1.1 mrg mov.l main_k,r0
799 1.1 mrg jsr @r0
800 1.1 mrg nop
801 1.1 mrg
802 1.1 mrg ! call exit
803 1.1 mrg mov r0,r4
804 1.1 mrg mov.l exit_k,r0
805 1.1 mrg jsr @r0
806 1.1 mrg nop
807 1.1 mrg
808 1.1 mrg .balign 4
809 1.1 mrg #ifdef PROFILE
810 1.1 mrg stop_profiling:
811 1.1 mrg # stop mcount counting
812 1.1 mrg mov.l profiling_enabled_k2, r0
813 1.1 mrg mov #0, r1
814 1.1 mrg mov.l r1, @r0
815 1.1 mrg
816 1.1 mrg # call mcleanup
817 1.1 mrg mov.l mcleanup_k, r0
818 1.1 mrg jmp @r0
819 1.1 mrg nop
820 1.1 mrg
821 1.1 mrg .balign 4
822 1.1 mrg mcleanup_k:
823 1.1 mrg .long __mcleanup
824 1.1 mrg monstartup_k:
825 1.1 mrg .long ___monstartup
826 1.1 mrg profiling_enabled_k2:
827 1.1 mrg .long profiling_enabled
828 1.1 mrg start_k:
829 1.1 mrg .long _start
830 1.1 mrg etext_k:
831 1.1 mrg .long __etext
832 1.1 mrg #endif /* PROFILE */
833 1.1 mrg
834 1.1 mrg .align 2
835 1.1 mrg #if defined (__SH_FPU_ANY__)
836 1.1 mrg set_fpscr_k:
837 1.1 mrg .long ___set_fpscr
838 1.1 mrg #endif /* defined (__SH_FPU_ANY__) */
839 1.1 mrg
840 1.1 mrg stack_k:
841 1.1 mrg .long _stack
842 1.1 mrg edata_k:
843 1.1 mrg .long _edata
844 1.1 mrg end_k:
845 1.1 mrg .long _end
846 1.1 mrg main_k:
847 1.1 mrg .long ___setup_argv_and_call_main
848 1.1 mrg exit_k:
849 1.1 mrg .long _exit
850 1.1 mrg atexit_k:
851 1.1 mrg .long _atexit
852 1.1 mrg init_k:
853 1.1 mrg .long _init
854 1.1 mrg fini_k:
855 1.1 mrg .long _fini
856 1.1 mrg #ifdef VBR_SETUP
857 1.1 mrg old_vbr_k:
858 1.1 mrg .long old_vbr
859 1.1 mrg vbr_start_k:
860 1.1 mrg .long vbr_start
861 1.1 mrg #endif /* VBR_SETUP */
862 1.1 mrg
863 1.1 mrg sr_initial_rtos:
864 1.1 mrg ! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work.
865 1.1 mrg ! Whether profiling or not, keep interrupts masked,
866 1.1 mrg ! the RTOS will enable these if required.
867 1.1 mrg .long 0x600000f1
868 1.1 mrg
869 1.1 mrg rtos_start_fn:
870 1.1 mrg .long ___rtos_profiler_start_timer
871 1.1 mrg
872 1.1 mrg #ifdef PROFILE
873 1.1 mrg sr_initial_bare:
874 1.1 mrg ! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work.
875 1.1 mrg ! For bare machine, we need to enable interrupts to get profiling working
876 1.1 mrg .long 0x60000001
877 1.1 mrg #else
878 1.1 mrg
879 1.1 mrg sr_initial_bare:
880 1.1 mrg ! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work.
881 1.1 mrg ! Keep interrupts disabled - the application will enable as required.
882 1.1 mrg .long 0x600000f1
883 1.1 mrg #endif
884 1.1 mrg
885 1.1 mrg ! supplied for backward compatibility only, in case of linking
886 1.1 mrg ! code whose main() was compiled with an older version of GCC.
887 1.1 mrg .global ___main
888 1.1 mrg ___main:
889 1.1 mrg rts
890 1.1 mrg nop
891 1.1 mrg #ifdef VBR_SETUP
892 1.1 mrg ! Exception handlers
893 1.1 mrg .section .text.vbr, "ax"
894 1.1 mrg vbr_start:
895 1.1 mrg
896 1.1 mrg .org 0x100
897 1.1 mrg vbr_100:
898 1.1 mrg #ifdef PROFILE
899 1.1 mrg ! Note on register usage.
900 1.1 mrg ! we use r0..r3 as scratch in this code. If we are here due to a trapa for profiling
901 1.1 mrg ! then this is OK as we are just before executing any function code.
902 1.1 mrg ! The other r4..r7 we save explicityl on the stack
903 1.1 mrg ! Remaining registers are saved by normal ABI conventions and we assert we do not
904 1.1 mrg ! use floating point registers.
905 1.1 mrg mov.l expevt_k1, r1
906 1.1 mrg mov.l @r1, r1
907 1.1 mrg mov.l event_mask, r0
908 1.1 mrg and r0,r1
909 1.1 mrg mov.l trapcode_k, r2
910 1.1 mrg cmp/eq r1,r2
911 1.1 mrg bt 1f
912 1.1 mrg bra handler_100 ! if not a trapa, go to default handler
913 1.1 mrg nop
914 1.1 mrg 1:
915 1.1 mrg mov.l trapa_k, r0
916 1.1 mrg mov.l @r0, r0
917 1.1 mrg shlr2 r0 ! trapa code is shifted by 2.
918 1.1 mrg cmp/eq #33, r0
919 1.1 mrg bt 2f
920 1.1 mrg bra handler_100
921 1.1 mrg nop
922 1.1 mrg 2:
923 1.1 mrg
924 1.1 mrg ! If here then it looks like we have trap #33
925 1.1 mrg ! Now we need to call mcount with the following convention
926 1.1 mrg ! Save and restore r4..r7
927 1.1 mrg mov.l r4,@-r15
928 1.1 mrg mov.l r5,@-r15
929 1.1 mrg mov.l r6,@-r15
930 1.1 mrg mov.l r7,@-r15
931 1.1 mrg sts.l pr,@-r15
932 1.1 mrg
933 1.1 mrg ! r4 is frompc.
934 1.1 mrg ! r5 is selfpc
935 1.1 mrg ! r0 is the branch back address.
936 1.1 mrg ! The code sequence emitted by gcc for the profiling trap is
937 1.1 mrg ! .align 2
938 1.1 mrg ! trapa #33
939 1.1 mrg ! .align 2
940 1.1 mrg ! .long lab Where lab is planted by the compiler. This is the address
941 1.1 mrg ! of a datum that needs to be incremented.
942 1.1 mrg sts pr, r4 ! frompc
943 1.1 mrg stc spc, r5 ! selfpc
944 1.1 mrg mov #2, r2
945 1.1 mrg not r2, r2 ! pattern to align to 4
946 1.1 mrg and r2, r5 ! r5 now has aligned address
947 1.1 mrg ! add #4, r5 ! r5 now has address of address
948 1.1 mrg mov r5, r2 ! Remember it.
949 1.1 mrg ! mov.l @r5, r5 ! r5 has value of lable (lab in above example)
950 1.1 mrg add #8, r2
951 1.1 mrg ldc r2, spc ! our return address avoiding address word
952 1.1 mrg
953 1.1 mrg ! only call mcount if profiling is enabled
954 1.1 mrg mov.l profiling_enabled_k, r0
955 1.1 mrg mov.l @r0, r0
956 1.1 mrg cmp/eq #0, r0
957 1.1 mrg bt 3f
958 1.1 mrg ! call mcount
959 1.1 mrg mov.l mcount_k, r2
960 1.1 mrg jsr @r2
961 1.1 mrg nop
962 1.1 mrg 3:
963 1.1 mrg lds.l @r15+,pr
964 1.1 mrg mov.l @r15+,r7
965 1.1 mrg mov.l @r15+,r6
966 1.1 mrg mov.l @r15+,r5
967 1.1 mrg mov.l @r15+,r4
968 1.1 mrg rte
969 1.1 mrg nop
970 1.1 mrg .balign 4
971 1.1 mrg event_mask:
972 1.1 mrg .long 0xfff
973 1.1 mrg trapcode_k:
974 1.1 mrg .long 0x160
975 1.1 mrg expevt_k1:
976 1.1 mrg .long 0xff000024 ! Address of expevt
977 1.1 mrg trapa_k:
978 1.1 mrg .long 0xff000020
979 1.1 mrg mcount_k:
980 1.1 mrg .long __call_mcount
981 1.1 mrg profiling_enabled_k:
982 1.1 mrg .long profiling_enabled
983 1.1 mrg #endif
984 1.1 mrg ! Non profiling case.
985 1.1 mrg handler_100:
986 1.1 mrg mov.l 2f, r0 ! load the old vbr setting (if any)
987 1.1 mrg mov.l @r0, r0
988 1.1 mrg cmp/eq #0, r0
989 1.1 mrg bf 1f
990 1.1 mrg ! no previous vbr - jump to own generic handler
991 1.1 mrg bra handler
992 1.1 mrg nop
993 1.1 mrg 1: ! there was a previous handler - chain them
994 1.1 mrg add #0x7f, r0 ! 0x7f
995 1.1 mrg add #0x7f, r0 ! 0xfe
996 1.1 mrg add #0x2, r0 ! add 0x100 without corrupting another register
997 1.1 mrg jmp @r0
998 1.1 mrg nop
999 1.1 mrg .balign 4
1000 1.1 mrg 2:
1001 1.1 mrg .long old_vbr
1002 1.1 mrg
1003 1.1 mrg .org 0x400
1004 1.1 mrg vbr_400: ! Should be at vbr+0x400
1005 1.1 mrg mov.l 2f, r0 ! load the old vbr setting (if any)
1006 1.1 mrg mov.l @r0, r0
1007 1.1 mrg cmp/eq #0, r0
1008 1.1 mrg ! no previous vbr - jump to own generic handler
1009 1.1 mrg bt handler
1010 1.1 mrg ! there was a previous handler - chain them
1011 1.1 mrg rotcr r0
1012 1.1 mrg rotcr r0
1013 1.1 mrg add #0x7f, r0 ! 0x1fc
1014 1.1 mrg add #0x7f, r0 ! 0x3f8
1015 1.1 mrg add #0x02, r0 ! 0x400
1016 1.1 mrg rotcl r0
1017 1.1 mrg rotcl r0 ! Add 0x400 without corrupting another register
1018 1.1 mrg jmp @r0
1019 1.1 mrg nop
1020 1.1 mrg .balign 4
1021 1.1 mrg 2:
1022 1.1 mrg .long old_vbr
1023 1.1 mrg handler:
1024 1.1 mrg /* If the trap handler is there call it */
1025 1.1 mrg mov.l superh_trap_handler_k, r0
1026 1.1 mrg cmp/eq #0, r0 ! True if zero.
1027 1.1 mrg bf 3f
1028 1.1 mrg bra chandler
1029 1.1 mrg nop
1030 1.1 mrg 3:
1031 1.1 mrg ! Here handler available, call it.
1032 1.1 mrg /* Now call the trap handler with as much of the context unchanged as possible.
1033 1.1 mrg Move trapping address into PR to make it look like the trap point */
1034 1.1 mrg stc spc, r1
1035 1.1 mrg lds r1, pr
1036 1.1 mrg mov.l expevt_k, r4
1037 1.1 mrg mov.l @r4, r4 ! r4 is value of expevt, first parameter.
1038 1.1 mrg mov r1, r5 ! Remember trapping pc.
1039 1.1 mrg mov r1, r6 ! Remember trapping pc.
1040 1.1 mrg mov.l chandler_k, r1
1041 1.1 mrg mov.l superh_trap_handler_k, r2
1042 1.1 mrg ! jmp to trap handler to avoid disturbing pr.
1043 1.1 mrg jmp @r2
1044 1.1 mrg nop
1045 1.1 mrg
1046 1.1 mrg .org 0x600
1047 1.1 mrg vbr_600:
1048 1.1 mrg #ifdef PROFILE
1049 1.1 mrg ! Should be at vbr+0x600
1050 1.1 mrg ! Now we are in the land of interrupts so need to save more state.
1051 1.1 mrg ! Save register state
1052 1.1 mrg mov.l interrupt_stack_k, r15 ! r15 has been saved to sgr.
1053 1.1 mrg mov.l r0,@-r15
1054 1.1 mrg mov.l r1,@-r15
1055 1.1 mrg mov.l r2,@-r15
1056 1.1 mrg mov.l r3,@-r15
1057 1.1 mrg mov.l r4,@-r15
1058 1.1 mrg mov.l r5,@-r15
1059 1.1 mrg mov.l r6,@-r15
1060 1.1 mrg mov.l r7,@-r15
1061 1.1 mrg sts.l pr,@-r15
1062 1.1 mrg sts.l mach,@-r15
1063 1.1 mrg sts.l macl,@-r15
1064 1.1 mrg #if defined(__SH_FPU_ANY__)
1065 1.1 mrg ! Save fpul and fpscr, save fr0-fr7 in 64 bit mode
1066 1.1 mrg ! and set the pervading precision for the timer_handler
1067 1.1 mrg mov #0,r0
1068 1.1 mrg sts.l fpul,@-r15
1069 1.1 mrg sts.l fpscr,@-r15
1070 1.1 mrg lds r0,fpscr ! Clear fpscr
1071 1.1 mrg fmov fr0,@-r15
1072 1.1 mrg fmov fr1,@-r15
1073 1.1 mrg fmov fr2,@-r15
1074 1.1 mrg fmov fr3,@-r15
1075 1.1 mrg mov.l pervading_precision_k,r0
1076 1.1 mrg fmov fr4,@-r15
1077 1.1 mrg fmov fr5,@-r15
1078 1.1 mrg mov.l @r0,r0
1079 1.1 mrg fmov fr6,@-r15
1080 1.1 mrg fmov fr7,@-r15
1081 1.1 mrg lds r0,fpscr
1082 1.1 mrg #endif /* __SH_FPU_ANY__ */
1083 1.1 mrg ! Pass interrupted pc to timer_handler as first parameter (r4).
1084 1.1 mrg stc spc, r4
1085 1.1 mrg mov.l timer_handler_k, r0
1086 1.1 mrg jsr @r0
1087 1.1 mrg nop
1088 1.1 mrg #if defined(__SH_FPU_ANY__)
1089 1.1 mrg mov #0,r0
1090 1.1 mrg lds r0,fpscr ! Clear the fpscr
1091 1.1 mrg fmov @r15+,fr7
1092 1.1 mrg fmov @r15+,fr6
1093 1.1 mrg fmov @r15+,fr5
1094 1.1 mrg fmov @r15+,fr4
1095 1.1 mrg fmov @r15+,fr3
1096 1.1 mrg fmov @r15+,fr2
1097 1.1 mrg fmov @r15+,fr1
1098 1.1 mrg fmov @r15+,fr0
1099 1.1 mrg lds.l @r15+,fpscr
1100 1.1 mrg lds.l @r15+,fpul
1101 1.1 mrg #endif /* __SH_FPU_ANY__ */
1102 1.1 mrg lds.l @r15+,macl
1103 1.1 mrg lds.l @r15+,mach
1104 1.1 mrg lds.l @r15+,pr
1105 1.1 mrg mov.l @r15+,r7
1106 1.1 mrg mov.l @r15+,r6
1107 1.1 mrg mov.l @r15+,r5
1108 1.1 mrg mov.l @r15+,r4
1109 1.1 mrg mov.l @r15+,r3
1110 1.1 mrg mov.l @r15+,r2
1111 1.1 mrg mov.l @r15+,r1
1112 1.1 mrg mov.l @r15+,r0
1113 1.1 mrg stc sgr, r15 ! Restore r15, destroyed by this sequence.
1114 1.1 mrg rte
1115 1.1 mrg nop
1116 1.1 mrg #if defined(__SH_FPU_ANY__)
1117 1.1 mrg .balign 4
1118 1.1 mrg pervading_precision_k:
1119 1.1 mrg #define CONCAT1(A,B) A##B
1120 1.1 mrg #define CONCAT(A,B) CONCAT1(A,B)
1121 1.1 mrg .long CONCAT(__USER_LABEL_PREFIX__,__fpscr_values)+4
1122 1.1 mrg #endif
1123 1.1 mrg #else
1124 1.1 mrg mov.l 2f, r0 ! Load the old vbr setting (if any).
1125 1.1 mrg mov.l @r0, r0
1126 1.1 mrg cmp/eq #0, r0
1127 1.1 mrg ! no previous vbr - jump to own handler
1128 1.1 mrg bt chandler
1129 1.1 mrg ! there was a previous handler - chain them
1130 1.1 mrg rotcr r0
1131 1.1 mrg rotcr r0
1132 1.1 mrg add #0x7f, r0 ! 0x1fc
1133 1.1 mrg add #0x7f, r0 ! 0x3f8
1134 1.1 mrg add #0x7f, r0 ! 0x5f4
1135 1.1 mrg add #0x03, r0 ! 0x600
1136 1.1 mrg rotcl r0
1137 1.1 mrg rotcl r0 ! Add 0x600 without corrupting another register
1138 1.1 mrg jmp @r0
1139 1.1 mrg nop
1140 1.1 mrg .balign 4
1141 1.1 mrg 2:
1142 1.1 mrg .long old_vbr
1143 1.1 mrg #endif /* PROFILE code */
1144 1.1 mrg chandler:
1145 1.1 mrg mov.l expevt_k, r4
1146 1.1 mrg mov.l @r4, r4 ! r4 is value of expevt hence making this the return code
1147 1.1 mrg mov.l handler_exit_k,r0
1148 1.1 mrg jsr @r0
1149 1.1 mrg nop
1150 1.1 mrg ! We should never return from _exit but in case we do we would enter the
1151 1.1 mrg ! the following tight loop
1152 1.1 mrg limbo:
1153 1.1 mrg bra limbo
1154 1.1 mrg nop
1155 1.1 mrg .balign 4
1156 1.1 mrg #ifdef PROFILE
1157 1.1 mrg interrupt_stack_k:
1158 1.1 mrg .long __timer_stack ! The high end of the stack
1159 1.1 mrg timer_handler_k:
1160 1.1 mrg .long __profil_counter
1161 1.1 mrg #endif
1162 1.1 mrg expevt_k:
1163 1.1 mrg .long 0xff000024 ! Address of expevt
1164 1.1 mrg chandler_k:
1165 1.1 mrg .long chandler
1166 1.1 mrg superh_trap_handler_k:
1167 1.1 mrg .long __superh_trap_handler
1168 1.1 mrg handler_exit_k:
1169 1.1 mrg .long _exit
1170 1.1 mrg .align 2
1171 1.1 mrg ! Simulated compile of trap handler.
1172 1.1 mrg .section .debug_abbrev,"",@progbits
1173 1.1 mrg .Ldebug_abbrev0:
1174 1.1 mrg .section .debug_info,"",@progbits
1175 1.1 mrg .Ldebug_info0:
1176 1.1 mrg .section .debug_line,"",@progbits
1177 1.1 mrg .Ldebug_line0:
1178 1.1 mrg .text
1179 1.1 mrg .Ltext0:
1180 1.1 mrg .align 5
1181 1.1 mrg .type __superh_trap_handler,@function
1182 1.1 mrg __superh_trap_handler:
1183 1.1 mrg .LFB1:
1184 1.1 mrg mov.l r14,@-r15
1185 1.1 mrg .LCFI0:
1186 1.1 mrg add #-4,r15
1187 1.1 mrg .LCFI1:
1188 1.1 mrg mov r15,r14
1189 1.1 mrg .LCFI2:
1190 1.1 mrg mov.l r4,@r14
1191 1.1 mrg lds r1, pr
1192 1.1 mrg add #4,r14
1193 1.1 mrg mov r14,r15
1194 1.1 mrg mov.l @r15+,r14
1195 1.1 mrg rts
1196 1.1 mrg nop
1197 1.1 mrg .LFE1:
1198 1.1 mrg .Lfe1:
1199 1.1 mrg .size __superh_trap_handler,.Lfe1-__superh_trap_handler
1200 1.1 mrg .section .debug_frame,"",@progbits
1201 1.1 mrg .Lframe0:
1202 1.1 mrg .ualong .LECIE0-.LSCIE0
1203 1.1 mrg .LSCIE0:
1204 1.1 mrg .ualong 0xffffffff
1205 1.1 mrg .byte 0x1
1206 1.1 mrg .string ""
1207 1.1 mrg .uleb128 0x1
1208 1.1 mrg .sleb128 -4
1209 1.1 mrg .byte 0x11
1210 1.1 mrg .byte 0xc
1211 1.1 mrg .uleb128 0xf
1212 1.1 mrg .uleb128 0x0
1213 1.1 mrg .align 2
1214 1.1 mrg .LECIE0:
1215 1.1 mrg .LSFDE0:
1216 1.1 mrg .ualong .LEFDE0-.LASFDE0
1217 1.1 mrg .LASFDE0:
1218 1.1 mrg .ualong .Lframe0
1219 1.1 mrg .ualong .LFB1
1220 1.1 mrg .ualong .LFE1-.LFB1
1221 1.1 mrg .byte 0x4
1222 1.1 mrg .ualong .LCFI0-.LFB1
1223 1.1 mrg .byte 0xe
1224 1.1 mrg .uleb128 0x4
1225 1.1 mrg .byte 0x4
1226 1.1 mrg .ualong .LCFI1-.LCFI0
1227 1.1 mrg .byte 0xe
1228 1.1 mrg .uleb128 0x8
1229 1.1 mrg .byte 0x8e
1230 1.1 mrg .uleb128 0x1
1231 1.1 mrg .byte 0x4
1232 1.1 mrg .ualong .LCFI2-.LCFI1
1233 1.1 mrg .byte 0xd
1234 1.1 mrg .uleb128 0xe
1235 1.1 mrg .align 2
1236 1.1 mrg .LEFDE0:
1237 1.1 mrg .text
1238 1.1 mrg .Letext0:
1239 1.1 mrg .section .debug_info
1240 1.1 mrg .ualong 0xb3
1241 1.1 mrg .uaword 0x2
1242 1.1 mrg .ualong .Ldebug_abbrev0
1243 1.1 mrg .byte 0x4
1244 1.1 mrg .uleb128 0x1
1245 1.1 mrg .ualong .Ldebug_line0
1246 1.1 mrg .ualong .Letext0
1247 1.1 mrg .ualong .Ltext0
1248 1.1 mrg .string "trap_handler.c"
1249 1.1 mrg .string "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
1250 1.1 mrg .string "GNU C 3.2 20020529 (experimental)"
1251 1.1 mrg .byte 0x1
1252 1.1 mrg .uleb128 0x2
1253 1.1 mrg .ualong 0xa6
1254 1.1 mrg .byte 0x1
1255 1.1 mrg .string "_superh_trap_handler"
1256 1.1 mrg .byte 0x1
1257 1.1 mrg .byte 0x2
1258 1.1 mrg .byte 0x1
1259 1.1 mrg .ualong .LFB1
1260 1.1 mrg .ualong .LFE1
1261 1.1 mrg .byte 0x1
1262 1.1 mrg .byte 0x5e
1263 1.1 mrg .uleb128 0x3
1264 1.1 mrg .string "trap_reason"
1265 1.1 mrg .byte 0x1
1266 1.1 mrg .byte 0x1
1267 1.1 mrg .ualong 0xa6
1268 1.1 mrg .byte 0x2
1269 1.1 mrg .byte 0x91
1270 1.1 mrg .sleb128 0
1271 1.1 mrg .byte 0x0
1272 1.1 mrg .uleb128 0x4
1273 1.1 mrg .string "unsigned int"
1274 1.1 mrg .byte 0x4
1275 1.1 mrg .byte 0x7
1276 1.1 mrg .byte 0x0
1277 1.1 mrg .section .debug_abbrev
1278 1.1 mrg .uleb128 0x1
1279 1.1 mrg .uleb128 0x11
1280 1.1 mrg .byte 0x1
1281 1.1 mrg .uleb128 0x10
1282 1.1 mrg .uleb128 0x6
1283 1.1 mrg .uleb128 0x12
1284 1.1 mrg .uleb128 0x1
1285 1.1 mrg .uleb128 0x11
1286 1.1 mrg .uleb128 0x1
1287 1.1 mrg .uleb128 0x3
1288 1.1 mrg .uleb128 0x8
1289 1.1 mrg .uleb128 0x1b
1290 1.1 mrg .uleb128 0x8
1291 1.1 mrg .uleb128 0x25
1292 1.1 mrg .uleb128 0x8
1293 1.1 mrg .uleb128 0x13
1294 1.1 mrg .uleb128 0xb
1295 1.1 mrg .byte 0x0
1296 1.1 mrg .byte 0x0
1297 1.1 mrg .uleb128 0x2
1298 1.1 mrg .uleb128 0x2e
1299 1.1 mrg .byte 0x1
1300 1.1 mrg .uleb128 0x1
1301 1.1 mrg .uleb128 0x13
1302 1.1 mrg .uleb128 0x3f
1303 1.1 mrg .uleb128 0xc
1304 1.1 mrg .uleb128 0x3
1305 1.1 mrg .uleb128 0x8
1306 1.1 mrg .uleb128 0x3a
1307 1.1 mrg .uleb128 0xb
1308 1.1 mrg .uleb128 0x3b
1309 1.1 mrg .uleb128 0xb
1310 1.1 mrg .uleb128 0x27
1311 1.1 mrg .uleb128 0xc
1312 1.1 mrg .uleb128 0x11
1313 1.1 mrg .uleb128 0x1
1314 1.1 mrg .uleb128 0x12
1315 1.1 mrg .uleb128 0x1
1316 1.1 mrg .uleb128 0x40
1317 1.1 mrg .uleb128 0xa
1318 1.1 mrg .byte 0x0
1319 1.1 mrg .byte 0x0
1320 1.1 mrg .uleb128 0x3
1321 1.1 mrg .uleb128 0x5
1322 1.1 mrg .byte 0x0
1323 1.1 mrg .uleb128 0x3
1324 1.1 mrg .uleb128 0x8
1325 1.1 mrg .uleb128 0x3a
1326 1.1 mrg .uleb128 0xb
1327 1.1 mrg .uleb128 0x3b
1328 1.1 mrg .uleb128 0xb
1329 1.1 mrg .uleb128 0x49
1330 1.1 mrg .uleb128 0x13
1331 1.1 mrg .uleb128 0x2
1332 1.1 mrg .uleb128 0xa
1333 1.1 mrg .byte 0x0
1334 1.1 mrg .byte 0x0
1335 1.1 mrg .uleb128 0x4
1336 1.1 mrg .uleb128 0x24
1337 1.1 mrg .byte 0x0
1338 1.1 mrg .uleb128 0x3
1339 1.1 mrg .uleb128 0x8
1340 1.1 mrg .uleb128 0xb
1341 1.1 mrg .uleb128 0xb
1342 1.1 mrg .uleb128 0x3e
1343 1.1 mrg .uleb128 0xb
1344 1.1 mrg .byte 0x0
1345 1.1 mrg .byte 0x0
1346 1.1 mrg .byte 0x0
1347 1.1 mrg .section .debug_pubnames,"",@progbits
1348 1.1 mrg .ualong 0x27
1349 1.1 mrg .uaword 0x2
1350 1.1 mrg .ualong .Ldebug_info0
1351 1.1 mrg .ualong 0xb7
1352 1.1 mrg .ualong 0x67
1353 1.1 mrg .string "_superh_trap_handler"
1354 1.1 mrg .ualong 0x0
1355 1.1 mrg .section .debug_aranges,"",@progbits
1356 1.1 mrg .ualong 0x1c
1357 1.1 mrg .uaword 0x2
1358 1.1 mrg .ualong .Ldebug_info0
1359 1.1 mrg .byte 0x4
1360 1.1 mrg .byte 0x0
1361 1.1 mrg .uaword 0x0
1362 1.1 mrg .uaword 0x0
1363 1.1 mrg .ualong .Ltext0
1364 1.1 mrg .ualong .Letext0-.Ltext0
1365 1.1 mrg .ualong 0x0
1366 1.1 mrg .ualong 0x0
1367 1.1 mrg #endif /* VBR_SETUP */
1368 1.1 mrg #endif /* ! __SH5__ */
1369