KVM: VMX: Do not skip the instruction if handle_dr injects a fault
PATCH 1/1 KVM: VMX: Do not skip the instruction if handle_dr injects a fault
If kvm_get_dr or kvm_set_dr reports that it raised a fault, we must not advance the instruction pointer. Otherwise the exception will hit the wrong instruction.
Signed-off-by Jan Kiszka <[email protected]>
--- arch/x86/kvm/vmx.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
arch/x86/kvm/vmx.c +7 -3
@@ -5141,10 +5141,14 @@ static int handle_dr(struct kvm_vcpu *vcpu) reg =DEBUG_REG_ACCESS_REG (exit_qualification);if (exit_qualification &TYPE_MOV_FROM_DR ) {unsigned long val; -if (!kvm_get_dr (vcpu, dr, &val)) -kvm_register_write (vcpu, reg, val); + +if (kvm_get_dr (vcpu, dr, &val)) +return 1 ; +kvm_register_write (vcpu, reg, val); }else -kvm_set_dr (vcpu, dr, vcpu->arch.regs[reg]); +if (kvm_set_dr (vcpu, dr, vcpu->arch.regs[reg])) +return 1 ; +skip_emulated_instruction (vcpu);return 1 ; }
Signature · 1 line
1.8.1.1.298.ge7eed54
Il 18/12/2013 19:16, Jan Kiszka ha scritto:
Quoted 22 lines
If
kvm_get_drorkvm_set_drreports that it raised a fault, we must not advance the instruction pointer. Otherwise the exception will hit the wrong instruction.Signed-off-by Jan Kiszka <[email protected]>--- arch/x86/kvm/vmx.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)arch/x86/kvm/vmx.c +2
-2@@ -5141,10 +5141,14 @@ static int handle_dr(struct kvm_vcpu *vcpu) reg =DEBUG_REG_ACCESS_REG (exit_qualification);if (exit_qualification &TYPE_MOV_FROM_DR ) {unsigned long val; -if (!kvm_get_dr (vcpu, dr, &val)) -kvm_register_write (vcpu, reg, val); + +if (kvm_get_dr (vcpu, dr, &val))
arch/x86/kvm/vmx.c static int handle_dr(struct kvm_vcpu *vcpu) · line 5154
Quoted 10 lines
arch/x86/kvm/vmx.c +5
-1+return 1 ; +kvm_register_write (vcpu, reg, val); }else -kvm_set_dr (vcpu, dr, vcpu->arch.regs[reg]); +if (kvm_set_dr (vcpu, dr, vcpu->arch.regs[reg])) +return 1 ; +skip_emulated_instruction (vcpu);return 1 ; }
Applied to kvm/queue, thanks.
Paolo