From c8efb16966457010688c39dfcbe07eb280aee917 Mon Sep 17 00:00:00 2001 From: Jake Burkholder Date: Sun, 18 Nov 2001 04:35:09 +0000 Subject: [PATCH] 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). --- lib/libc/sparc64/gen/_setjmp.S | 47 +++++++++++++++++----------------- lib/libc/sparc64/gen/assym.s | 16 ++++++++++++ 2 files changed, 39 insertions(+), 24 deletions(-) create mode 100644 lib/libc/sparc64/gen/assym.s diff --git a/lib/libc/sparc64/gen/_setjmp.S b/lib/libc/sparc64/gen/_setjmp.S index 0e315ebb4dd..7cb7f23ce3b 100644 --- a/lib/libc/sparc64/gen/_setjmp.S +++ b/lib/libc/sparc64/gen/_setjmp.S @@ -52,6 +52,8 @@ #include +#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 00000000000..2baacf98799 --- /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