From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mohammed Gamal Subject: [PATCH] x86 emulator: Complete mov r, imm instructions (opcodes 0xb0-0xbf) Date: Mon, 18 Aug 2008 23:10:49 +0300 Message-ID: <20080818201049.GA16334@mohd-laptop> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: avi@qumranet.com, riel@surriel.com To: kvm@vger.kernel.org Return-path: Received: from wr-out-0506.google.com ([64.233.184.226]:33898 "EHLO wr-out-0506.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752462AbYHRUK6 (ORCPT ); Mon, 18 Aug 2008 16:10:58 -0400 Received: by wr-out-0506.google.com with SMTP id 69so2229302wri.5 for ; Mon, 18 Aug 2008 13:10:57 -0700 (PDT) Content-Disposition: inline Sender: kvm-owner@vger.kernel.org List-ID: The emulator only supported instruction opcode 0xb8. This adds the rest of these instructions. Some of the instructions were ecountered while running the BIOS with the invalid guest state emulation patches. Emulator test cases will be added later. Signed-off-by: Mohammed Gamal --- arch/x86/kvm/x86_emulate.c | 23 +++++++++++++++++++---- 1 files changed, 19 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index dfc1090..b97e80e 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c @@ -154,9 +154,16 @@ static u16 opcode_table[256] = { 0, 0, ByteOp | ImplicitOps | Mov | String, ImplicitOps | Mov | String, ByteOp | ImplicitOps | Mov | String, ImplicitOps | Mov | String, ByteOp | ImplicitOps | String, ImplicitOps | String, - /* 0xB0 - 0xBF */ - 0, 0, 0, 0, 0, 0, 0, 0, - DstReg | SrcImm | Mov, 0, 0, 0, 0, 0, 0, 0, + /* 0xB0 - 0xB7 */ + ByteOp | DstReg | SrcImm | Mov, ByteOp | DstReg | SrcImm | Mov, + ByteOp | DstReg | SrcImm | Mov, ByteOp | DstReg | SrcImm | Mov, + ByteOp | DstReg | SrcImm | Mov, ByteOp | DstReg | SrcImm | Mov, + ByteOp | DstReg | SrcImm | Mov, ByteOp | DstReg | SrcImm | Mov, + /* 0xB8 - 0xBF */ + DstReg | SrcImm | Mov, DstReg | SrcImm | Mov, + DstReg | SrcImm | Mov, DstReg | SrcImm | Mov, + DstReg | SrcImm | Mov, DstReg | SrcImm | Mov, + DstReg | SrcImm | Mov, DstReg | SrcImm | Mov, /* 0xC0 - 0xC7 */ ByteOp | DstMem | SrcImm | ModRM, DstMem | SrcImmByte | ModRM, 0, ImplicitOps | Stack, 0, 0, @@ -1665,7 +1672,15 @@ special_insn: case 0xae ... 0xaf: /* scas */ DPRINTF("Urk! I don't handle SCAS.\n"); goto cannot_emulate; - case 0xb8: /* mov r, imm */ + case 0xb0 ... 0xb3: /* mov r, imm (low byte) */ + c->dst.val &= ~0xff; /* Clear the low byte */ + c->dst.val |= c->src.val; + break; + case 0xb4 ... 0xb7: /* mov r, imm (high byte) */ + c->dst.val &= ~0xff00; /* Clear the high byte */ + c->dst.val |= (c->src.val << 8); + break; + case 0xb8 ... 0xbf: /* mov r, imm */ goto mov; case 0xc0 ... 0xc1: emulate_grp2(ctxt); -- 1.5.4.3