From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [Patch 4/7] RealMode: Adds support for jmp far 0xea Date: Tue, 27 May 2008 13:32:40 -0500 Message-ID: <483C53C8.6030400@us.ibm.com> References: <20080527084115.2b0cfae1@frecb000711.frec.bull.fr> <20080527101908.749cff41@frecb000711.frec.bull.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: "kvm@vger.kernel.org" , Avi Kivity , Anthony Liguori , Mohammed Gamal , "Kamble, Nitin A" , Marcelo Tosatti , laurent.vivier@bull.net, Alexander Graf To: Guillaume Thouvenin Return-path: Received: from e34.co.us.ibm.com ([32.97.110.152]:48890 "EHLO e34.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758643AbYE0Sd2 (ORCPT ); Tue, 27 May 2008 14:33:28 -0400 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e34.co.us.ibm.com (8.13.8/8.13.8) with ESMTP id m4RIXRVd021160 for ; Tue, 27 May 2008 14:33:27 -0400 Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v8.7) with ESMTP id m4RIXHmW086060 for ; Tue, 27 May 2008 12:33:20 -0600 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m4RIWswq005506 for ; Tue, 27 May 2008 12:33:16 -0600 In-Reply-To: <20080527101908.749cff41@frecb000711.frec.bull.fr> Sender: kvm-owner@vger.kernel.org List-ID: Guillaume Thouvenin wrote: > Adds support for jmp far 0xea instruction > > > Signed-off-by: Guillaume Thouvenin > Signed-off-by: Laurent Vivier > > --- > arch/x86/kvm/x86_emulate.c | 31 +++++++++++++++++++++++++++++-- > 1 files changed, 29 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c > index a928aa6..48b62cc 100644 > --- a/arch/x86/kvm/x86_emulate.c > +++ b/arch/x86/kvm/x86_emulate.c > @@ -168,7 +168,8 @@ static u16 opcode_table[256] = { > /* 0xE0 - 0xE7 */ > 0, 0, 0, 0, 0, 0, 0, 0, > /* 0xE8 - 0xEF */ > - ImplicitOps | Stack, SrcImm|ImplicitOps, 0, SrcImmByte|ImplicitOps, > + ImplicitOps | Stack, SrcImm | ImplicitOps, > + ImplicitOps, SrcImmByte | ImplicitOps, > 0, 0, 0, 0, > /* 0xF0 - 0xF7 */ > 0, 0, 0, 0, > @@ -1661,7 +1662,33 @@ special_insn: > break; > } > case 0xe9: /* jmp rel */ > - case 0xeb: /* jmp rel short */ > + goto jmp; > The cases don't have to be in ascending order. Much better to leave 0xeb here then have a jmp cross case boundaries. Regards, Anthony Liguori > + case 0xea: /* jmp far */ { > + uint32_t eip; > + uint16_t sel; > + > + switch (c->op_bytes) { > + case 2: > + eip = insn_fetch(u16, 2, c->eip); > + break; > + case 4: > + eip = insn_fetch(u32, 4, c->eip); > + break; > + default: > + DPRINTF("jmp far: Invalid op_bytes\n"); > + goto cannot_emulate; > + } > + sel = insn_fetch(u16, 2, c->eip); > + if (kvm_load_segment_descriptor(ctxt->vcpu, sel, 9, VCPU_SREG_CS) < 0) { > + DPRINTF("jmp far: Failed to load CS descriptor\n"); > + goto cannot_emulate; > + } > + > + c->eip = eip; > + break; > + } > + case 0xeb: > + jmp: /* jmp rel short */ > jmp_rel(c, c->src.val); > c->dst.type = OP_NONE; /* Disable writeback. */ > break; >