# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 9158ecb9045fd533f602378adb4abe41947ef781
# Parent 5610d916ad1be231bd6b6c7ae26665374623a90c
[HVM][VMX] On a VMEXIT, 'dirty' the DR. Restore DR from vcpu struct,
disable DR exiting (i.e., enable guest DR access), set VCPUF_dr_dirtied.
Remove "emulated" DR access, which only read and wrote to the debug register
values of the context, but not to the actual hardware values themselves.
Signed-off-by: George Dunlap <dunlapg@xxxxxxxxx>
---
xen/arch/x86/hvm/vmx/vmx.c | 61 +++++++++------------------------------------
1 files changed, 13 insertions(+), 48 deletions(-)
diff -r 5610d916ad1b -r 9158ecb9045f xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Tue Jun 27 09:51:18 2006 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c Tue Jun 27 09:54:05 2006 +0100
@@ -926,55 +926,20 @@ static void vmx_vmexit_do_cpuid(struct c
CASE_GET_REG_P(R15, r15)
#endif
-static void vmx_dr_access (unsigned long exit_qualification, struct
cpu_user_regs *regs)
-{
- unsigned int reg;
- unsigned long *reg_p = 0;
+static void vmx_dr_access(unsigned long exit_qualification,
+ struct cpu_user_regs *regs)
+{
struct vcpu *v = current;
- unsigned long eip;
-
- __vmread(GUEST_RIP, &eip);
-
- reg = exit_qualification & DEBUG_REG_ACCESS_NUM;
-
- HVM_DBG_LOG(DBG_LEVEL_1,
- "vmx_dr_access : eip=%lx, reg=%d, exit_qualification = %lx",
- eip, reg, exit_qualification);
-
- switch ( exit_qualification & DEBUG_REG_ACCESS_REG ) {
- CASE_GET_REG_P(EAX, eax);
- CASE_GET_REG_P(ECX, ecx);
- CASE_GET_REG_P(EDX, edx);
- CASE_GET_REG_P(EBX, ebx);
- CASE_GET_REG_P(EBP, ebp);
- CASE_GET_REG_P(ESI, esi);
- CASE_GET_REG_P(EDI, edi);
- CASE_EXTEND_GET_REG_P;
- case REG_ESP:
- break;
- default:
- __hvm_bug(regs);
- }
-
- switch (exit_qualification & DEBUG_REG_ACCESS_TYPE) {
- case TYPE_MOV_TO_DR:
- /* don't need to check the range */
- if (reg != REG_ESP)
- v->arch.guest_context.debugreg[reg] = *reg_p;
- else {
- unsigned long value;
- __vmread(GUEST_RSP, &value);
- v->arch.guest_context.debugreg[reg] = value;
- }
- break;
- case TYPE_MOV_FROM_DR:
- if (reg != REG_ESP)
- *reg_p = v->arch.guest_context.debugreg[reg];
- else {
- __vmwrite(GUEST_RSP, v->arch.guest_context.debugreg[reg]);
- }
- break;
- }
+
+ v->arch.hvm_vcpu.flag_dr_dirty = 1;
+
+ /* We could probably be smarter about this */
+ __restore_debug_registers(v);
+
+ /* Allow guest direct access to DR registers */
+ v->arch.hvm_vcpu.u.vmx.exec_control &= ~CPU_BASED_MOV_DR_EXITING;
+ __vmwrite(CPU_BASED_VM_EXEC_CONTROL,
+ v->arch.hvm_vcpu.u.vmx.exec_control);
}
/*
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|