Skip to content

Commit

Permalink
KVM: x86 emulator: advance RIP outside x86 emulator code
Browse files Browse the repository at this point in the history
Return new RIP as part of instruction emulation result instead of
updating KVM's RIP from x86 emulator code.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
  • Loading branch information
Gleb Natapov authored and Avi Kivity committed Aug 1, 2010
1 parent 3457e41 commit 95c5588
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 3 deletions.
7 changes: 4 additions & 3 deletions arch/x86/kvm/emulate.c
Original file line number Diff line number Diff line change
Expand Up @@ -2496,8 +2496,9 @@ int emulator_task_switch(struct x86_emulate_ctxt *ctxt,

if (rc == X86EMUL_CONTINUE) {
memcpy(ctxt->vcpu->arch.regs, c->regs, sizeof c->regs);
kvm_rip_write(ctxt->vcpu, c->eip);
rc = writeback(ctxt, ops);
if (rc == X86EMUL_CONTINUE)
ctxt->eip = c->eip;
}

return (rc == X86EMUL_UNHANDLEABLE) ? -1 : 0;
Expand Down Expand Up @@ -2554,7 +2555,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) {
string_done:
ctxt->restart = false;
kvm_rip_write(ctxt->vcpu, c->eip);
ctxt->eip = c->eip;
goto done;
}
/* The second termination condition only applies for REPE
Expand Down Expand Up @@ -3032,7 +3033,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
ctxt->decode.mem_read.end = 0;
/* Commit shadow register state. */
memcpy(ctxt->vcpu->arch.regs, c->regs, sizeof c->regs);
kvm_rip_write(ctxt->vcpu, c->eip);
ctxt->eip = c->eip;
ops->set_rflags(ctxt->vcpu, ctxt->eflags);

done:
Expand Down
2 changes: 2 additions & 0 deletions arch/x86/kvm/x86.c
Original file line number Diff line number Diff line change
Expand Up @@ -3941,6 +3941,7 @@ int emulate_instruction(struct kvm_vcpu *vcpu,

shadow_mask = vcpu->arch.emulate_ctxt.interruptibility;
kvm_x86_ops->set_interrupt_shadow(vcpu, shadow_mask);
kvm_rip_write(vcpu, vcpu->arch.emulate_ctxt.eip);

if (vcpu->arch.pio.count) {
if (!vcpu->arch.pio.in)
Expand Down Expand Up @@ -4945,6 +4946,7 @@ int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int reason,
if (ret)
return EMULATE_FAIL;

kvm_rip_write(vcpu, vcpu->arch.emulate_ctxt.eip);
kvm_x86_ops->set_rflags(vcpu, vcpu->arch.emulate_ctxt.eflags);
return EMULATE_DONE;
}
Expand Down

0 comments on commit 95c5588

Please sign in to comment.