|
|
|
|
|
|
|
|
|
|
xen-devel
[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
|
<Prev in Thread] |
Current Thread |
[Next in Thread>
|
- [Xen-devel] [PATCH] vmx: Fix single step on debugger,
Kouya Shimura <=
|
|
|
|
|