From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH non-atomic-injection] x86 emulator: Add cwd/cdq/cqo instruction (opcode 0x99) Date: Sun, 22 Aug 2010 14:34:48 +0300 Message-ID: <4C710B58.7090704@redhat.com> References: <1282227939-4378-1-git-send-email-m.gamal005@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Mohammed Gamal Return-path: Received: from mx1.redhat.com ([209.132.183.28]:12871 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752059Ab0HVLeu (ORCPT ); Sun, 22 Aug 2010 07:34:50 -0400 In-Reply-To: <1282227939-4378-1-git-send-email-m.gamal005@gmail.com> Sender: kvm-owner@vger.kernel.org List-ID: On 08/19/2010 05:25 PM, Mohammed Gamal wrote: > Signed-off-by: Mohammed Gamal > --- > arch/x86/kvm/emulate.c | 16 +++++++++++++++- > 1 files changed, 15 insertions(+), 1 deletions(-) > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index ee4bb69..fddf76d 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -2421,7 +2421,7 @@ static struct opcode opcode_table[256] = { > /* 0x90 - 0x97 */ > X8(D(SrcAcc | DstReg)), > /* 0x98 - 0x9F */ > - D(DstAcc | SrcNone), N, D(SrcImmFAddr | No64), N, > + D(DstAcc | SrcNone), D(ImplicitOps), D(SrcImmFAddr | No64), N, > D(ImplicitOps | Stack), D(ImplicitOps | Stack), N, N, > /* 0xA0 - 0xA7 */ > D(ByteOp | DstAcc | SrcMem | Mov | MemAbs), D(DstAcc | SrcMem | Mov | MemAbs), > @@ -3161,6 +3161,20 @@ special_insn: > case 8: c->dst.val = (s32)c->dst.val; break; > } > break; > + case 0x99: /* cwd/cdq/cqo */ { > + unsigned long rax = c->regs[VCPU_REGS_RAX]; > + unsigned long sign_bit = 1<< ((c->op_bytes * 8) - 1); > + > + if (rax& sign_bit) { > + switch (c->op_bytes) { > + case 2: c->regs[VCPU_REGS_RDX] = 0xffff; break; > + case 4: c->regs[VCPU_REGS_RDX] = 0xffffffff; break; > + case 8: c->regs[VCPU_REGS_RDX] = 0xffffffffffffffff; break; > + } > + } else > + c->regs[VCPU_REGS_RDX] = 0; > + } > + break; Again I have something (a bit simpler) in my queue, will push it soon. I applied your test case. We need to work out a way of not duplicating this work. -- error compiling committee.c: too many arguments to function