1 1.1.1.11 mrg /* Copyright (C) 2000-2024 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.1.2 mrg #include "crt.h" 26 1.1 mrg 27 1.1 mrg #ifdef MMU_SUPPORT 28 1.1 mrg /* Section used for exception/timer interrupt stack area */ 29 1.1 mrg .section .data.vbr.stack,"aw" 30 1.1 mrg .align 4 31 1.1 mrg .global __ST_VBR 32 1.1 mrg __ST_VBR: 33 1.1 mrg .zero 1024 * 2 /* ; 2k for VBR handlers */ 34 1.1 mrg /* Label at the highest stack address where the stack grows from */ 35 1.1 mrg __timer_stack: 36 1.1 mrg #endif /* MMU_SUPPORT */ 37 1.1 mrg 38 1.1 mrg /* ;---------------------------------------- 39 1.1 mrg Normal newlib crt1.S */ 40 1.1 mrg 41 1.1 mrg ! make a place to keep any previous value of the vbr register 42 1.1 mrg ! this will only have a value if it has been set by redboot (for example) 43 1.1 mrg .section .bss 44 1.1 mrg old_vbr: 45 1.1 mrg .long 0 46 1.1 mrg #ifdef PROFILE 47 1.1 mrg profiling_enabled: 48 1.1 mrg .long 0 49 1.1 mrg #endif 50 1.1 mrg 51 1.1 mrg 52 1.1 mrg .section .text 53 1.1 mrg .global start 54 1.1 mrg .import ___rtos_profiler_start_timer 55 1.1 mrg .weak ___rtos_profiler_start_timer 56 1.1 mrg start: 57 1.1 mrg mov.l stack_k,r15 58 1.1 mrg 59 1.1.1.2 mrg #if defined (__SH3__) || (defined (__SH_FPU_ANY__) && ! defined (__SH2E__) && ! defined (__SH2A__)) || defined (__SH4_NOFPU__) 60 1.1 mrg #define VBR_SETUP 61 1.1 mrg ! before zeroing the bss ... 62 1.1 mrg ! if the vbr is already set to vbr_start then the program has been restarted 63 1.1 mrg ! (i.e. it is not the first time the program has been run since reset) 64 1.1 mrg ! reset the vbr to its old value before old_vbr (in bss) is wiped 65 1.1 mrg ! this ensures that the later code does not create a circular vbr chain 66 1.1 mrg stc vbr, r1 67 1.1 mrg mov.l vbr_start_k, r2 68 1.1 mrg cmp/eq r1, r2 69 1.1 mrg bf 0f 70 1.1 mrg ! reset the old vbr value 71 1.1 mrg mov.l old_vbr_k, r1 72 1.1 mrg mov.l @r1, r2 73 1.1 mrg ldc r2, vbr 74 1.1 mrg 0: 75 1.1 mrg #endif /* VBR_SETUP */ 76 1.1 mrg 77 1.1 mrg ! zero out bss 78 1.1 mrg mov.l edata_k,r0 79 1.1 mrg mov.l end_k,r1 80 1.1 mrg mov #0,r2 81 1.1 mrg start_l: 82 1.1 mrg mov.l r2,@r0 83 1.1 mrg add #4,r0 84 1.1 mrg cmp/ge r0,r1 85 1.1 mrg bt start_l 86 1.1 mrg 87 1.1 mrg #if defined (__SH_FPU_ANY__) 88 1.1 mrg mov.l set_fpscr_k, r1 89 1.1 mrg mov #4,r4 90 1.1 mrg jsr @r1 91 1.1 mrg shll16 r4 ! Set DN bit (flush denormal inputs to zero) 92 1.1 mrg lds r3,fpscr ! Switch to default precision 93 1.1 mrg #endif /* defined (__SH_FPU_ANY__) */ 94 1.1 mrg 95 1.1 mrg #ifdef VBR_SETUP 96 1.1 mrg ! save the existing contents of the vbr 97 1.1 mrg ! there will only be a prior value when using something like redboot 98 1.1 mrg ! otherwise it will be zero 99 1.1 mrg stc vbr, r1 100 1.1 mrg mov.l old_vbr_k, r2 101 1.1 mrg mov.l r1, @r2 102 1.1 mrg ! setup vbr 103 1.1 mrg mov.l vbr_start_k, r1 104 1.1 mrg ldc r1,vbr 105 1.1 mrg #endif /* VBR_SETUP */ 106 1.1 mrg 107 1.1 mrg ! if an rtos is exporting a timer start fn, 108 1.1 mrg ! then pick up an SR which does not enable ints 109 1.1 mrg ! (the rtos will take care of this) 110 1.1 mrg mov.l rtos_start_fn, r0 111 1.1 mrg mov.l sr_initial_bare, r1 112 1.1 mrg tst r0, r0 113 1.1 mrg bt set_sr 114 1.1 mrg 115 1.1 mrg mov.l sr_initial_rtos, r1 116 1.1 mrg 117 1.1 mrg set_sr: 118 1.1 mrg ! Set status register (sr) 119 1.1 mrg ldc r1, sr 120 1.1 mrg 121 1.1 mrg ! arrange for exit to call fini 122 1.1 mrg mov.l atexit_k,r0 123 1.1 mrg mov.l fini_k,r4 124 1.1 mrg jsr @r0 125 1.1 mrg nop 126 1.1 mrg 127 1.1 mrg #ifdef PROFILE 128 1.1 mrg ! arrange for exit to call _mcleanup (via stop_profiling) 129 1.1 mrg mova stop_profiling,r0 130 1.1 mrg mov.l atexit_k,r1 131 1.1 mrg jsr @r1 132 1.1 mrg mov r0, r4 133 1.1 mrg 134 1.1 mrg ! Call profiler startup code 135 1.1 mrg mov.l monstartup_k, r0 136 1.1 mrg mov.l start_k, r4 137 1.1 mrg mov.l etext_k, r5 138 1.1 mrg jsr @r0 139 1.1 mrg nop 140 1.1 mrg 141 1.1 mrg ! enable profiling trap 142 1.1 mrg ! until now any trap 33s will have been ignored 143 1.1 mrg ! This means that all library functions called before this point 144 1.1 mrg ! (directly or indirectly) may have the profiling trap at the start. 145 1.1 mrg ! Therefore, only mcount itself may not have the extra header. 146 1.1 mrg mov.l profiling_enabled_k2, r0 147 1.1 mrg mov #1, r1 148 1.1 mrg mov.l r1, @r0 149 1.1 mrg #endif /* PROFILE */ 150 1.1 mrg 151 1.1 mrg ! call init 152 1.1 mrg mov.l init_k,r0 153 1.1 mrg jsr @r0 154 1.1 mrg nop 155 1.1 mrg 156 1.1 mrg ! call the mainline 157 1.1 mrg mov.l main_k,r0 158 1.1 mrg jsr @r0 159 1.1 mrg nop 160 1.1 mrg 161 1.1 mrg ! call exit 162 1.1 mrg mov r0,r4 163 1.1 mrg mov.l exit_k,r0 164 1.1 mrg jsr @r0 165 1.1 mrg nop 166 1.1 mrg 167 1.1 mrg .balign 4 168 1.1 mrg #ifdef PROFILE 169 1.1 mrg stop_profiling: 170 1.1 mrg # stop mcount counting 171 1.1 mrg mov.l profiling_enabled_k2, r0 172 1.1 mrg mov #0, r1 173 1.1 mrg mov.l r1, @r0 174 1.1 mrg 175 1.1 mrg # call mcleanup 176 1.1 mrg mov.l mcleanup_k, r0 177 1.1 mrg jmp @r0 178 1.1 mrg nop 179 1.1 mrg 180 1.1 mrg .balign 4 181 1.1 mrg mcleanup_k: 182 1.1 mrg .long __mcleanup 183 1.1 mrg monstartup_k: 184 1.1 mrg .long ___monstartup 185 1.1 mrg profiling_enabled_k2: 186 1.1 mrg .long profiling_enabled 187 1.1 mrg start_k: 188 1.1 mrg .long _start 189 1.1 mrg etext_k: 190 1.1 mrg .long __etext 191 1.1 mrg #endif /* PROFILE */ 192 1.1 mrg 193 1.1 mrg .align 2 194 1.1 mrg #if defined (__SH_FPU_ANY__) 195 1.1 mrg set_fpscr_k: 196 1.1 mrg .long ___set_fpscr 197 1.1 mrg #endif /* defined (__SH_FPU_ANY__) */ 198 1.1 mrg 199 1.1 mrg stack_k: 200 1.1 mrg .long _stack 201 1.1 mrg edata_k: 202 1.1 mrg .long _edata 203 1.1 mrg end_k: 204 1.1 mrg .long _end 205 1.1 mrg main_k: 206 1.1 mrg .long ___setup_argv_and_call_main 207 1.1 mrg exit_k: 208 1.1 mrg .long _exit 209 1.1 mrg atexit_k: 210 1.1 mrg .long _atexit 211 1.1 mrg init_k: 212 1.1.1.2 mrg .long GLOBAL(_init) 213 1.1 mrg fini_k: 214 1.1.1.2 mrg .long GLOBAL(_fini) 215 1.1 mrg #ifdef VBR_SETUP 216 1.1 mrg old_vbr_k: 217 1.1 mrg .long old_vbr 218 1.1 mrg vbr_start_k: 219 1.1 mrg .long vbr_start 220 1.1 mrg #endif /* VBR_SETUP */ 221 1.1 mrg 222 1.1 mrg sr_initial_rtos: 223 1.1 mrg ! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work. 224 1.1 mrg ! Whether profiling or not, keep interrupts masked, 225 1.1 mrg ! the RTOS will enable these if required. 226 1.1 mrg .long 0x600000f1 227 1.1 mrg 228 1.1 mrg rtos_start_fn: 229 1.1 mrg .long ___rtos_profiler_start_timer 230 1.1 mrg 231 1.1 mrg #ifdef PROFILE 232 1.1 mrg sr_initial_bare: 233 1.1 mrg ! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work. 234 1.1 mrg ! For bare machine, we need to enable interrupts to get profiling working 235 1.1 mrg .long 0x60000001 236 1.1 mrg #else 237 1.1 mrg 238 1.1 mrg sr_initial_bare: 239 1.1 mrg ! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work. 240 1.1 mrg ! Keep interrupts disabled - the application will enable as required. 241 1.1 mrg .long 0x600000f1 242 1.1 mrg #endif 243 1.1 mrg 244 1.1 mrg ! supplied for backward compatibility only, in case of linking 245 1.1 mrg ! code whose main() was compiled with an older version of GCC. 246 1.1 mrg .global ___main 247 1.1 mrg ___main: 248 1.1 mrg rts 249 1.1 mrg nop 250 1.1 mrg #ifdef VBR_SETUP 251 1.1 mrg ! Exception handlers 252 1.1 mrg .section .text.vbr, "ax" 253 1.1 mrg vbr_start: 254 1.1 mrg 255 1.1 mrg .org 0x100 256 1.1 mrg vbr_100: 257 1.1 mrg #ifdef PROFILE 258 1.1 mrg ! Note on register usage. 259 1.1 mrg ! we use r0..r3 as scratch in this code. If we are here due to a trapa for profiling 260 1.1 mrg ! then this is OK as we are just before executing any function code. 261 1.1 mrg ! The other r4..r7 we save explicityl on the stack 262 1.1 mrg ! Remaining registers are saved by normal ABI conventions and we assert we do not 263 1.1 mrg ! use floating point registers. 264 1.1 mrg mov.l expevt_k1, r1 265 1.1 mrg mov.l @r1, r1 266 1.1 mrg mov.l event_mask, r0 267 1.1 mrg and r0,r1 268 1.1 mrg mov.l trapcode_k, r2 269 1.1 mrg cmp/eq r1,r2 270 1.1 mrg bt 1f 271 1.1 mrg bra handler_100 ! if not a trapa, go to default handler 272 1.1 mrg nop 273 1.1 mrg 1: 274 1.1 mrg mov.l trapa_k, r0 275 1.1 mrg mov.l @r0, r0 276 1.1 mrg shlr2 r0 ! trapa code is shifted by 2. 277 1.1 mrg cmp/eq #33, r0 278 1.1 mrg bt 2f 279 1.1 mrg bra handler_100 280 1.1 mrg nop 281 1.1 mrg 2: 282 1.1 mrg 283 1.1 mrg ! If here then it looks like we have trap #33 284 1.1 mrg ! Now we need to call mcount with the following convention 285 1.1 mrg ! Save and restore r4..r7 286 1.1 mrg mov.l r4,@-r15 287 1.1 mrg mov.l r5,@-r15 288 1.1 mrg mov.l r6,@-r15 289 1.1 mrg mov.l r7,@-r15 290 1.1 mrg sts.l pr,@-r15 291 1.1 mrg 292 1.1 mrg ! r4 is frompc. 293 1.1 mrg ! r5 is selfpc 294 1.1 mrg ! r0 is the branch back address. 295 1.1 mrg ! The code sequence emitted by gcc for the profiling trap is 296 1.1 mrg ! .align 2 297 1.1 mrg ! trapa #33 298 1.1 mrg ! .align 2 299 1.1 mrg ! .long lab Where lab is planted by the compiler. This is the address 300 1.1 mrg ! of a datum that needs to be incremented. 301 1.1 mrg sts pr, r4 ! frompc 302 1.1 mrg stc spc, r5 ! selfpc 303 1.1 mrg mov #2, r2 304 1.1 mrg not r2, r2 ! pattern to align to 4 305 1.1 mrg and r2, r5 ! r5 now has aligned address 306 1.1 mrg ! add #4, r5 ! r5 now has address of address 307 1.1 mrg mov r5, r2 ! Remember it. 308 1.1 mrg ! mov.l @r5, r5 ! r5 has value of lable (lab in above example) 309 1.1 mrg add #8, r2 310 1.1 mrg ldc r2, spc ! our return address avoiding address word 311 1.1 mrg 312 1.1 mrg ! only call mcount if profiling is enabled 313 1.1 mrg mov.l profiling_enabled_k, r0 314 1.1 mrg mov.l @r0, r0 315 1.1 mrg cmp/eq #0, r0 316 1.1 mrg bt 3f 317 1.1 mrg ! call mcount 318 1.1 mrg mov.l mcount_k, r2 319 1.1 mrg jsr @r2 320 1.1 mrg nop 321 1.1 mrg 3: 322 1.1 mrg lds.l @r15+,pr 323 1.1 mrg mov.l @r15+,r7 324 1.1 mrg mov.l @r15+,r6 325 1.1 mrg mov.l @r15+,r5 326 1.1 mrg mov.l @r15+,r4 327 1.1 mrg rte 328 1.1 mrg nop 329 1.1 mrg .balign 4 330 1.1 mrg event_mask: 331 1.1 mrg .long 0xfff 332 1.1 mrg trapcode_k: 333 1.1 mrg .long 0x160 334 1.1 mrg expevt_k1: 335 1.1 mrg .long 0xff000024 ! Address of expevt 336 1.1 mrg trapa_k: 337 1.1 mrg .long 0xff000020 338 1.1 mrg mcount_k: 339 1.1 mrg .long __call_mcount 340 1.1 mrg profiling_enabled_k: 341 1.1 mrg .long profiling_enabled 342 1.1 mrg #endif 343 1.1 mrg ! Non profiling case. 344 1.1 mrg handler_100: 345 1.1 mrg mov.l 2f, r0 ! load the old vbr setting (if any) 346 1.1 mrg mov.l @r0, r0 347 1.1 mrg cmp/eq #0, r0 348 1.1 mrg bf 1f 349 1.1 mrg ! no previous vbr - jump to own generic handler 350 1.1 mrg bra handler 351 1.1 mrg nop 352 1.1 mrg 1: ! there was a previous handler - chain them 353 1.1 mrg add #0x7f, r0 ! 0x7f 354 1.1 mrg add #0x7f, r0 ! 0xfe 355 1.1 mrg add #0x2, r0 ! add 0x100 without corrupting another register 356 1.1 mrg jmp @r0 357 1.1 mrg nop 358 1.1 mrg .balign 4 359 1.1 mrg 2: 360 1.1 mrg .long old_vbr 361 1.1 mrg 362 1.1 mrg .org 0x400 363 1.1 mrg vbr_400: ! Should be at vbr+0x400 364 1.1 mrg mov.l 2f, r0 ! load the old vbr setting (if any) 365 1.1 mrg mov.l @r0, r0 366 1.1 mrg cmp/eq #0, r0 367 1.1 mrg ! no previous vbr - jump to own generic handler 368 1.1 mrg bt handler 369 1.1 mrg ! there was a previous handler - chain them 370 1.1 mrg rotcr r0 371 1.1 mrg rotcr r0 372 1.1 mrg add #0x7f, r0 ! 0x1fc 373 1.1 mrg add #0x7f, r0 ! 0x3f8 374 1.1 mrg add #0x02, r0 ! 0x400 375 1.1 mrg rotcl r0 376 1.1 mrg rotcl r0 ! Add 0x400 without corrupting another register 377 1.1 mrg jmp @r0 378 1.1 mrg nop 379 1.1 mrg .balign 4 380 1.1 mrg 2: 381 1.1 mrg .long old_vbr 382 1.1 mrg handler: 383 1.1 mrg /* If the trap handler is there call it */ 384 1.1 mrg mov.l superh_trap_handler_k, r0 385 1.1 mrg cmp/eq #0, r0 ! True if zero. 386 1.1 mrg bf 3f 387 1.1 mrg bra chandler 388 1.1 mrg nop 389 1.1 mrg 3: 390 1.1 mrg ! Here handler available, call it. 391 1.1 mrg /* Now call the trap handler with as much of the context unchanged as possible. 392 1.1 mrg Move trapping address into PR to make it look like the trap point */ 393 1.1 mrg stc spc, r1 394 1.1 mrg lds r1, pr 395 1.1 mrg mov.l expevt_k, r4 396 1.1 mrg mov.l @r4, r4 ! r4 is value of expevt, first parameter. 397 1.1 mrg mov r1, r5 ! Remember trapping pc. 398 1.1 mrg mov r1, r6 ! Remember trapping pc. 399 1.1 mrg mov.l chandler_k, r1 400 1.1 mrg mov.l superh_trap_handler_k, r2 401 1.1 mrg ! jmp to trap handler to avoid disturbing pr. 402 1.1 mrg jmp @r2 403 1.1 mrg nop 404 1.1 mrg 405 1.1 mrg .org 0x600 406 1.1 mrg vbr_600: 407 1.1 mrg #ifdef PROFILE 408 1.1 mrg ! Should be at vbr+0x600 409 1.1 mrg ! Now we are in the land of interrupts so need to save more state. 410 1.1 mrg ! Save register state 411 1.1 mrg mov.l interrupt_stack_k, r15 ! r15 has been saved to sgr. 412 1.1 mrg mov.l r0,@-r15 413 1.1 mrg mov.l r1,@-r15 414 1.1 mrg mov.l r2,@-r15 415 1.1 mrg mov.l r3,@-r15 416 1.1 mrg mov.l r4,@-r15 417 1.1 mrg mov.l r5,@-r15 418 1.1 mrg mov.l r6,@-r15 419 1.1 mrg mov.l r7,@-r15 420 1.1 mrg sts.l pr,@-r15 421 1.1 mrg sts.l mach,@-r15 422 1.1 mrg sts.l macl,@-r15 423 1.1 mrg #if defined(__SH_FPU_ANY__) 424 1.1 mrg ! Save fpul and fpscr, save fr0-fr7 in 64 bit mode 425 1.1 mrg ! and set the pervading precision for the timer_handler 426 1.1 mrg mov #0,r0 427 1.1 mrg sts.l fpul,@-r15 428 1.1 mrg sts.l fpscr,@-r15 429 1.1 mrg lds r0,fpscr ! Clear fpscr 430 1.1 mrg fmov fr0,@-r15 431 1.1 mrg fmov fr1,@-r15 432 1.1 mrg fmov fr2,@-r15 433 1.1 mrg fmov fr3,@-r15 434 1.1 mrg mov.l pervading_precision_k,r0 435 1.1 mrg fmov fr4,@-r15 436 1.1 mrg fmov fr5,@-r15 437 1.1 mrg mov.l @r0,r0 438 1.1 mrg fmov fr6,@-r15 439 1.1 mrg fmov fr7,@-r15 440 1.1 mrg lds r0,fpscr 441 1.1 mrg #endif /* __SH_FPU_ANY__ */ 442 1.1 mrg ! Pass interrupted pc to timer_handler as first parameter (r4). 443 1.1 mrg stc spc, r4 444 1.1 mrg mov.l timer_handler_k, r0 445 1.1 mrg jsr @r0 446 1.1 mrg nop 447 1.1 mrg #if defined(__SH_FPU_ANY__) 448 1.1 mrg mov #0,r0 449 1.1 mrg lds r0,fpscr ! Clear the fpscr 450 1.1 mrg fmov @r15+,fr7 451 1.1 mrg fmov @r15+,fr6 452 1.1 mrg fmov @r15+,fr5 453 1.1 mrg fmov @r15+,fr4 454 1.1 mrg fmov @r15+,fr3 455 1.1 mrg fmov @r15+,fr2 456 1.1 mrg fmov @r15+,fr1 457 1.1 mrg fmov @r15+,fr0 458 1.1 mrg lds.l @r15+,fpscr 459 1.1 mrg lds.l @r15+,fpul 460 1.1 mrg #endif /* __SH_FPU_ANY__ */ 461 1.1 mrg lds.l @r15+,macl 462 1.1 mrg lds.l @r15+,mach 463 1.1 mrg lds.l @r15+,pr 464 1.1 mrg mov.l @r15+,r7 465 1.1 mrg mov.l @r15+,r6 466 1.1 mrg mov.l @r15+,r5 467 1.1 mrg mov.l @r15+,r4 468 1.1 mrg mov.l @r15+,r3 469 1.1 mrg mov.l @r15+,r2 470 1.1 mrg mov.l @r15+,r1 471 1.1 mrg mov.l @r15+,r0 472 1.1 mrg stc sgr, r15 ! Restore r15, destroyed by this sequence. 473 1.1 mrg rte 474 1.1 mrg nop 475 1.1 mrg #if defined(__SH_FPU_ANY__) 476 1.1 mrg .balign 4 477 1.1 mrg pervading_precision_k: 478 1.1.1.2 mrg .long GLOBAL(__fpscr_values)+4 479 1.1 mrg #endif 480 1.1 mrg #else 481 1.1 mrg mov.l 2f, r0 ! Load the old vbr setting (if any). 482 1.1 mrg mov.l @r0, r0 483 1.1 mrg cmp/eq #0, r0 484 1.1 mrg ! no previous vbr - jump to own handler 485 1.1 mrg bt chandler 486 1.1 mrg ! there was a previous handler - chain them 487 1.1 mrg rotcr r0 488 1.1 mrg rotcr r0 489 1.1 mrg add #0x7f, r0 ! 0x1fc 490 1.1 mrg add #0x7f, r0 ! 0x3f8 491 1.1 mrg add #0x7f, r0 ! 0x5f4 492 1.1 mrg add #0x03, r0 ! 0x600 493 1.1 mrg rotcl r0 494 1.1 mrg rotcl r0 ! Add 0x600 without corrupting another register 495 1.1 mrg jmp @r0 496 1.1 mrg nop 497 1.1 mrg .balign 4 498 1.1 mrg 2: 499 1.1 mrg .long old_vbr 500 1.1 mrg #endif /* PROFILE code */ 501 1.1 mrg chandler: 502 1.1 mrg mov.l expevt_k, r4 503 1.1 mrg mov.l @r4, r4 ! r4 is value of expevt hence making this the return code 504 1.1 mrg mov.l handler_exit_k,r0 505 1.1 mrg jsr @r0 506 1.1 mrg nop 507 1.1 mrg ! We should never return from _exit but in case we do we would enter the 508 1.1 mrg ! the following tight loop 509 1.1 mrg limbo: 510 1.1 mrg bra limbo 511 1.1 mrg nop 512 1.1 mrg .balign 4 513 1.1 mrg #ifdef PROFILE 514 1.1 mrg interrupt_stack_k: 515 1.1 mrg .long __timer_stack ! The high end of the stack 516 1.1 mrg timer_handler_k: 517 1.1 mrg .long __profil_counter 518 1.1 mrg #endif 519 1.1 mrg expevt_k: 520 1.1 mrg .long 0xff000024 ! Address of expevt 521 1.1 mrg chandler_k: 522 1.1 mrg .long chandler 523 1.1 mrg superh_trap_handler_k: 524 1.1 mrg .long __superh_trap_handler 525 1.1 mrg handler_exit_k: 526 1.1 mrg .long _exit 527 1.1 mrg .align 2 528 1.1 mrg ! Simulated compile of trap handler. 529 1.1 mrg .section .debug_abbrev,"",@progbits 530 1.1 mrg .Ldebug_abbrev0: 531 1.1 mrg .section .debug_info,"",@progbits 532 1.1 mrg .Ldebug_info0: 533 1.1 mrg .section .debug_line,"",@progbits 534 1.1 mrg .Ldebug_line0: 535 1.1 mrg .text 536 1.1 mrg .Ltext0: 537 1.1 mrg .align 5 538 1.1 mrg .type __superh_trap_handler,@function 539 1.1 mrg __superh_trap_handler: 540 1.1 mrg .LFB1: 541 1.1 mrg mov.l r14,@-r15 542 1.1 mrg .LCFI0: 543 1.1 mrg add #-4,r15 544 1.1 mrg .LCFI1: 545 1.1 mrg mov r15,r14 546 1.1 mrg .LCFI2: 547 1.1 mrg mov.l r4,@r14 548 1.1 mrg lds r1, pr 549 1.1 mrg add #4,r14 550 1.1 mrg mov r14,r15 551 1.1 mrg mov.l @r15+,r14 552 1.1 mrg rts 553 1.1 mrg nop 554 1.1 mrg .LFE1: 555 1.1 mrg .Lfe1: 556 1.1 mrg .size __superh_trap_handler,.Lfe1-__superh_trap_handler 557 1.1 mrg .section .debug_frame,"",@progbits 558 1.1 mrg .Lframe0: 559 1.1 mrg .ualong .LECIE0-.LSCIE0 560 1.1 mrg .LSCIE0: 561 1.1 mrg .ualong 0xffffffff 562 1.1 mrg .byte 0x1 563 1.1 mrg .string "" 564 1.1 mrg .uleb128 0x1 565 1.1 mrg .sleb128 -4 566 1.1 mrg .byte 0x11 567 1.1 mrg .byte 0xc 568 1.1 mrg .uleb128 0xf 569 1.1 mrg .uleb128 0x0 570 1.1 mrg .align 2 571 1.1 mrg .LECIE0: 572 1.1 mrg .LSFDE0: 573 1.1 mrg .ualong .LEFDE0-.LASFDE0 574 1.1 mrg .LASFDE0: 575 1.1 mrg .ualong .Lframe0 576 1.1 mrg .ualong .LFB1 577 1.1 mrg .ualong .LFE1-.LFB1 578 1.1 mrg .byte 0x4 579 1.1 mrg .ualong .LCFI0-.LFB1 580 1.1 mrg .byte 0xe 581 1.1 mrg .uleb128 0x4 582 1.1 mrg .byte 0x4 583 1.1 mrg .ualong .LCFI1-.LCFI0 584 1.1 mrg .byte 0xe 585 1.1 mrg .uleb128 0x8 586 1.1 mrg .byte 0x8e 587 1.1 mrg .uleb128 0x1 588 1.1 mrg .byte 0x4 589 1.1 mrg .ualong .LCFI2-.LCFI1 590 1.1 mrg .byte 0xd 591 1.1 mrg .uleb128 0xe 592 1.1 mrg .align 2 593 1.1 mrg .LEFDE0: 594 1.1 mrg .text 595 1.1 mrg .Letext0: 596 1.1 mrg .section .debug_info 597 1.1 mrg .ualong 0xb3 598 1.1 mrg .uaword 0x2 599 1.1 mrg .ualong .Ldebug_abbrev0 600 1.1 mrg .byte 0x4 601 1.1 mrg .uleb128 0x1 602 1.1 mrg .ualong .Ldebug_line0 603 1.1 mrg .ualong .Letext0 604 1.1 mrg .ualong .Ltext0 605 1.1 mrg .string "trap_handler.c" 606 1.1 mrg .string "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" 607 1.1 mrg .string "GNU C 3.2 20020529 (experimental)" 608 1.1 mrg .byte 0x1 609 1.1 mrg .uleb128 0x2 610 1.1 mrg .ualong 0xa6 611 1.1 mrg .byte 0x1 612 1.1 mrg .string "_superh_trap_handler" 613 1.1 mrg .byte 0x1 614 1.1 mrg .byte 0x2 615 1.1 mrg .byte 0x1 616 1.1 mrg .ualong .LFB1 617 1.1 mrg .ualong .LFE1 618 1.1 mrg .byte 0x1 619 1.1 mrg .byte 0x5e 620 1.1 mrg .uleb128 0x3 621 1.1 mrg .string "trap_reason" 622 1.1 mrg .byte 0x1 623 1.1 mrg .byte 0x1 624 1.1 mrg .ualong 0xa6 625 1.1 mrg .byte 0x2 626 1.1 mrg .byte 0x91 627 1.1 mrg .sleb128 0 628 1.1 mrg .byte 0x0 629 1.1 mrg .uleb128 0x4 630 1.1 mrg .string "unsigned int" 631 1.1 mrg .byte 0x4 632 1.1 mrg .byte 0x7 633 1.1 mrg .byte 0x0 634 1.1 mrg .section .debug_abbrev 635 1.1 mrg .uleb128 0x1 636 1.1 mrg .uleb128 0x11 637 1.1 mrg .byte 0x1 638 1.1 mrg .uleb128 0x10 639 1.1 mrg .uleb128 0x6 640 1.1 mrg .uleb128 0x12 641 1.1 mrg .uleb128 0x1 642 1.1 mrg .uleb128 0x11 643 1.1 mrg .uleb128 0x1 644 1.1 mrg .uleb128 0x3 645 1.1 mrg .uleb128 0x8 646 1.1 mrg .uleb128 0x1b 647 1.1 mrg .uleb128 0x8 648 1.1 mrg .uleb128 0x25 649 1.1 mrg .uleb128 0x8 650 1.1 mrg .uleb128 0x13 651 1.1 mrg .uleb128 0xb 652 1.1 mrg .byte 0x0 653 1.1 mrg .byte 0x0 654 1.1 mrg .uleb128 0x2 655 1.1 mrg .uleb128 0x2e 656 1.1 mrg .byte 0x1 657 1.1 mrg .uleb128 0x1 658 1.1 mrg .uleb128 0x13 659 1.1 mrg .uleb128 0x3f 660 1.1 mrg .uleb128 0xc 661 1.1 mrg .uleb128 0x3 662 1.1 mrg .uleb128 0x8 663 1.1 mrg .uleb128 0x3a 664 1.1 mrg .uleb128 0xb 665 1.1 mrg .uleb128 0x3b 666 1.1 mrg .uleb128 0xb 667 1.1 mrg .uleb128 0x27 668 1.1 mrg .uleb128 0xc 669 1.1 mrg .uleb128 0x11 670 1.1 mrg .uleb128 0x1 671 1.1 mrg .uleb128 0x12 672 1.1 mrg .uleb128 0x1 673 1.1 mrg .uleb128 0x40 674 1.1 mrg .uleb128 0xa 675 1.1 mrg .byte 0x0 676 1.1 mrg .byte 0x0 677 1.1 mrg .uleb128 0x3 678 1.1 mrg .uleb128 0x5 679 1.1 mrg .byte 0x0 680 1.1 mrg .uleb128 0x3 681 1.1 mrg .uleb128 0x8 682 1.1 mrg .uleb128 0x3a 683 1.1 mrg .uleb128 0xb 684 1.1 mrg .uleb128 0x3b 685 1.1 mrg .uleb128 0xb 686 1.1 mrg .uleb128 0x49 687 1.1 mrg .uleb128 0x13 688 1.1 mrg .uleb128 0x2 689 1.1 mrg .uleb128 0xa 690 1.1 mrg .byte 0x0 691 1.1 mrg .byte 0x0 692 1.1 mrg .uleb128 0x4 693 1.1 mrg .uleb128 0x24 694 1.1 mrg .byte 0x0 695 1.1 mrg .uleb128 0x3 696 1.1 mrg .uleb128 0x8 697 1.1 mrg .uleb128 0xb 698 1.1 mrg .uleb128 0xb 699 1.1 mrg .uleb128 0x3e 700 1.1 mrg .uleb128 0xb 701 1.1 mrg .byte 0x0 702 1.1 mrg .byte 0x0 703 1.1 mrg .byte 0x0 704 1.1 mrg .section .debug_pubnames,"",@progbits 705 1.1 mrg .ualong 0x27 706 1.1 mrg .uaword 0x2 707 1.1 mrg .ualong .Ldebug_info0 708 1.1 mrg .ualong 0xb7 709 1.1 mrg .ualong 0x67 710 1.1 mrg .string "_superh_trap_handler" 711 1.1 mrg .ualong 0x0 712 1.1 mrg .section .debug_aranges,"",@progbits 713 1.1 mrg .ualong 0x1c 714 1.1 mrg .uaword 0x2 715 1.1 mrg .ualong .Ldebug_info0 716 1.1 mrg .byte 0x4 717 1.1 mrg .byte 0x0 718 1.1 mrg .uaword 0x0 719 1.1 mrg .uaword 0x0 720 1.1 mrg .ualong .Ltext0 721 1.1 mrg .ualong .Letext0-.Ltext0 722 1.1 mrg .ualong 0x0 723 1.1 mrg .ualong 0x0 724 1.1 mrg #endif /* VBR_SETUP */ 725