Group 2: C0, C1, D0, D1, D2, D3 According to the SDM, the case 6 of em_grp2() should be treated as undefined and the opcode D2/D3 should be decoded using the SrcCL. Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@xxxxxxxxxxxxx> --- arch/x86/kvm/emulate.c | 23 ++++++++++------------- 1 files changed, 10 insertions(+), 13 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index f641201..87e7616 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -101,6 +101,7 @@ #define SrcAcc (OpAcc << SrcShift) #define SrcImmU16 (OpImmU16 << SrcShift) #define SrcDX (OpDX << SrcShift) +#define SrcCL (OpCL << SrcShift) #define SrcMask (OpMask << SrcShift) #define BitOp (1<<11) #define MemAbs (1<<12) /* Memory operand is absolute displacement */ @@ -1696,7 +1697,6 @@ static int em_grp2(struct x86_emulate_ctxt *ctxt) emulate_2op_SrcB(ctxt, "rcr"); break; case 4: /* sal/shl */ - case 6: /* sal/shl */ emulate_2op_SrcB(ctxt, "sal"); break; case 5: /* shr */ @@ -3206,6 +3206,12 @@ static struct opcode group1A[] = { D(DstMem | SrcNone | ModRM | Mov | Stack), N, N, N, N, N, N, N, }; +static struct opcode group2[] = { + X6(I(DstMem | ModRM, em_grp2)), + N, + I(DstMem | ModRM, em_grp2), +}; + static struct opcode group3[] = { I(DstMem | SrcImm | ModRM, em_test), I(DstMem | SrcImm | ModRM, em_test), @@ -3358,7 +3364,7 @@ static struct opcode opcode_table[256] = { /* 0xB8 - 0xBF */ X8(I(DstReg | SrcImm | Mov, em_mov)), /* 0xC0 - 0xC7 */ - D2bv(DstMem | SrcImmByte | ModRM), + G(ByteOp | SrcImmByte, group2), G(SrcImmByte, group2), I(ImplicitOps | Stack | SrcImmU16, em_ret_near_imm), I(ImplicitOps | Stack, em_ret), I(DstReg | SrcMemFAddr | ModRM | No64 | Src2ES, em_lseg), @@ -3369,7 +3375,8 @@ static struct opcode opcode_table[256] = { D(ImplicitOps), DI(SrcImmByte, intn), D(ImplicitOps | No64), II(ImplicitOps, em_iret, iret), /* 0xD0 - 0xD7 */ - D2bv(DstMem | SrcOne | ModRM), D2bv(DstMem | ModRM), + G(ByteOp | SrcOne, group2), G(SrcOne, group2), + G(ByteOp | SrcReg | SrcCL, group2), G(SrcReg | SrcCL, group2), N, N, N, N, /* 0xD8 - 0xDF */ N, N, N, N, N, N, N, N, @@ -4046,9 +4053,6 @@ special_insn: case 8: ctxt->dst.val = (s32)ctxt->dst.val; break; } break; - case 0xc0 ... 0xc1: - rc = em_grp2(ctxt); - break; case 0xcc: /* int3 */ rc = emulate_int(ctxt, 3); break; @@ -4059,13 +4063,6 @@ special_insn: if (ctxt->eflags & EFLG_OF) rc = emulate_int(ctxt, 4); break; - case 0xd0 ... 0xd1: /* Grp2 */ - rc = em_grp2(ctxt); - break; - case 0xd2 ... 0xd3: /* Grp2 */ - ctxt->src.val = ctxt->regs[VCPU_REGS_RCX]; - rc = em_grp2(ctxt); - break; case 0xe9: /* jmp rel */ case 0xeb: /* jmp rel short */ jmp_rel(ctxt, ctxt->src.val); -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html