diff options
author | Jan Kiszka <jan.kiszka@web.de> | 2009-10-18 07:24:54 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-12-03 02:32:19 -0500 |
commit | 6be7d3062b59af891be7e40c6802350de5f78cef (patch) | |
tree | 288a374df5a3eb111aae003a2eeaa0442384e079 /arch/x86/kvm/svm.c | |
parent | 94fe45da48f921d01d8ff02a0ad54ee9c326d7f0 (diff) |
KVM: SVM: Cleanup NMI singlestep
Push the NMI-related singlestep variable into vcpu_svm. It's dealing
with an AMD-specific deficit, nothing generic for x86.
Acked-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
arch/x86/include/asm/kvm_host.h | 1 -
arch/x86/kvm/svm.c | 12 +++++++-----
2 files changed, 7 insertions(+), 6 deletions(-)
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r-- | arch/x86/kvm/svm.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 170b2d9c6909..ffa6ad216b71 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -107,6 +107,8 @@ struct vcpu_svm { | |||
107 | u32 *msrpm; | 107 | u32 *msrpm; |
108 | 108 | ||
109 | struct nested_state nested; | 109 | struct nested_state nested; |
110 | |||
111 | bool nmi_singlestep; | ||
110 | }; | 112 | }; |
111 | 113 | ||
112 | /* enable NPT for AMD64 and X86 with PAE */ | 114 | /* enable NPT for AMD64 and X86 with PAE */ |
@@ -1050,7 +1052,7 @@ static void update_db_intercept(struct kvm_vcpu *vcpu) | |||
1050 | svm->vmcb->control.intercept_exceptions &= | 1052 | svm->vmcb->control.intercept_exceptions &= |
1051 | ~((1 << DB_VECTOR) | (1 << BP_VECTOR)); | 1053 | ~((1 << DB_VECTOR) | (1 << BP_VECTOR)); |
1052 | 1054 | ||
1053 | if (vcpu->arch.singlestep) | 1055 | if (svm->nmi_singlestep) |
1054 | svm->vmcb->control.intercept_exceptions |= (1 << DB_VECTOR); | 1056 | svm->vmcb->control.intercept_exceptions |= (1 << DB_VECTOR); |
1055 | 1057 | ||
1056 | if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) { | 1058 | if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) { |
@@ -1195,13 +1197,13 @@ static int db_interception(struct vcpu_svm *svm) | |||
1195 | 1197 | ||
1196 | if (!(svm->vcpu.guest_debug & | 1198 | if (!(svm->vcpu.guest_debug & |
1197 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) && | 1199 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) && |
1198 | !svm->vcpu.arch.singlestep) { | 1200 | !svm->nmi_singlestep) { |
1199 | kvm_queue_exception(&svm->vcpu, DB_VECTOR); | 1201 | kvm_queue_exception(&svm->vcpu, DB_VECTOR); |
1200 | return 1; | 1202 | return 1; |
1201 | } | 1203 | } |
1202 | 1204 | ||
1203 | if (svm->vcpu.arch.singlestep) { | 1205 | if (svm->nmi_singlestep) { |
1204 | svm->vcpu.arch.singlestep = false; | 1206 | svm->nmi_singlestep = false; |
1205 | if (!(svm->vcpu.guest_debug & KVM_GUESTDBG_SINGLESTEP)) | 1207 | if (!(svm->vcpu.guest_debug & KVM_GUESTDBG_SINGLESTEP)) |
1206 | svm->vmcb->save.rflags &= | 1208 | svm->vmcb->save.rflags &= |
1207 | ~(X86_EFLAGS_TF | X86_EFLAGS_RF); | 1209 | ~(X86_EFLAGS_TF | X86_EFLAGS_RF); |
@@ -2543,7 +2545,7 @@ static void enable_nmi_window(struct kvm_vcpu *vcpu) | |||
2543 | /* Something prevents NMI from been injected. Single step over | 2545 | /* Something prevents NMI from been injected. Single step over |
2544 | possible problem (IRET or exception injection or interrupt | 2546 | possible problem (IRET or exception injection or interrupt |
2545 | shadow) */ | 2547 | shadow) */ |
2546 | vcpu->arch.singlestep = true; | 2548 | svm->nmi_singlestep = true; |
2547 | svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF); | 2549 | svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF); |
2548 | update_db_intercept(vcpu); | 2550 | update_db_intercept(vcpu); |
2549 | } | 2551 | } |