diff options
author | marcel <marcel@FreeBSD.org> | 2002-11-14 06:40:23 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2002-11-14 06:40:23 +0000 |
commit | 52879ad635271f7e0691556937b3d38503566f44 (patch) | |
tree | 49e1c1b348b431ba43148e35744edd8c5a88af6c /lib | |
parent | aabe0b2183ab18738e1b5761a4251a12305a17b1 (diff) | |
download | FreeBSD-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.S | 77 |
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 |