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;
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);
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").