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 <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to