From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [PATCH] gfxboot VMX workaround v2 Date: Fri, 18 Apr 2008 08:23:07 -0500 Message-ID: <4808A0BB.20500@codemonkey.ws> References: <47FA1DD5.3050500@suse.de> <47FA4632.9040403@codemonkey.ws> <20080415110755.183ba530@frecb000711.frec.bull.fr> <4804A863.4040300@qumranet.com> <20080418141816.29e745f0@frecb000711.frec.bull.fr> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: kvm-devel , Avi Kivity To: Guillaume Thouvenin Return-path: In-Reply-To: <20080418141816.29e745f0@frecb000711.frec.bull.fr> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces@lists.sourceforge.net Errors-To: kvm-devel-bounces@lists.sourceforge.net List-Id: kvm.vger.kernel.org Guillaume Thouvenin wrote: > On Tue, 15 Apr 2008 16:06:43 +0300 > Avi Kivity 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