KVM: Use generalized exception queue for injecting #UD
Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
c1a5d4f990
commit
7ee5d940f5
@ -207,13 +207,6 @@ static bool svm_exception_injected(struct kvm_vcpu *vcpu)
|
|||||||
return !(svm->vmcb->control.exit_int_info & SVM_EXITINTINFO_VALID);
|
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)
|
static int is_external_interrupt(u32 info)
|
||||||
{
|
{
|
||||||
info &= SVM_EVTINJ_TYPE_MASK | SVM_EVTINJ_VALID;
|
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);
|
er = emulate_instruction(&svm->vcpu, kvm_run, 0, 0, 0);
|
||||||
if (er != EMULATE_DONE)
|
if (er != EMULATE_DONE)
|
||||||
inject_ud(&svm->vcpu);
|
kvm_queue_exception(&svm->vcpu, UD_VECTOR);
|
||||||
|
|
||||||
return 1;
|
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,
|
static int invalid_op_interception(struct vcpu_svm *svm,
|
||||||
struct kvm_run *kvm_run)
|
struct kvm_run *kvm_run)
|
||||||
{
|
{
|
||||||
inject_ud(&svm->vcpu);
|
kvm_queue_exception(&svm->vcpu, UD_VECTOR);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,14 +613,6 @@ static bool vmx_exception_injected(struct kvm_vcpu *vcpu)
|
|||||||
return !(vmx->idt_vectoring_info & VECTORING_INFO_VALID_MASK);
|
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.
|
* 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)) {
|
if (is_invalid_opcode(intr_info)) {
|
||||||
er = emulate_instruction(vcpu, kvm_run, 0, 0, 0);
|
er = emulate_instruction(vcpu, kvm_run, 0, 0, 0);
|
||||||
if (er != EMULATE_DONE)
|
if (er != EMULATE_DONE)
|
||||||
vmx_inject_ud(vcpu);
|
kvm_queue_exception(vcpu, UD_VECTOR);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user