summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2002-11-14 06:40:23 +0000
committermarcel <marcel@FreeBSD.org>2002-11-14 06:40:23 +0000
commit52879ad635271f7e0691556937b3d38503566f44 (patch)
tree49e1c1b348b431ba43148e35744edd8c5a88af6c /lib
parentaabe0b2183ab18738e1b5761a4251a12305a17b1 (diff)
downloadFreeBSD-src-52879ad635271f7e0691556937b3d38503566f44.zip
FreeBSD-src-52879ad635271f7e0691556937b3d38503566f44.tar.gz
o Fix _longjmp() to return 1 when the return value is given as 0.
o Remove the unwanted smartness in _longjmp() where it compares the current ar.bspstore with the saved ar.bspstore and restores ar.rnat based on it. This either avoids saving ar.rnat in the jmp_buf or is the consequence of not saving ar.rnat. All this complexity breaks libc_r where we use longjmp() to switch to different threads and the current ar.bspstore has no relation to the saved ar.bspstore. Thus: we save ar.rnat in setjmp() and simply restore ar.bspstore and ar.rnat in longjmp(). This code needs a cleanup.
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/ia64/gen/_setjmp.S77
1 files changed, 25 insertions, 52 deletions
diff --git a/lib/libc/ia64/gen/_setjmp.S b/lib/libc/ia64/gen/_setjmp.S
index 1357cfa..5f15cd4 100644
--- a/lib/libc/ia64/gen/_setjmp.S
+++ b/lib/libc/ia64/gen/_setjmp.S
@@ -95,24 +95,30 @@ ENTRY(_setjmp, 1)
//
// save preserved general registers & NaT's
//
+ .mem.offset 0,0
st8.spill [r11] = r4, J_R6-J_R4
+ .mem.offset 8,0
+ st8.spill [r10] = r5, J_R7-J_R5
;;
- st8.spill [r10] = r5, J_R7-J_R5
- ;;
+ .mem.offset 16,0
st8.spill [r11] = r6, J_SP-J_R6
- ;;
+ .mem.offset 24,0
st8.spill [r10] = r7, J_F3-J_R7
;;
st8.spill [r11] = sp, J_F2-J_SP
+ mov r16 = ar.rsc
;;
//
// save spilled Unat and pfs registers
//
mov r2 = ar.unat // save Unat register after spill
+ mov ar.rsc = r0
;;
st8 [r32] = r2, J_PFS-J_NATS // save unat for spilled regs
+ mov r17 = ar.rnat
;;
- st8 [r32] = r15 // save pfs
+ st8 [r32] = r15, J_RNAT-J_PFS // save pfs
+ mov ar.rsc = r16
//
// save floating registers
//
@@ -145,6 +151,8 @@ ENTRY(_setjmp, 1)
;;
stf.spill [r11] = f30, J_FPSR-J_F30
stf.spill [r10] = f31, J_B0-J_F31 // size of f31 + fpsr
+ ;;
+ st8 [r32] = r17
//
// save FPSR register & branch registers
//
@@ -192,67 +200,32 @@ END(_setjmp)
WEAK_ALIAS(_longjmp,___longjmp)
ENTRY(___longjmp, 2)
- //
- // caching the return value as we do invala in the end
- //
+ mov r14 = ar.rsc // get user RSC conf
mov r8 = r33 // return value
-
- //
- // get immediate context
- //
- mov r14 = ar.rsc // get user RSC conf
add r10 = J_PFS, r32 // get address of pfs
+ ;;
+ mov ar.rsc = r0
add r11 = J_NATS, r32
+ add r17 = J_RNAT, r32
;;
ld8 r15 = [r10], J_BSP-J_PFS // get pfs
ld8 r2 = [r11], J_LC-J_NATS // get unat for spilled regs
+ mov r31 = r32
;;
+ loadrs
mov ar.unat = r2
+ cmp.eq p6,p0=0,r8 // Return value 0?
;;
ld8 r16 = [r10], J_PREDS-J_BSP // get backing store pointer
- mov ar.rsc = r0 // put RSE in enforced lazy
+ ld8 r17 = [r17] // ar.rnat
mov ar.pfs = r15
;;
-
- //
- // while returning from longjmp the BSPSTORE and BSP needs to be
- // same and discard all the registers allocated after we did
- // setjmp. Also, we need to generate the RNAT register since we
- // did not flushed the RSE on setjmp.
- //
- mov r17 = ar.bspstore // get current BSPSTORE
- ;;
- cmp.ltu p6,p7 = r17, r16 // is it less than BSP of
-(p6) br.spnt.few .flush_rse
- mov r19 = ar.rnat // get current RNAT
+ mov ar.bspstore = r16
+(p6) add r8 = 1, r0
;;
- loadrs // invalidate dirty regs
- br.sptk.many .restore_rnat // restore RNAT
-
-.flush_rse:
- flushrs
- ;;
- mov r19 = ar.rnat // get current RNAT
- mov r17 = r16 // current BSPSTORE
- ;;
-.restore_rnat:
- //
- // check if RNAT is saved between saved BSP and curr BSPSTORE
- //
- mov r18 = 0x3f
- ;;
- dep r18 = r18,r16,3,6 // get RNAT address
- ;;
- cmp.ltu p8,p9 = r18, r17 // RNAT saved on RSE
- ;;
-(p8) ld8 r19 = [r18] // get RNAT from RSE
- ;;
- mov ar.bspstore = r16 // set new BSPSTORE
- ;;
- mov ar.rnat = r19 // restore RNAT
+ mov ar.rnat = r17
mov ar.rsc = r14 // restore RSC conf
-
ld8 r3 = [r11], J_R4-J_LC // get lc register
ld8 r2 = [r10], J_R5-J_PREDS // get predicates
;;
@@ -316,12 +289,12 @@ ENTRY(___longjmp, 2)
mov b1 = r2
mov b2 = r3
ld8 r2 = [r10], J_B5-J_B3
- ld8 r3 = [r11]
+ ld8 r3 = [r11],
;;
mov b3 = r2
mov b4 = r3
ld8 r2 = [r10]
- ld8 r21 = [r32] // get user unat
+ ld8 r21 = [r31] // get user unat
;;
mov b5 = r2
mov ar.unat = r21
OpenPOWER on IntegriCloud