diff options
Diffstat (limited to 'arch/ia64/kernel/gate.S')
-rw-r--r-- | arch/ia64/kernel/gate.S | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/arch/ia64/kernel/gate.S b/arch/ia64/kernel/gate.S index a710870c0..8eabe53d1 100644 --- a/arch/ia64/kernel/gate.S +++ b/arch/ia64/kernel/gate.S @@ -80,8 +80,6 @@ ia64_sigtramp: ld8 r10=[r3],8 // get signal handler entry point br.call.sptk.many rp=invoke_sighandler -.ret0: mov r15=__NR_rt_sigreturn - break __BREAK_SYSCALL .endp ia64_sigtramp .proc invoke_sighandler @@ -90,10 +88,9 @@ invoke_sighandler: mov b6=r10 cover // push args in interrupted frame onto backing store ;; - alloc r8=ar.pfs,0,1,3,0 // get CFM0, EC0, and CPL0 into r8 - mov r17=ar.bsp // fetch ar.bsp - mov loc0=rp // save return pointer + alloc r8=ar.pfs,0,0,3,0 // get CFM0, EC0, and CPL0 into r8 ;; + mov r17=ar.bsp // fetch ar.bsp cmp.ne p8,p0=r15,r0 // do we need to switch the rbs? mov out0=r2 // signal number (p8) br.cond.spnt.few setup_rbs // yup -> (clobbers r14 and r16) @@ -101,10 +98,11 @@ back_from_setup_rbs: adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp ;; st8 [base0]=r17,(CFM_OFF-BSP_OFF) // save sc_ar_bsp + dep r8=0,r8,38,26 // clear EC0, CPL0 and reserved bits adds base1=(FR6_OFF+16+SIGCONTEXT_OFF),sp ;; - st8 [base0]=r8 // save CFM0, EC0, and CPL0 + st8 [base0]=r8 // save CFM0 adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp ;; stf.spill [base0]=f6,32 @@ -124,7 +122,8 @@ back_from_setup_rbs: stf.spill [base0]=f14,32 stf.spill [base1]=f15,32 br.call.sptk.few rp=b6 // call the signal handler -.ret2: adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp +.ret2: + adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp ;; ld8 r15=[base0],(CFM_OFF-BSP_OFF) // fetch sc_ar_bsp and advance to CFM_OFF mov r14=ar.bsp @@ -134,23 +133,11 @@ back_from_setup_rbs: (p8) br.cond.spnt.few restore_rbs // yup -> (clobbers r14 and r16) ;; back_from_restore_rbs: - { - and r9=0x7f,r8 // r9 <- CFM0.sof - extr.u r10=r8,7,7 // r10 <- CFM0.sol - mov r11=ip - } - ;; adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp - adds r11=(cont-back_from_restore_rbs),r11 - sub r9=r9,r10 // r9 <- CFM0.sof - CFM0.sol == CFM0.nout - ;; adds base1=(FR6_OFF+16+SIGCONTEXT_OFF),sp - dep r9=r9,r9,7,7 // r9.sol = r9.sof - mov b6=r11 ;; ldf.fill f6=[base0],32 ldf.fill f7=[base1],32 - mov rp=loc0 // copy return pointer out of stacked register ;; ldf.fill f8=[base0],32 ldf.fill f9=[base1],32 @@ -160,26 +147,23 @@ back_from_restore_rbs: ;; ldf.fill f12=[base0],32 ldf.fill f13=[base1],32 - mov ar.pfs=r9 ;; ldf.fill f14=[base0],32 ldf.fill f15=[base1],32 - br.ret.sptk.few b6 -cont: mov ar.pfs=r8 // ar.pfs = CFM0 - br.ret.sptk.few rp // re-establish CFM0 + mov r15=__NR_rt_sigreturn + break __BREAK_SYSCALL .endp invoke_sighandler .proc setup_rbs setup_rbs: flushrs // must be first in insn - ;; mov ar.rsc=r0 // put RSE into enforced lazy mode adds r16=(RNAT_OFF+SIGCONTEXT_OFF),sp - mov r14=ar.rnat // get rnat as updated by flushrs ;; + mov r14=ar.rnat // get rnat as updated by flushrs mov ar.bspstore=r15 // set new register backing store area - st8 [r16]=r14 // save sc_ar_rnat ;; + st8 [r16]=r14 // save sc_ar_rnat mov ar.rsc=0xf // set RSE into eager mode, pl 3 invala // invalidate ALAT br.cond.sptk.many back_from_setup_rbs |