> +
> + cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL);
> + cpu_based_vm_exec_control &= ~CPU_BASED_MOV_DR_EXITING;
> + vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control);
vmcs_clear_bits() covers exactly this use-case.
(Barring the explicit bit-width.)
> +
> + /*
> + * No more DR vmexits; force a reload of the debug registers
> + * and reenter on this instruction. The next vmexit will
> + * retrieve the full state of the debug registers.
> + */
> + vcpu->arch.switch_db_regs |= KVM_DEBUGREG_WONT_EXIT;
> + return 1;
> + }
> +
We could make the code slighly uglier and move the functional part of
this block before the previous one, so it would do both things in one
exit.
(Exception handler will likely access DR too.)