mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/vmx: Partially revert "x86/vmx: implement Notify VM Exit"
The original patch tried to do two things - implement VMNotify, and
re-optimise VT-x to not intercept #DB/#AC by default.
The second part is buggy in multiple ways. Both GDBSX and Introspection need
to conditionally intercept #DB, which was not accounted for. Also, #DB
interception has nothing at all to do with cpu_has_monitor_trap_flag.
Revert the second half, leaving #DB/#AC intercepted unilaterally, but with
VMNotify active by default when available.
Fixes: 573279cde1 ("x86/vmx: implement Notify VM Exit")
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
1 parent
b5d8b03db1
commit
5f08bc9404
2 files changed
+4
-23
No files matched your search
@@ -1296,17 +1296,10 @@ static int construct_vmcs(struct vcpu *v)
|
||||
v->arch.hvm.vmx.exception_bitmap = HVM_TRAP_MASK
|
||||
| (paging_mode_hap(d) ? 0 : (1U << TRAP_page_fault))
|
||||
| (v->arch.fully_eager_fpu ? 0 : (1U << TRAP_no_device));
|
||||
|
||||
if ( cpu_has_vmx_notify_vm_exiting )
|
||||
{
|
||||
__vmwrite(NOTIFY_WINDOW, vm_notify_window);
|
||||
/*
|
||||
* Disable #AC and #DB interception: by using VM Notify Xen is
|
||||
* guaranteed to get a VM exit even if the guest manages to lock the
|
||||
* CPU.
|
||||
*/
|
||||
v->arch.hvm.vmx.exception_bitmap &= ~((1U << TRAP_debug) |
|
||||
(1U << TRAP_alignment_check));
|
||||
}
|
||||
|
||||
vmx_update_exception_bitmap(v);
|
||||
|
||||
v->arch.hvm.guest_cr[0] = X86_CR0_PE | X86_CR0_ET;
|
||||
|
||||
@@ -1564,19 +1564,10 @@ static void cf_check vmx_update_host_cr3(struct vcpu *v)
|
||||
|
||||
void vmx_update_debug_state(struct vcpu *v)
|
||||
{
|
||||
unsigned int mask = 1u << TRAP_int3;
|
||||
|
||||
if ( !cpu_has_monitor_trap_flag && cpu_has_vmx_notify_vm_exiting )
|
||||
/*
|
||||
* Only allow toggling TRAP_debug if notify VM exit is enabled, as
|
||||
* unconditionally setting TRAP_debug is part of the XSA-156 fix.
|
||||
*/
|
||||
mask |= 1u << TRAP_debug;
|
||||
|
||||
if ( v->arch.hvm.debug_state_latch )
|
||||
v->arch.hvm.vmx.exception_bitmap |= mask;
|
||||
v->arch.hvm.vmx.exception_bitmap |= 1U << TRAP_int3;
|
||||
else
|
||||
v->arch.hvm.vmx.exception_bitmap &= ~mask;
|
||||
v->arch.hvm.vmx.exception_bitmap &= ~(1U << TRAP_int3);
|
||||
|
||||
vmx_vmcs_enter(v);
|
||||
vmx_update_exception_bitmap(v);
|
||||
@@ -4192,9 +4183,6 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
|
||||
switch ( vector )
|
||||
{
|
||||
case TRAP_debug:
|
||||
if ( cpu_has_monitor_trap_flag && cpu_has_vmx_notify_vm_exiting )
|
||||
goto exit_and_crash;
|
||||
|
||||
/*
|
||||
* Updates DR6 where debugger can peek (See 3B 23.2.1,
|
||||
* Table 23-1, "Exit Qualification for Debug Exceptions").
|
||||
|
||||