diff options
author | jake <jake@FreeBSD.org> | 2001-11-18 04:35:09 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2001-11-18 04:35:09 +0000 |
commit | a85982e09cffc5f78f8a86cc5ab21ae6eb2fc2e4 (patch) | |
tree | ecfbe0878aeaf8bb55f8bfbf08008ddafbb133d2 /lib | |
parent | 00a49468543c5d8bd69c87649ddefd5ac3fe24eb (diff) | |
download | FreeBSD-src-a85982e09cffc5f78f8a86cc5ab21ae6eb2fc2e4.zip FreeBSD-src-a85982e09cffc5f78f8a86cc5ab21ae6eb2fc2e4.tar.gz |
Catch up to jmpbuf changes. Define offsets used from assmebly language
in another file so that it is easy to see what they are and keep them in
sync with the headers (grafted from the kernel generated assym.s).
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/sparc64/gen/_setjmp.S | 47 | ||||
-rw-r--r-- | lib/libc/sparc64/gen/assym.s | 16 |
2 files changed, 39 insertions, 24 deletions
diff --git a/lib/libc/sparc64/gen/_setjmp.S b/lib/libc/sparc64/gen/_setjmp.S index 0e315eb..7cb7f23 100644 --- a/lib/libc/sparc64/gen/_setjmp.S +++ b/lib/libc/sparc64/gen/_setjmp.S @@ -52,6 +52,8 @@ #include <machine/asm.h> +#include "assym.s" + /* * C library -- _setjmp, _longjmp * @@ -63,39 +65,36 @@ * The previous signal state is NOT restored. */ -#define JB_SP 0x0 -#define JB_PC 0x8 -#define JB_FP 0x10 - ENTRY(_setjmp) - stx %sp, [%o0 + JB_SP] /* store caller's stack pointer */ - stx %o7, [%o0 + JB_PC] /* ... return pc */ - stx %fp, [%o0 + JB_FP] /* ... and frame pointer */ + stx %sp, [%o0 + UC_MC + MC_O6] + stx %o7, [%o0 + UC_MC + MC_O7] + stx %fp, [%o0 + UC_MC + MC_G1] retl - clr %o0 ! return 0 + clr %o0 +END(_setjmp) ENTRY(_longjmp) - mov 1, %g6 - movrnz %o1, %o1, %g6 ! compute v ? v : 1 in a global register - mov %o0, %g1 ! save a in another global register - ldx [%g1 + JB_FP], %g7 /* get caller's frame */ -1: cmp %fp, %g7 ! compare against desired frame - bl,a 1b ! if below, - restore ! pop frame and loop - be,a 2f ! if there, - ldx [%g1 + JB_SP], %o2 ! fetch return %sp + mov 1, %g1 + movrnz %o1, %o1, %g1 ! compute v ? v : 1 + mov %o0, %g2 + ldx [%g2 + UC_MC + MC_G1], %g3 ! fetch callers frame +1: cmp %fp, %g3 ! compare against desired frame + bl,a 1b ! if below, + restore ! pop frame and loop + be,a 2f ! if there, + ldx [%g2 + UC_MC + MC_O6], %o0 ! fetch return %sp .Lbotch: - call CNAME(longjmperror) ! otherwise, went too far; bomb out + call CNAME(longjmperror) nop illtrap -2: cmp %o2, %sp ! %sp must not decrease +2: cmp %o0, %sp ! %sp must not decrease bge,a 3f - mov %o2, %sp ! it is OK, put it in place + mov %o0, %sp ! it is OK, put it in place b,a .Lbotch nop -3: ldx [%g1 + JB_PC], %o3 ! fetch pc - jmp %o3 + 8 ! success, return %g6 - mov %g6, %o0 - +3: ldx [%g2 + UC_MC + MC_O7], %o7 ! fetch return address + retl + mov %g1, %o0 ! return v ? v : 1; +END(_longjmp) diff --git a/lib/libc/sparc64/gen/assym.s b/lib/libc/sparc64/gen/assym.s new file mode 100644 index 0000000..2baacf9 --- /dev/null +++ b/lib/libc/sparc64/gen/assym.s @@ -0,0 +1,16 @@ +/* + * Offsets into into structures used from asm. Must be kept in sync with + * appropriate headers. + * + * $FreeBSD$ + */ + +#define UC_SIGMASK 0x0 +#define UC_MC 0x10 +#define MC_G1 0x8 +#define MC_O0 0x40 +#define MC_O1 0x48 +#define MC_O6 0x70 +#define MC_O7 0x78 +#define MC_TNPC 0x90 +#define MC_TPC 0x88 |