diff options
author | Avi Kivity <avi@redhat.com> | 2011-09-13 03:45:43 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-09-25 12:52:50 -0400 |
commit | 4dd6a57df7ca9088a4b14664764e7adb9c120bb1 (patch) | |
tree | 2748d954ad5dbf669429a2d027f4c7f437e8d59f /arch | |
parent | b1ea50b2b63a95aa5a7944b48ba4d0e9b32211d3 (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.c | 51 |
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 | ||