[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] vmx: Fix single step on debugger



The hvm domain which is being debugged sometimes crashes with the
following message:

(XEN) Failed vm entry (exit reason 0x80000021) caused by invalid guest state 
(0).
(XEN) ************* VMCS Area **************
(XEN) *** Guest State ***
(XEN) CR0: actual=0x000000008005003b, shadow=0x000000008005003b, 
gh_mask=ffffffffffffffff
...[snip]...
(XEN) DebugCtl=0000000000000000 DebugExceptions=0000000000000000
(XEN) Interruptibility=0001 ActivityState=0000
(XEN) *** Host State ***
(XEN) RSP = 0xffff828c8024ffa0  RIP = 0xffff828c801885b0
(XEN) CS=e008 DS=0000 ES=0000 FS=0000 GS=0000 SS=0000 TR=e040
(XEN) FSBase=0000000000000000 GSBase=0000000000000000 TRBase=ffff828c8028a200
(XEN) GDTBase=ffff828c800f3000 IDTBase=ffff828c8028db20
(XEN) CR0=000000008005003b CR3=00000001315b9000 CR4=00000000000026b0
(XEN) Sysenter RSP=ffff828c8024ffd0 CS:RIP=e008:ffff828c801af290
(XEN) *** Control State ***
(XEN) PinBased=0000003f CPUBased=b6a1e7fe SecondaryExec=00000041
(XEN) EntryControls=000013ff ExitControls=0003efff
(XEN) ExceptionBitmap=0004400a
(XEN) VMEntry: intr_info=00000031 errcode=00000004 ilen=00000000
(XEN) VMExit: intr_info=80000301 errcode=00000400 ilen=00000000
(XEN)         reason=80000021 qualification=00000000
(XEN) IDTVectoring: info=00000000 errcode=00000000
(XEN) TPR Threshold = 0x00
(XEN) EPT pointer = 0x0000000000000000
(XEN) Virtual processor ID = 0x0000
(XEN) **************************************
(XEN) domain_crash called from vmx.c:2207
(XEN) Domain 14 (vcpu#0) crashed on cpu#0:


Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>

diff -r 8c35da364ab3 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Thu Dec 18 17:18:28 2008 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Fri Dec 19 18:22:29 2008 +0900
@@ -1314,8 +1314,41 @@ static void vmx_set_uc_mode(struct vcpu 
 
 static void vmx_set_info_guest(struct vcpu *v)
 {
+    unsigned long intrblty;
+    unsigned long activity;
+    unsigned long debugctl;
+
     vmx_vmcs_enter(v);
+
     __vmwrite(GUEST_DR7, v->arch.guest_context.debugreg[7]);
+
+    /* 
+     * Setting X86_EFLAGS_TF may cause VM entry to fail.
+     * See SDM 3B 22.3.1.5.
+     */
+    if ( v->arch.guest_context.user_regs.eflags & X86_EFLAGS_TF )
+    {
+        intrblty = __vmread(GUEST_INTERRUPTIBILITY_INFO);
+        activity = __vmread(GUEST_ACTIVITY_STATE);
+
+        if ( (intrblty & (VMX_INTR_SHADOW_STI|VMX_INTR_SHADOW_MOV_SS)) ||
+             (activity == VMX_ACTIVITY_STATE_HLT) )
+        {
+            debugctl = __vmread(GUEST_IA32_DEBUGCTL);
+            debugctl |= VMX_IA32_DEBUGCTL_BTF;
+            __vmwrite(GUEST_IA32_DEBUGCTL, debugctl);
+        }
+    }
+    else
+    {
+        debugctl = __vmread(GUEST_IA32_DEBUGCTL);
+        if ( debugctl & VMX_IA32_DEBUGCTL_BTF )
+        {
+            debugctl &= ~VMX_IA32_DEBUGCTL_BTF;
+            __vmwrite(GUEST_IA32_DEBUGCTL, debugctl);
+        }
+    }
+
     vmx_vmcs_exit(v);
 }
 
diff -r 8c35da364ab3 xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h        Thu Dec 18 17:18:28 2008 +0000
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h        Fri Dec 19 18:22:29 2008 +0900
@@ -196,6 +196,16 @@ extern bool_t cpu_has_vmx_ins_outs_instr
 #define VMX_INTR_SHADOW_SMI             0x00000004
 #define VMX_INTR_SHADOW_NMI             0x00000008
 
+enum guest_activity_state {
+    VMX_ACTIVITY_STATE_ACTIVE        = 0,
+    VMX_ACTIVITY_STATE_HLT           = 1,
+    VMX_ACTIVITY_STATE_SHUTDOWN      = 2,
+    VMX_ACTIVITY_STATE_WAIT_FOR_SIPI = 3,
+};
+
+/* GUEST_IA32_DEBUGCTL flags */
+#define VMX_IA32_DEBUGCTL_BTF           0x00000002 // single-step on branches
+
 /* VMCS field encodings. */
 enum vmcs_field {
     VIRTUAL_PROCESSOR_ID            = 0x00000000,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.