aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2011-09-13 03:45:43 -0400
committerAvi Kivity <avi@redhat.com>2011-09-25 12:52:50 -0400
commit4dd6a57df7ca9088a4b14664764e7adb9c120bb1 (patch)
tree2748d954ad5dbf669429a2d027f4c7f437e8d59f /arch
parentb1ea50b2b63a95aa5a7944b48ba4d0e9b32211d3 (diff)
KVM: x86 emulator: switch src2 to generic decode_operand()
Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kvm/emulate.c51
1 files changed, 26 insertions, 25 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 8c65ff274785..88d32fca1114 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -40,6 +40,10 @@
40#define OpMem64 6ull /* Memory, 64-bit */ 40#define OpMem64 6ull /* Memory, 64-bit */
41#define OpImmUByte 7ull /* Zero-extended 8-bit immediate */ 41#define OpImmUByte 7ull /* Zero-extended 8-bit immediate */
42#define OpDX 8ull /* DX register */ 42#define OpDX 8ull /* DX register */
43#define OpCL 9ull /* CL register (for shifts) */
44#define OpImmByte 10ull /* 8-bit sign extended immediate */
45#define OpOne 11ull /* Implied 1 */
46#define OpImm 12ull /* Sign extended immediate */
43 47
44#define OpBits 4 /* Width of operand field */ 48#define OpBits 4 /* Width of operand field */
45#define OpMask ((1ull << OpBits) - 1) 49#define OpMask ((1ull << OpBits) - 1)
@@ -108,12 +112,13 @@
108#define Priv (1<<27) /* instruction generates #GP if current CPL != 0 */ 112#define Priv (1<<27) /* instruction generates #GP if current CPL != 0 */
109#define No64 (1<<28) 113#define No64 (1<<28)
110/* Source 2 operand type */ 114/* Source 2 operand type */
111#define Src2None (0u<<29) 115#define Src2Shift (29)
112#define Src2CL (1u<<29) 116#define Src2None (OpNone << Src2Shift)
113#define Src2ImmByte (2u<<29) 117#define Src2CL (OpCL << Src2Shift)
114#define Src2One (3u<<29) 118#define Src2ImmByte (OpImmByte << Src2Shift)
115#define Src2Imm (4u<<29) 119#define Src2One (OpOne << Src2Shift)
116#define Src2Mask (7u<<29) 120#define Src2Imm (OpImm << Src2Shift)
121#define Src2Mask (OpMask << Src2Shift)
117 122
118#define X2(x...) x, x 123#define X2(x...) x, x
119#define X3(x...) X2(x), x 124#define X3(x...) X2(x), x
@@ -3382,6 +3387,20 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op,
3382 op->addr.reg = &ctxt->regs[VCPU_REGS_RDX]; 3387 op->addr.reg = &ctxt->regs[VCPU_REGS_RDX];
3383 fetch_register_operand(op); 3388 fetch_register_operand(op);
3384 break; 3389 break;
3390 case OpCL:
3391 op->bytes = 1;
3392 op->val = ctxt->regs[VCPU_REGS_RCX] & 0xff;
3393 break;
3394 case OpImmByte:
3395 rc = decode_imm(ctxt, op, 1, true);
3396 break;
3397 case OpOne:
3398 op->bytes = 1;
3399 op->val = 1;
3400 break;
3401 case OpImm:
3402 rc = decode_imm(ctxt, op, imm_size(ctxt), true);
3403 break;
3385 case OpImplicit: 3404 case OpImplicit:
3386 /* Special instructions do their own operand decoding. */ 3405 /* Special instructions do their own operand decoding. */
3387 default: 3406 default:
@@ -3656,25 +3675,7 @@ done_prefixes:
3656 * Decode and fetch the second source operand: register, memory 3675 * Decode and fetch the second source operand: register, memory
3657 * or immediate. 3676 * or immediate.
3658 */ 3677 */
3659 switch (ctxt->d & Src2Mask) { 3678 rc = decode_operand(ctxt, &ctxt->src2, (ctxt->d >> Src2Shift) & OpMask);
3660 case Src2None:
3661 break;
3662 case Src2CL:
3663 ctxt->src2.bytes = 1;
3664 ctxt->src2.val = ctxt->regs[VCPU_REGS_RCX] & 0xff;
3665 break;
3666 case Src2ImmByte:
3667 rc = decode_imm(ctxt, &ctxt->src2, 1, true);
3668 break;
3669 case Src2One:
3670 ctxt->src2.bytes = 1;
3671 ctxt->src2.val = 1;
3672 break;
3673 case Src2Imm:
3674 rc = decode_imm(ctxt, &ctxt->src2, imm_size(ctxt), true);
3675 break;
3676 }
3677
3678 if (rc != X86EMUL_CONTINUE) 3679 if (rc != X86EMUL_CONTINUE)
3679 goto done; 3680 goto done;
3680 3681