mirror of https://gitee.com/openkylin/linux.git
KVM: Add kvm_inject_realmode_interrupt() wrapper
This adds a wrapper function kvm_inject_realmode_interrupt() around the emulator function emulate_int_real() to allow real mode interrupt injection. [avi: initialize operand and address sizes before emulating interrupts] [avi: initialize rip for real mode interrupt injection] [avi: clear interrupt pending flag after emulating interrupt injection] Signed-off-by: Mohammed Gamal <m.gamal005@gmail.com> Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
4ab8e02404
commit
63995653ad
|
@ -4188,6 +4188,35 @@ static void init_emulate_ctxt(struct kvm_vcpu *vcpu)
|
|||
memcpy(c->regs, vcpu->arch.regs, sizeof c->regs);
|
||||
}
|
||||
|
||||
int kvm_inject_realmode_interrupt(struct kvm_vcpu *vcpu, int irq)
|
||||
{
|
||||
struct decode_cache *c = &vcpu->arch.emulate_ctxt.decode;
|
||||
int ret;
|
||||
|
||||
init_emulate_ctxt(vcpu);
|
||||
|
||||
vcpu->arch.emulate_ctxt.decode.op_bytes = 2;
|
||||
vcpu->arch.emulate_ctxt.decode.ad_bytes = 2;
|
||||
vcpu->arch.emulate_ctxt.decode.eip = vcpu->arch.emulate_ctxt.eip;
|
||||
ret = emulate_int_real(&vcpu->arch.emulate_ctxt, &emulate_ops, irq);
|
||||
|
||||
if (ret != X86EMUL_CONTINUE)
|
||||
return EMULATE_FAIL;
|
||||
|
||||
vcpu->arch.emulate_ctxt.eip = c->eip;
|
||||
memcpy(vcpu->arch.regs, c->regs, sizeof c->regs);
|
||||
kvm_rip_write(vcpu, vcpu->arch.emulate_ctxt.eip);
|
||||
kvm_x86_ops->set_rflags(vcpu, vcpu->arch.emulate_ctxt.eflags);
|
||||
|
||||
if (irq == NMI_VECTOR)
|
||||
vcpu->arch.nmi_pending = false;
|
||||
else
|
||||
vcpu->arch.interrupt.pending = false;
|
||||
|
||||
return EMULATE_DONE;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kvm_inject_realmode_interrupt);
|
||||
|
||||
static int handle_emulation_failure(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
++vcpu->stat.insn_emulation_fail;
|
||||
|
|
|
@ -72,6 +72,7 @@ static inline int is_paging(struct kvm_vcpu *vcpu)
|
|||
|
||||
void kvm_before_handle_nmi(struct kvm_vcpu *vcpu);
|
||||
void kvm_after_handle_nmi(struct kvm_vcpu *vcpu);
|
||||
int kvm_inject_realmode_interrupt(struct kvm_vcpu *vcpu, int irq);
|
||||
|
||||
void kvm_write_tsc(struct kvm_vcpu *vcpu, u64 data);
|
||||
|
||||
|
|
Loading…
Reference in New Issue