Commit 8cab7ccc authored by Keith Owens's avatar Keith Owens Committed by Tony Luck

[IA64] Failure to resume after INIT in user space

The OS INIT handler is loading incorrect values into cr.ifa on exit.
This shows up as a hang when resuming after an INIT that is delivered
while a cpu is in user space.  Correct the value loaded into cr.ifa.
Signed-off-by: default avatarKeith Owens <kaos@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 958b166c
...@@ -827,7 +827,7 @@ ia64_state_restore: ...@@ -827,7 +827,7 @@ ia64_state_restore:
ld8 r9=[temp2],16 // sal_gp ld8 r9=[temp2],16 // sal_gp
;; ;;
ld8 r22=[temp1],16 // pal_min_state, virtual ld8 r22=[temp1],16 // pal_min_state, virtual
ld8 r21=[temp2],16 // prev_IA64_KR_CURRENT ld8 r13=[temp2],16 // prev_IA64_KR_CURRENT
;; ;;
ld8 r16=[temp1],16 // prev_IA64_KR_CURRENT_STACK ld8 r16=[temp1],16 // prev_IA64_KR_CURRENT_STACK
ld8 r20=[temp2],16 // prev_task ld8 r20=[temp2],16 // prev_task
...@@ -848,7 +848,7 @@ ia64_state_restore: ...@@ -848,7 +848,7 @@ ia64_state_restore:
mov cr.iim=temp3 mov cr.iim=temp3
mov cr.iha=temp4 mov cr.iha=temp4
dep r22=0,r22,62,1 // pal_min_state, physical, uncached dep r22=0,r22,62,1 // pal_min_state, physical, uncached
mov IA64_KR(CURRENT)=r21 mov IA64_KR(CURRENT)=r13
ld8 r8=[temp1] // os_status ld8 r8=[temp1] // os_status
ld8 r10=[temp2] // context ld8 r10=[temp2] // context
...@@ -856,7 +856,7 @@ ia64_state_restore: ...@@ -856,7 +856,7 @@ ia64_state_restore:
* avoid any dependencies on the algorithm in ia64_switch_to(), just * avoid any dependencies on the algorithm in ia64_switch_to(), just
* purge any existing CURRENT_STACK mapping and insert the new one. * purge any existing CURRENT_STACK mapping and insert the new one.
* *
* r16 contains prev_IA64_KR_CURRENT_STACK, r21 contains * r16 contains prev_IA64_KR_CURRENT_STACK, r13 contains
* prev_IA64_KR_CURRENT, these values may have been changed by the C * prev_IA64_KR_CURRENT, these values may have been changed by the C
* code. Do not use r8, r9, r10, r22, they contain values ready for * code. Do not use r8, r9, r10, r22, they contain values ready for
* the return to SAL. * the return to SAL.
...@@ -873,7 +873,7 @@ ia64_state_restore: ...@@ -873,7 +873,7 @@ ia64_state_restore:
;; ;;
srlz.d srlz.d
extr.u r19=r21,61,3 // r21 = prev_IA64_KR_CURRENT extr.u r19=r13,61,3 // r13 = prev_IA64_KR_CURRENT
shl r20=r16,IA64_GRANULE_SHIFT // r16 = prev_IA64_KR_CURRENT_STACK shl r20=r16,IA64_GRANULE_SHIFT // r16 = prev_IA64_KR_CURRENT_STACK
movl r21=PAGE_KERNEL // page properties movl r21=PAGE_KERNEL // page properties
;; ;;
...@@ -883,7 +883,7 @@ ia64_state_restore: ...@@ -883,7 +883,7 @@ ia64_state_restore:
(p6) br.spnt 1f // the dreaded cpu 0 idle task in region 5:( (p6) br.spnt 1f // the dreaded cpu 0 idle task in region 5:(
;; ;;
mov cr.itir=r18 mov cr.itir=r18
mov cr.ifa=r21 mov cr.ifa=r13
mov r20=IA64_TR_CURRENT_STACK mov r20=IA64_TR_CURRENT_STACK
;; ;;
itr.d dtr[r20]=r21 itr.d dtr[r20]=r21
......
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