Guillaume Thouvenin wrote:
> On Tue, 15 Apr 2008 16:06:43 +0300
> Avi Kivity <[EMAIL PROTECTED]> wrote:
>
>
>>> ...
>>> handle_vmentry_failure: invalid guest state
>>> handle_vmentry_failure: start emulation
>>> handle_vmentry_failure: emulation failed
>>>
>>>
>> What instruction failed, exactly?
>>
>>
>
> I added the code do dump the instruction and it seems that it's the
> emulation of 0xe6 (== out imm8, al) that failed. I made modifications
> to emulate it (see below) and now I have another problem in kvm
> userspace with the following message (and the emulation doesn't work):
>
> enterprise:~ $ kvm_run: Operation not permitted
> enterprise:~ $ kvm_run returned -1
>
>
>> You need to load rip as well.
>>
>
> Ooops, yes. So jump far emulation is now like:
>
> + case 0xea: /* jmp far */ {
> + struct kvm_segment kvm_seg;
> + long int eip;
> + int ret;
> +
> + kvm_x86_ops->get_segment(ctxt->vcpu, &kvm_seg, VCPU_SREG_CS);
> +
> + ret = load_segment_descriptor(ctxt->vcpu, kvm_seg.selector,
> 9, VCPU_SREG_CS);
> + if (ret < 0){
> + printk(KERN_INFO "%s: Failed to load CS
> descriptor\n", __FUNCTION__);
> + goto cannot_emulate;
> + }
> +
> + switch (c->op_bytes) {
> + case 2:
> + eip = insn_fetch(s16, 2, c->eip);
> + break;
> + case 4:
> + eip = insn_fetch(s32, 4, c->eip);
> + break;
> + default:
> + DPRINTF("jmp far: Invalid op_bytes\n");
> + goto cannot_emulate;
> + }
> + printk(KERN_INFO "eip == 0x%lx\n", eip);
> + c->eip = eip;
> + break;
> + }
>
> It seems that the jump to cs:eip works and now I have the following error:
>
> [18535.446917] handle_vmentry_failure: invalid guest state
> [18535.449519] handle_vmentry_failure: start emulation
> [18535.457519] eip == 0x6e18
> [18535.467685] handle_vmentry_failure: emulation of 0xe6 failed
>
> For the emulation of 0xe6 I used the following one that I found in
> nitin's tree:
>
This doesn't seem right. You should have been able to break out of the
emulator long before encountering an out instruction. The next
instruction you encounter should be a mov instruction. Are you sure
you're updating eip correctly?
Regards,
Anthony Liguori
> + case 0xe6: /* out imm8, al */
> + case 0xe7: /* out imm8, ax/eax */ {
> + struct kvm_io_device *pio_dev;
> +
> + pio_dev = vcpu_find_pio_dev(ctxt->vcpu, c->src.val);
> + kvm_iodevice_write(pio_dev, c->src.val,
> + (c->d & ByteOp) ? 1 : c->op_bytes,
> + &c->regs[VCPU_REGS_RAX]);
> + }
> + break;
>
> I will look closer where is the problem and as you suggested, I will
> display the instruction to be emulated and the register state before
> and after, and compare with the expected state.
>
>
> Thanks for your help,
> Regards,
> Guillaume
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
> Don't miss this year's exciting event. There's still time to save $100.
> Use priority code J8TL2D2.
> http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
> _______________________________________________
> kvm-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/kvm-devel
>
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
kvm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel