123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include <jmpbuf-offsets.h>
- #define ENV(base,reg) [%base + (reg * 4)]
- #define ST_FLUSH_WINDOWS 3
- #define RW_FP [%fp + 0x48]
- .global __longjmp
- .type __longjmp,%function
- .align 4
- __longjmp:
- .register %g2, #scratch
- .register %g3, #scratch
-
- 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
- libc_hidden_def(__longjmp)
|