PERFORCE change 118356 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Wed Apr 18 11:12:45 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=118356
Change 118356 by gonzo at gonzo_jeeves on 2007/04/18 11:12:02
o Organize things for _setjmp/setjmp/sigsetjmp calls family:
- two magic numbers for _setjmp and setjmp
- sigsetjmp calls either _setjmp or setjmp
- siglongjmp calls either _longjmp or setjmp taking into
account respective magic number.
Affected files ...
.. //depot/projects/mips2/src/lib/libc/mips/gen/_setjmp.S#4 edit
.. //depot/projects/mips2/src/lib/libc/mips/gen/setjmp.S#3 edit
.. //depot/projects/mips2/src/lib/libc/mips/gen/sigsetjmp.S#3 edit
.. //depot/projects/mips2/src/sys/mips/include/asm.h#11 edit
.. //depot/projects/mips2/src/sys/mips/include/setjmp.h#4 edit
Differences ...
==== //depot/projects/mips2/src/lib/libc/mips/gen/_setjmp.S#4 (text+ko) ====
@@ -44,8 +44,6 @@
.abicalls
#endif
-#define SOFTFLOAT /* XXX */
-
/*
* C library -- _setjmp, _longjmp
*
@@ -57,94 +55,55 @@
* The previous signal state is NOT restored.
*/
- .set noreorder
LEAF(_setjmp)
#ifdef __ABICALLS__
- #.set noreorder
+ .set noreorder
.cpload t9
- #.set reorder
+ .cprestore 16
#endif
+ li v0, _JB_MAGIC__SETJMP
+ sw v0, (_JB_MAGIC * SZREG)(a0)
+ sw ra, (_JB_REG_RA * SZREG)(a0)
+ sw s0, (_JB_REG_S0 * SZREG)(a0)
+ sw s1, (_JB_REG_S1 * SZREG)(a0)
+ sw s2, (_JB_REG_S2 * SZREG)(a0)
+ sw s3, (_JB_REG_S3 * SZREG)(a0)
+ sw s4, (_JB_REG_S4 * SZREG)(a0)
+ sw s5, (_JB_REG_S5 * SZREG)(a0)
+ sw s6, (_JB_REG_S6 * SZREG)(a0)
+ sw s7, (_JB_REG_S7 * SZREG)(a0)
+ sw sp, (_JB_REG_SP * SZREG)(a0)
+ sw s8, (_JB_REG_S8 * SZREG)(a0)
- .set push
- li v0, 0xACEDBADE
- sw v0, (a0)
- sw ra, (1 * SZREG)(a0)
- sw s0, (2 * SZREG)(a0)
- sw s1, (3 * SZREG)(a0)
- sw s2, (4 * SZREG)(a0)
- sw s3, (5 * SZREG)(a0)
- sw s4, (6 * SZREG)(a0)
- sw s5, (7 * SZREG)(a0)
- sw s6, (8 * SZREG)(a0)
- sw s7, (9 * SZREG)(a0)
- sw sp, (10 * SZREG)(a0)
- sw s8, (11 * SZREG)(a0)
-#ifndef SOFTFLOAT
- cfc1 v0, $31 # too bad cant check if FP used
- swc1 $f20, (20 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f21, (21 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f22, (22 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f23, (23 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f24, (24 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f25, (25 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f26, (26 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f27, (27 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f28, (28 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f29, (29 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f30, (30 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f31, (31 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- sw v0, (32 * 4 + _OFFSETOF_SC_FPREGS)(a0)
-#endif
- .set pop
j ra
move v0, zero
END(_setjmp)
LEAF(_longjmp)
#ifdef __ABICALLS__
- .set noreorder
+ .set noreorder
.cpload t9
- .set reorder
- subu sp, sp, 32
.cprestore 16
- .set noreorder
#endif
- .set push
- lw v0, (a0) # get magic number
- lw ra, (1 * SZREG)(a0)
- li t0, 0xACEDBADE
+ lw v0, (_JB_MAGIC * SZREG)(a0)
+ lw ra, (_JB_REG_RA * SZREG)(a0)
+ li t0, _JB_MAGIC__SETJMP
bne v0, t0, botch # jump if error
- addu sp, sp, 32 # does not matter, sanity
- lw s0, (2 * SZREG)(a0)
- lw s1, (3 * SZREG)(a0)
- lw s2, (4 * SZREG)(a0)
- lw s3, (5 * SZREG)(a0)
- lw s4, (6 * SZREG)(a0)
- lw s5, (7 * SZREG)(a0)
- lw s6, (8 * SZREG)(a0)
- lw s7, (9 * SZREG)(a0)
- lw sp, (10 * SZREG)(a0)
- lw s8, (11 * SZREG)(a0)
-#ifndef SOFTFLOAT
- lw v0, (32 * 4 + _OFFSETOF_SC_FPREGS)(a0) # get fpu status
- ctc1 v0, $31
- lwc1 $f20, (20 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f21, (21 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f22, (22 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f23, (23 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f24, (24 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f25, (25 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f26, (26 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f27, (27 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f28, (28 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f29, (29 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f30, (30 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- lwc1 $f31, (31 * 4 + _OFFSETOF_SC_FPREGS)(a0)
-#endif
+ lw s0, (_JB_REG_S0 * SZREG)(a0)
+ lw s1, (_JB_REG_S1 * SZREG)(a0)
+ lw s2, (_JB_REG_S2 * SZREG)(a0)
+ lw s3, (_JB_REG_S3 * SZREG)(a0)
+ lw s4, (_JB_REG_S4 * SZREG)(a0)
+ lw s5, (_JB_REG_S5 * SZREG)(a0)
+ lw s6, (_JB_REG_S6 * SZREG)(a0)
+ lw s7, (_JB_REG_S7 * SZREG)(a0)
+ lw sp, (_JB_REG_SP * SZREG)(a0)
+ lw s8, (_JB_REG_S8 * SZREG)(a0)
+
j ra
move v0, a1
- .set pop
+
botch:
jal _C_LABEL(longjmperror)
nop
==== //depot/projects/mips2/src/lib/libc/mips/gen/setjmp.S#3 (text+ko) ====
@@ -55,82 +55,105 @@
* and a struct sigcontext, see <signal.h>
*/
-#define SETJMP_FRAME_SIZE (CALLFRAME_SIZ + 12)
+#define SETJMP_FRAME_SIZE (CALLFRAME_SIZ + SZREG)
+
NESTED(setjmp, SETJMP_FRAME_SIZE, ra)
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
+ .set noreorder
#ifdef __ABICALLS__
- .set noreorder
.cpload t9
- .set reorder
#endif
subu sp, sp, SETJMP_FRAME_SIZE # allocate stack frame
#ifdef __ABICALLS__
.cprestore 16
#endif
sw ra, CALLFRAME_RA(sp) # save RA
- sw a0, SETJMP_FRAME_SIZE(sp) # squirrel away sc
+ sw a0, CALLFRAME_SIZ(sp) # store env
/* Get the signal mask. */
- addu a2, a0, _OFFSETOF_SC_MASK # &sc.sc_mask
- move a1, zero
- # XXXMIPS: jal _C_LABEL(__sigprocmask14) # get current signal mask
- move a0, zero # (in delay slot)
-
- /* Get the signal stack. */
- move a0, zero
- addu a1, sp, CALLFRAME_SIZ # pointer to struct sigaltstack
- # XXXMIPS: jal _C_LABEL(__sigaltstack14)
+ addu a2, a0, _JB_SIGMASK * SZREG # &oenv
+ li a0, 1 # SIG_SETBLOCK
+ move a1, zero # &env == 0
+ la t9, _C_LABEL(sigprocmask) # get current signal mask
+ jal t9
nop
- lw v1, CALLFRAME_SIZ+8(sp) # get old ss_onstack
- lw a0, SETJMP_FRAME_SIZE(sp) # restore sc pointer
- and v1, v1, 1 # extract onstack flag
- sw v1, 0(a0) # save it in sc_onstack
+ lw a0, CALLFRAME_SIZ(sp) # restore env pointer
lw ra, CALLFRAME_RA(sp) # restore RA
addu sp, sp, SETJMP_FRAME_SIZE # pop stack frame
- blt v0, zero, botch # check for sigaltstack() error
+ li v0, _JB_MAGIC_SETJMP
+ sw v0, (_JB_MAGIC * SZREG)(a0)
+ sw ra, (_JB_REG_RA * SZREG)(a0)
+ sw s0, (_JB_REG_S0 * SZREG)(a0)
+ sw s1, (_JB_REG_S1 * SZREG)(a0)
+ sw s2, (_JB_REG_S2 * SZREG)(a0)
+ sw s3, (_JB_REG_S3 * SZREG)(a0)
+ sw s4, (_JB_REG_S4 * SZREG)(a0)
+ sw s5, (_JB_REG_S5 * SZREG)(a0)
+ sw s6, (_JB_REG_S6 * SZREG)(a0)
+ sw s7, (_JB_REG_S7 * SZREG)(a0)
+ sw sp, (_JB_REG_SP * SZREG)(a0)
+ sw s8, (_JB_REG_S8 * SZREG)(a0)
- REG_PROLOGUE
- REG_S ra, (2 * 4)(a0) # sc_pc = return address
- REG_LI v0, 0xACEDBADE # sigcontext magic number
- REG_S v0, (_OFFSETOF_SC_REGS + ZERO * SZREG)(a0) # saved in sc_regs[0]
- REG_S s0, (_OFFSETOF_SC_REGS + S0 * SZREG)(a0)
- REG_S s1, (_OFFSETOF_SC_REGS + S1 * SZREG)(a0)
- REG_S s2, (_OFFSETOF_SC_REGS + S2 * SZREG)(a0)
- REG_S s3, (_OFFSETOF_SC_REGS + S3 * SZREG)(a0)
- REG_S s4, (_OFFSETOF_SC_REGS + S4 * SZREG)(a0)
- REG_S s5, (_OFFSETOF_SC_REGS + S5 * SZREG)(a0)
- REG_S s6, (_OFFSETOF_SC_REGS + S6 * SZREG)(a0)
- REG_S s7, (_OFFSETOF_SC_REGS + S7 * SZREG)(a0)
- REG_S gp, (_OFFSETOF_SC_REGS + GP * SZREG)(a0)
- REG_S sp, (_OFFSETOF_SC_REGS + SP * SZREG)(a0)
- REG_S s8, (_OFFSETOF_SC_REGS + S8 * SZREG)(a0)
- li v0, 1 # be nice if we could tell
- sw v0, (_OFFSETOF_SC_REGS + 34 * SZREG)(a0) # sc_fpused = 1
- cfc1 v0, $31
- swc1 $f20, (20 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f21, (21 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f22, (22 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f23, (23 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f24, (24 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f25, (25 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f26, (26 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f27, (27 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f28, (28 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f29, (29 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f30, (30 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- swc1 $f31, (31 * 4 + _OFFSETOF_SC_FPREGS)(a0)
- sw v0, (32 * 4 + _OFFSETOF_SC_FPREGS)(a0)
move v0, zero
j ra
- REG_EPILOGUE
+END(setjmp)
+
+#define LONGJMP_FRAME_SIZE CALLFRAME_RA + SZREG * 2
+
+NESTED(longjmp, LONGJMP_FRAME_SIZE, ra)
+ .mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
+ .set noreorder
+#ifdef __ABICALLS__
+ .cpload t9
+#endif
+ subu sp, sp, LONGJMP_FRAME_SIZE # allocate stack frame
+#ifdef __ABICALLS__
+ .cprestore 16
+#endif
+ sw ra, CALLFRAME_RA(sp) # save RA
+ lw v0, (_JB_MAGIC * SZREG)(a0)
+ li t0, _JB_MAGIC_SETJMP
+ bne v0, t0, botch # jump if error
+ nop
+
+ sw a0, CALLFRAME_SIZ(sp) # save env
+ sw a1, (CALLFRAME_SIZ + SZREG)(sp) # save return value
+
+ # set sigmask
+ addu a1, a0, _JB_SIGMASK * SZREG # &set
+ move a2, zero # &oset == NULL
+ li a0, 3 # SIG_SETMASK
+ la t9,_C_LABEL(sigprocmask) # set current signal mask
+ jal t9
+ nop
+
+ lw a0, CALLFRAME_SIZ(sp) # restore env
+ lw a1, (CALLFRAME_SIZ + SZREG)(sp) # restore return value
+
+ lw ra, (_JB_REG_RA * SZREG)(a0)
+ lw s0, (_JB_REG_S0 * SZREG)(a0)
+ lw s1, (_JB_REG_S1 * SZREG)(a0)
+ lw s2, (_JB_REG_S2 * SZREG)(a0)
+ lw s3, (_JB_REG_S3 * SZREG)(a0)
+ lw s4, (_JB_REG_S4 * SZREG)(a0)
+ lw s5, (_JB_REG_S5 * SZREG)(a0)
+ lw s6, (_JB_REG_S6 * SZREG)(a0)
+ lw s7, (_JB_REG_S7 * SZREG)(a0)
+ lw sp, (_JB_REG_SP * SZREG)(a0)
+ lw s8, (_JB_REG_S8 * SZREG)(a0)
+ move v0, a1
+ j ra
+ nop
+
botch:
- jal _C_LABEL(abort)
-END(setjmp)
+ la t9, _C_LABEL(longjmperror)
+ jal t9
+ nop
-WEAK_ALIAS(longjmp, __longjmp)
-LEAF(__longjmp)
- j ra
-END(__longjmp)
+ la t9, _C_LABEL(abort)
+ jal t9
+ nop
+END(longjmp)
==== //depot/projects/mips2/src/lib/libc/mips/gen/sigsetjmp.S#3 (text+ko) ====
@@ -62,9 +62,7 @@
.cpload t9
.set reorder
#endif
- WEAK_ALIAS(__sigsetjmp, sigsetjmp)
- # XXXMIPS: sw a1, (_JBLEN*4)(a0) # save "savemask"
- # XXXMIPS: bne a1, 0x0, 1f # do saving of signal mask?
+ bne a1, 0x0, 1f # do saving of signal mask?
la t9, _setjmp
jr t9
@@ -78,11 +76,11 @@
.cpload t9
.set reorder
#endif
- WEAK_ALIAS(__siglongjmp, siglongjmp)
- # XXXMIPS: lw t0, (_JBLEN * 4)(a0) # get "savemask"
- # XXXMIPS: bne t0, 0x0, 1f # restore signal mask?
+ lw t0, (_JB_MAGIC * SZREG)(a0)
+ li t1, _JB_MAGIC__SETJMP
+ bne t0, t1, 1f # setjmp or _setjmp magic?
la t9, _longjmp
jr t9
-1: la t9, __longjmp
+1: la t9, longjmp
jr t9
END(siglongjmp)
==== //depot/projects/mips2/src/sys/mips/include/asm.h#11 (text+ko) ====
@@ -331,4 +331,52 @@
.stabs __STRING(_/**/sym),1,0,0,0
#endif /* __STDC__ */
+/*
+ * Description of the setjmp buffer
+ *
+ * word 0 magic number (dependant on creator)
+ * 1 RA
+ * 2 S0
+ * 3 S1
+ * 4 S2
+ * 5 S3
+ * 6 S4
+ * 7 S5
+ * 8 S6
+ * 9 S7
+ * 10 SP
+ * 11 S8
+ * 12 signal mask (dependant on magic)
+ * 13 (con't)
+ * 14 (con't)
+ * 15 (con't)
+ *
+ * The magic number number identifies the jmp_buf and
+ * how the buffer was created as well as providing
+ * a sanity check
+ *
+ */
+
+#define _JB_MAGIC__SETJMP 0xBADFACED
+#define _JB_MAGIC_SETJMP 0xFACEDBAD
+
+/* Valid for all jmp_buf's */
+
+#define _JB_MAGIC 0
+#define _JB_REG_RA 1
+#define _JB_REG_S0 2
+#define _JB_REG_S1 3
+#define _JB_REG_S2 4
+#define _JB_REG_S3 5
+#define _JB_REG_S4 6
+#define _JB_REG_S5 7
+#define _JB_REG_S6 8
+#define _JB_REG_S7 9
+#define _JB_REG_SP 10
+#define _JB_REG_S8 11
+
+/* Only valid with the _JB_MAGIC_SETJMP magic */
+
+#define _JB_SIGMASK 12
+
#endif /* !_MACHINE_ASM_H_ */
==== //depot/projects/mips2/src/sys/mips/include/setjmp.h#4 (text+ko) ====
@@ -37,7 +37,7 @@
#include <sys/types.h>
-#define _JBLEN 12 /* Size of the jmp_buf on MIPS. */
+#define _JBLEN 16 /* Size of the jmp_buf on MIPS. */
/*
* jmp_buf and sigjmp_buf are encapsulated in different structs to force
More information about the p4-projects
mailing list