# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1203096840 25200
# Node ID 2c9d0eb5a855ae850b7765ac01e1bda638aefcbb
# Parent 29faad225cbbdb63438088f02361f260ffab807a
[IA64] Handle nested dtlb miss in vmx_dirty_bit
Although I believe that tpa in vmx_dirty_bit never generate
a nested dtlb miss, this patch ensures the fault case.
Confirmed the additional code in this patch works fine
by means of a debugger.
Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
---
xen/arch/ia64/vmx/vmx_ivt.S | 41 ++++++++++++++++++++++++++++++++++++-----
1 files changed, 36 insertions(+), 5 deletions(-)
diff -r 29faad225cbb -r 2c9d0eb5a855 xen/arch/ia64/vmx/vmx_ivt.S
--- a/xen/arch/ia64/vmx/vmx_ivt.S Thu Feb 14 12:37:15 2008 -0700
+++ b/xen/arch/ia64/vmx/vmx_ivt.S Fri Feb 15 10:34:00 2008 -0700
@@ -410,6 +410,11 @@ END(vmx_alt_dtlb_miss)
// 0x1400 Entry 5 (size 64 bundles) Data nested TLB (6,45)
ENTRY(vmx_nested_dtlb_miss)
VMX_DBG_FAULT(5)
+ mov r29=cr.ipsr
+ mov b0=r30
+ ;;
+ tbit.z p6,p0=r29,IA64_PSR_VM_BIT
+(p6)br.sptk b0 // return to the continuation point
VMX_FAULT(5)
END(vmx_nested_dtlb_miss)
@@ -433,16 +438,42 @@ END(vmx_dkey_miss)
/////////////////////////////////////////////////////////////////////////////////////////
// 0x2000 Entry 8 (size 64 bundles) Dirty-bit (54)
ENTRY(vmx_dirty_bit)
- mov r29=cr.ipsr
+ VMX_DBG_FAULT(8)
+ mov r28=cr.ipsr
mov r31=pr
;;
mov r19=cr.ifa
- tbit.z p6,p0=r29,IA64_PSR_VM_BIT
-(p6)br.spnt.many vmx_fault_8
- ;;
- tpa r19=r19
+ tbit.z p6,p0=r28,IA64_PSR_VM_BIT
+(p6)br.spnt.few vmx_fault_8
+ // Prepare for nested dtlb miss
+ mov r22=b0
+ dep.z r29=r28,IA64_PSR_VM_BIT,1
+ ;;
+ mov cr.ipsr=r29 // ipsr.vm=0
+ movl r30=dirty_bit_tpa_fail
+ ;;
+ tpa r19=r19 // possibly nested dtlb miss?
+ mov cr.ipsr=r28 // ipsr.vm=1
br.sptk vmx_dispatch_shadow_fault
VMX_FAULT(8)
+dirty_bit_tpa_fail:
+ // Resume & Retry
+ mov cr.ipsr=r28 // ipsr.vm=1
+ mov r17=cr.isr
+ mov r23=r31
+// mov r22=b0 // b0 is clobbered in vmx_nested_dtlb_miss
+ adds r16=IA64_VPD_BASE_OFFSET,r21
+ ;;
+ ld8 r18=[r16]
+ ;;
+ adds r19=VPD(VPSR),r18
+ movl r20=__vsa_base
+ ;;
+ ld8 r19=[r19]
+ ld8 r20=[r20]
+ ;;
+ br.sptk ia64_vmm_entry
+ ;;
END(vmx_dirty_bit)
.org vmx_ia64_ivt+0x2400
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|