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 > kvm-devel@lists.sourceforge.net > 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 kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel