|
@@ -5207,21 +5207,17 @@ static void kvm_vcpu_check_singlestep(struct kvm_vcpu *vcpu, unsigned long rflag
|
|
|
|
|
|
static bool kvm_vcpu_check_breakpoint(struct kvm_vcpu *vcpu, int *r)
|
|
|
{
|
|
|
- struct kvm_run *kvm_run = vcpu->run;
|
|
|
- unsigned long eip = vcpu->arch.emulate_ctxt.eip;
|
|
|
- u32 dr6 = 0;
|
|
|
-
|
|
|
if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) &&
|
|
|
(vcpu->arch.guest_debug_dr7 & DR7_BP_EN_MASK)) {
|
|
|
- dr6 = kvm_vcpu_check_hw_bp(eip, 0,
|
|
|
+ struct kvm_run *kvm_run = vcpu->run;
|
|
|
+ unsigned long eip = kvm_get_linear_rip(vcpu);
|
|
|
+ u32 dr6 = kvm_vcpu_check_hw_bp(eip, 0,
|
|
|
vcpu->arch.guest_debug_dr7,
|
|
|
vcpu->arch.eff_db);
|
|
|
|
|
|
if (dr6 != 0) {
|
|
|
kvm_run->debug.arch.dr6 = dr6 | DR6_FIXED_1 | DR6_RTM;
|
|
|
- kvm_run->debug.arch.pc = kvm_rip_read(vcpu) +
|
|
|
- get_segment_base(vcpu, VCPU_SREG_CS);
|
|
|
-
|
|
|
+ kvm_run->debug.arch.pc = eip;
|
|
|
kvm_run->debug.arch.exception = DB_VECTOR;
|
|
|
kvm_run->exit_reason = KVM_EXIT_DEBUG;
|
|
|
*r = EMULATE_USER_EXIT;
|
|
@@ -5231,7 +5227,8 @@ static bool kvm_vcpu_check_breakpoint(struct kvm_vcpu *vcpu, int *r)
|
|
|
|
|
|
if (unlikely(vcpu->arch.dr7 & DR7_BP_EN_MASK) &&
|
|
|
!(kvm_get_rflags(vcpu) & X86_EFLAGS_RF)) {
|
|
|
- dr6 = kvm_vcpu_check_hw_bp(eip, 0,
|
|
|
+ unsigned long eip = kvm_get_linear_rip(vcpu);
|
|
|
+ u32 dr6 = kvm_vcpu_check_hw_bp(eip, 0,
|
|
|
vcpu->arch.dr7,
|
|
|
vcpu->arch.db);
|
|
|
|
|
@@ -7538,12 +7535,18 @@ int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu)
|
|
|
return kvm_x86_ops->interrupt_allowed(vcpu);
|
|
|
}
|
|
|
|
|
|
-bool kvm_is_linear_rip(struct kvm_vcpu *vcpu, unsigned long linear_rip)
|
|
|
+unsigned long kvm_get_linear_rip(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
- unsigned long current_rip = kvm_rip_read(vcpu) +
|
|
|
- get_segment_base(vcpu, VCPU_SREG_CS);
|
|
|
+ if (is_64_bit_mode(vcpu))
|
|
|
+ return kvm_rip_read(vcpu);
|
|
|
+ return (u32)(get_segment_base(vcpu, VCPU_SREG_CS) +
|
|
|
+ kvm_rip_read(vcpu));
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(kvm_get_linear_rip);
|
|
|
|
|
|
- return current_rip == linear_rip;
|
|
|
+bool kvm_is_linear_rip(struct kvm_vcpu *vcpu, unsigned long linear_rip)
|
|
|
+{
|
|
|
+ return kvm_get_linear_rip(vcpu) == linear_rip;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(kvm_is_linear_rip);
|
|
|
|