Commit 589bb6c2 authored by David Mosberger's avatar David Mosberger

ia64: Fix a bug in sigtramp() which corrupted ar.rnat when unwinding

	across a signal trampoline (in user space).  Reported by
	Laurent Morichetti.
parent e689bf58
...@@ -195,10 +195,10 @@ GLOBAL_ENTRY(__kernel_sigtramp) ...@@ -195,10 +195,10 @@ GLOBAL_ENTRY(__kernel_sigtramp)
ld8 r15=[base1] // get address of new RBS base (or NULL) ld8 r15=[base1] // get address of new RBS base (or NULL)
cover // push args in interrupted frame onto backing store cover // push args in interrupted frame onto backing store
;; ;;
cmp.ne p8,p0=r15,r0 // do we need to switch the rbs? cmp.ne p1,p0=r15,r0 // do we need to switch rbs? (note: pr is saved by kernel)
mov.m r9=ar.bsp // fetch ar.bsp mov.m r9=ar.bsp // fetch ar.bsp
.spillsp.p p8, ar.rnat, RNAT_OFF+SIGCONTEXT_OFF .spillsp.p p1, ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
(p8) br.cond.spnt setup_rbs // yup -> (clobbers p8, r14-r16, and r18-r20) (p1) br.cond.spnt setup_rbs // yup -> (clobbers p8, r14-r16, and r18-r20)
back_from_setup_rbs: back_from_setup_rbs:
alloc r8=ar.pfs,0,0,3,0 alloc r8=ar.pfs,0,0,3,0
ld8 out0=[base0],16 // load arg0 (signum) ld8 out0=[base0],16 // load arg0 (signum)
...@@ -237,8 +237,8 @@ back_from_setup_rbs: ...@@ -237,8 +237,8 @@ back_from_setup_rbs:
ld8 r15=[base0],(CFM_OFF-BSP_OFF) // fetch sc_ar_bsp and advance to CFM_OFF ld8 r15=[base0],(CFM_OFF-BSP_OFF) // fetch sc_ar_bsp and advance to CFM_OFF
mov r14=ar.bsp mov r14=ar.bsp
;; ;;
cmp.ne p8,p0=r14,r15 // do we need to restore the rbs? cmp.ne p1,p0=r14,r15 // do we need to restore the rbs?
(p8) br.cond.spnt restore_rbs // yup -> (clobbers r14-r18, f6 & f7) (p1) br.cond.spnt restore_rbs // yup -> (clobbers r14-r18, f6 & f7)
;; ;;
back_from_restore_rbs: back_from_restore_rbs:
adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment