Group 2: D2, D3
ROL, ROR, RCL, RCR, SAL/SHL, SHR, SAR,
When these instructions use the CL as their source operands, the
emulator reads regs[VCPU_REGS_RCX] and then calls em_grp2().
This patch changes this to be done in the decoder by introducing
SrcCL flag like Src2CL. The only semantic change is the bit masking
which will be done in decode_operand():
op->val = ctxt->regs[VCPU_REGS_RCX] & 0xff;
This reflects the descriptions in the instruction manuals better in the
sense that what it is reading is the CL.
Note: the new code was tested by adding
asm("sal %1, %0" : "+m"(*mem) : "c"((u8)3));
to kvm-unit-tests/x86/emulator.c; 0xff became 0xf8 successfully.
Signed-off-by: Takuya Yoshikawa <[email protected]>
---
arch/x86/kvm/emulate.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 05a562b..2f287f4 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 */
@@ -3378,7 +3379,7 @@ 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),
+ D2bv(DstMem | SrcOne | ModRM), D2bv(DstMem | SrcCL | ModRM),
N, N, N, N,
/* 0xD8 - 0xDF */
N, N, N, N, N, N, N, N,
@@ -4069,7 +4070,6 @@ special_insn:
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 */
--
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