12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include <sys/syscall.h>
- #define _ASM 1
- #define _SETJMP_H
- #include <bits/setjmp.h>
- #define ENV(base,reg) [%base + (reg * 4)]
- #define ST_FLUSH_WINDOWS 3
- #define RW_FP [%fp + 0x48]
- .global __longjmp
- .align 4
- __longjmp:
- .type __longjmp ,@function
-
- ld ENV(o0,JB_FP), %g3
- mov %o0, %g1
- orcc %o1, %g0, %g2
- be,a 0f
- mov 1, %g2
- 0:
- xor %fp, %g3, %o0
- add %fp, 512, %o1
- andncc %o0, 4095, %o0
- bne .Lthread
- cmp %o1, %g3
- bl .Lthread
-
- .Lloop:
- cmp %fp, %g3
- bl,a .Lloop
- restore
- be,a .Lfound
- ld ENV(g1,JB_SP), %o0
- .Lthread:
-
- ta ST_FLUSH_WINDOWS
- ld ENV(g1,JB_PC), %o7
- ld ENV(g1,JB_SP), %fp
- sub %fp, 64, %sp
- st %g3, RW_FP
- retl
- restore %g2, 0, %o0
- .Lfound:
-
- mov %o0, %sp
- .Lsp_ok:
- ld ENV(g1,JB_PC), %o0
- jmp %o0 + 8
- mov %g2, %o0
- .size __longjmp , . - __longjmp
|