From b63bfa0f24b4d0df9a2e9053170a499dc92f9324 Mon Sep 17 00:00:00 2001 From: Guillaume Thouvenin Date: Thu, 4 Dec 2008 14:26:42 +0100 Subject: [PATCH] --- yaml --- r: 125283 b: refs/heads/master c: 0dc8d10f7d848b63c8d32cf6fd31ba7def792ac9 h: refs/heads/master i: 125281: 98f2c81bd6b8037450c2776816b2acca43a9ce78 125279: e20991d52988f979506069e9c49720057a397686 v: v3 --- [refs] | 2 +- trunk/arch/x86/include/asm/kvm_x86_emulate.h | 1 + trunk/arch/x86/kvm/x86_emulate.c | 29 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 7fe87462321f..086bd5146c93 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 45ed60b371aeae6ed80f7e9d594a5e6412edc176 +refs/heads/master: 0dc8d10f7d848b63c8d32cf6fd31ba7def792ac9 diff --git a/trunk/arch/x86/include/asm/kvm_x86_emulate.h b/trunk/arch/x86/include/asm/kvm_x86_emulate.h index 16a002655f31..6a159732881a 100644 --- a/trunk/arch/x86/include/asm/kvm_x86_emulate.h +++ b/trunk/arch/x86/include/asm/kvm_x86_emulate.h @@ -123,6 +123,7 @@ struct decode_cache { u8 ad_bytes; u8 rex_prefix; struct operand src; + struct operand src2; struct operand dst; bool has_seg_override; u8 seg_override; diff --git a/trunk/arch/x86/kvm/x86_emulate.c b/trunk/arch/x86/kvm/x86_emulate.c index 7a07ca46c8ae..7f5cd62362c5 100644 --- a/trunk/arch/x86/kvm/x86_emulate.c +++ b/trunk/arch/x86/kvm/x86_emulate.c @@ -70,6 +70,12 @@ #define Group (1<<14) /* Bits 3:5 of modrm byte extend opcode */ #define GroupDual (1<<15) /* Alternate decoding of mod == 3 */ #define GroupMask 0xff /* Group number stored in bits 0:7 */ +/* Source 2 operand type */ +#define Src2None (0<<29) +#define Src2CL (1<<29) +#define Src2ImmByte (2<<29) +#define Src2One (3<<29) +#define Src2Mask (7<<29) enum { Group1_80, Group1_81, Group1_82, Group1_83, @@ -1000,6 +1006,29 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) break; } + /* + * Decode and fetch the second source operand: register, memory + * or immediate. + */ + switch (c->d & Src2Mask) { + case Src2None: + break; + case Src2CL: + c->src2.bytes = 1; + c->src2.val = c->regs[VCPU_REGS_RCX] & 0x8; + break; + case Src2ImmByte: + c->src2.type = OP_IMM; + c->src2.ptr = (unsigned long *)c->eip; + c->src2.bytes = 1; + c->src2.val = insn_fetch(u8, 1, c->eip); + break; + case Src2One: + c->src2.bytes = 1; + c->src2.val = 1; + break; + } + /* Decode and fetch the destination operand: register or memory. */ switch (c->d & DstMask) { case ImplicitOps: