summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvi Kivity <avi@qumranet.com>2007-11-25 14:22:50 +0100
committerAvi Kivity <avi@qumranet.com>2008-01-30 16:53:18 +0100
commit7ee5d940f5064a7a4f0e53a8ffe755bc26a8b0f1 (patch)
treed14454d9254e90f77c5e7dc55b4adc21ae593e2f
parentKVM: Replace #GP injection by the generalized exception queue (diff)
downloadlinux-7ee5d940f5064a7a4f0e53a8ffe755bc26a8b0f1.tar.xz
linux-7ee5d940f5064a7a4f0e53a8ffe755bc26a8b0f1.zip
KVM: Use generalized exception queue for injecting #UD
Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r--drivers/kvm/svm.c12
-rw-r--r--drivers/kvm/vmx.c11
2 files changed, 3 insertions, 20 deletions
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c
index f9769338c621..06beed7d4a08 100644
--- a/drivers/kvm/svm.c
+++ b/drivers/kvm/svm.c
@@ -207,13 +207,6 @@ static bool svm_exception_injected(struct kvm_vcpu *vcpu)
return !(svm->vmcb->control.exit_int_info & SVM_EXITINTINFO_VALID);
}
-static void inject_ud(struct kvm_vcpu *vcpu)
-{
- to_svm(vcpu)->vmcb->control.event_inj = SVM_EVTINJ_VALID |
- SVM_EVTINJ_TYPE_EXEPT |
- UD_VECTOR;
-}
-
static int is_external_interrupt(u32 info)
{
info &= SVM_EVTINJ_TYPE_MASK | SVM_EVTINJ_VALID;
@@ -948,8 +941,7 @@ static int ud_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
er = emulate_instruction(&svm->vcpu, kvm_run, 0, 0, 0);
if (er != EMULATE_DONE)
- inject_ud(&svm->vcpu);
-
+ kvm_queue_exception(&svm->vcpu, UD_VECTOR);
return 1;
}
@@ -1027,7 +1019,7 @@ static int vmmcall_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
static int invalid_op_interception(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
- inject_ud(&svm->vcpu);
+ kvm_queue_exception(&svm->vcpu, UD_VECTOR);
return 1;
}
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
index 3b3c5f7d2e7c..3b44573c326e 100644
--- a/drivers/kvm/vmx.c
+++ b/drivers/kvm/vmx.c
@@ -613,14 +613,6 @@ static bool vmx_exception_injected(struct kvm_vcpu *vcpu)
return !(vmx->idt_vectoring_info & VECTORING_INFO_VALID_MASK);
}
-static void vmx_inject_ud(struct kvm_vcpu *vcpu)
-{
- vmcs_write32(VM_ENTRY_INTR_INFO_FIELD,
- UD_VECTOR |
- INTR_TYPE_EXCEPTION |
- INTR_INFO_VALID_MASK);
-}
-
/*
* Swap MSR entry in host/guest MSR entry array.
*/
@@ -1866,8 +1858,7 @@ static int handle_exception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
if (is_invalid_opcode(intr_info)) {
er = emulate_instruction(vcpu, kvm_run, 0, 0, 0);
if (er != EMULATE_DONE)
- vmx_inject_ud(vcpu);
-
+ kvm_queue_exception(vcpu, UD_VECTOR);
return 1;
}