diff --git a/xen/arch/x86/hvm/monitor.c b/xen/arch/x86/hvm/monitor.c index 7fb1e2c04e..1f23fe25e8 100644 --- a/xen/arch/x86/hvm/monitor.c +++ b/xen/arch/x86/hvm/monitor.c @@ -113,10 +113,6 @@ void hvm_monitor_descriptor_access(uint64_t exit_info, req.u.desc_access.arch.vmx.instr_info = exit_info; req.u.desc_access.arch.vmx.exit_qualification = vmx_exit_qualification; } - else - { - req.u.desc_access.arch.svm.exitinfo = exit_info; - } monitor_traps(current, true, &req); } diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 0fb1908c18..776cf11459 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -2980,29 +2980,26 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) svm_vmexit_do_pause(regs); break; - case VMEXIT_IDTR_READ: - case VMEXIT_IDTR_WRITE: - hvm_descriptor_access_intercept(vmcb->exitintinfo.bytes, 0, - VM_EVENT_DESC_IDTR, exit_reason == VMEXIT_IDTR_WRITE); - break; + case VMEXIT_IDTR_READ ... VMEXIT_TR_WRITE: + { + /* + * Consecutive block of 8 exit codes (sadly not aligned). Top bit + * indicates write (vs read), bottom 2 bits map linearly to + * VM_EVENT_DESC_* values. + */ +#define E2D(e) ((((e) - VMEXIT_IDTR_READ) & 3) + 1) + bool write = ((exit_reason - VMEXIT_IDTR_READ) & 4); + unsigned int desc = E2D(exit_reason); - case VMEXIT_GDTR_READ: - case VMEXIT_GDTR_WRITE: - hvm_descriptor_access_intercept(vmcb->exitintinfo.bytes, 0, - VM_EVENT_DESC_GDTR, exit_reason == VMEXIT_GDTR_WRITE); - break; + BUILD_BUG_ON(E2D(VMEXIT_IDTR_READ) != VM_EVENT_DESC_IDTR); + BUILD_BUG_ON(E2D(VMEXIT_GDTR_READ) != VM_EVENT_DESC_GDTR); + BUILD_BUG_ON(E2D(VMEXIT_LDTR_READ) != VM_EVENT_DESC_LDTR); + BUILD_BUG_ON(E2D(VMEXIT_TR_READ) != VM_EVENT_DESC_TR); +#undef E2D - case VMEXIT_LDTR_READ: - case VMEXIT_LDTR_WRITE: - hvm_descriptor_access_intercept(vmcb->exitintinfo.bytes, 0, - VM_EVENT_DESC_LDTR, exit_reason == VMEXIT_LDTR_WRITE); - break; - - case VMEXIT_TR_READ: - case VMEXIT_TR_WRITE: - hvm_descriptor_access_intercept(vmcb->exitintinfo.bytes, 0, - VM_EVENT_DESC_TR, exit_reason == VMEXIT_TR_WRITE); + hvm_descriptor_access_intercept(0, 0, desc, write); break; + } default: unexpected_exit_type: diff --git a/xen/include/public/vm_event.h b/xen/include/public/vm_event.h index 959083d8c4..aa54c86325 100644 --- a/xen/include/public/vm_event.h +++ b/xen/include/public/vm_event.h @@ -29,7 +29,7 @@ #include "xen.h" -#define VM_EVENT_INTERFACE_VERSION 0x00000005 +#define VM_EVENT_INTERFACE_VERSION 0x00000006 #if defined(__XEN__) || defined(__XEN_TOOLS__) @@ -301,10 +301,6 @@ struct vm_event_desc_access { uint32_t _pad1; uint64_t exit_qualification; /* VMX: VMCS Exit Qualification */ } vmx; - struct { - uint64_t exitinfo; /* SVM: VMCB EXITINFO */ - uint64_t _pad2; - } svm; } arch; uint8_t descriptor; /* VM_EVENT_DESC_* */ uint8_t is_write;