aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r--arch/x86/kvm/emulate.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index a4c266e99e50..36cb786122fe 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -61,6 +61,8 @@
61#define OpMem8 26ull /* 8-bit zero extended memory operand */ 61#define OpMem8 26ull /* 8-bit zero extended memory operand */
62#define OpImm64 27ull /* Sign extended 16/32/64-bit immediate */ 62#define OpImm64 27ull /* Sign extended 16/32/64-bit immediate */
63#define OpXLat 28ull /* memory at BX/EBX/RBX + zero-extended AL */ 63#define OpXLat 28ull /* memory at BX/EBX/RBX + zero-extended AL */
64#define OpAccLo 29ull /* Low part of extended acc (AX/AX/EAX/RAX) */
65#define OpAccHi 30ull /* High part of extended acc (-/DX/EDX/RDX) */
64 66
65#define OpBits 5 /* Width of operand field */ 67#define OpBits 5 /* Width of operand field */
66#define OpMask ((1ull << OpBits) - 1) 68#define OpMask ((1ull << OpBits) - 1)
@@ -86,6 +88,7 @@
86#define DstMem64 (OpMem64 << DstShift) 88#define DstMem64 (OpMem64 << DstShift)
87#define DstImmUByte (OpImmUByte << DstShift) 89#define DstImmUByte (OpImmUByte << DstShift)
88#define DstDX (OpDX << DstShift) 90#define DstDX (OpDX << DstShift)
91#define DstAccLo (OpAccLo << DstShift)
89#define DstMask (OpMask << DstShift) 92#define DstMask (OpMask << DstShift)
90/* Source operand type. */ 93/* Source operand type. */
91#define SrcShift 6 94#define SrcShift 6
@@ -108,6 +111,7 @@
108#define SrcImm64 (OpImm64 << SrcShift) 111#define SrcImm64 (OpImm64 << SrcShift)
109#define SrcDX (OpDX << SrcShift) 112#define SrcDX (OpDX << SrcShift)
110#define SrcMem8 (OpMem8 << SrcShift) 113#define SrcMem8 (OpMem8 << SrcShift)
114#define SrcAccHi (OpAccHi << SrcShift)
111#define SrcMask (OpMask << SrcShift) 115#define SrcMask (OpMask << SrcShift)
112#define BitOp (1<<11) 116#define BitOp (1<<11)
113#define MemAbs (1<<12) /* Memory operand is absolute displacement */ 117#define MemAbs (1<<12) /* Memory operand is absolute displacement */
@@ -157,6 +161,8 @@
157#define NoWrite ((u64)1 << 45) /* No writeback */ 161#define NoWrite ((u64)1 << 45) /* No writeback */
158#define SrcWrite ((u64)1 << 46) /* Write back src operand */ 162#define SrcWrite ((u64)1 << 46) /* Write back src operand */
159 163
164#define DstXacc (DstAccLo | SrcAccHi | SrcWrite)
165
160#define X2(x...) x, x 166#define X2(x...) x, x
161#define X3(x...) X2(x), x 167#define X3(x...) X2(x), x
162#define X4(x...) X2(x), X2(x) 168#define X4(x...) X2(x), X2(x)
@@ -4166,6 +4172,24 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op,
4166 fetch_register_operand(op); 4172 fetch_register_operand(op);
4167 op->orig_val = op->val; 4173 op->orig_val = op->val;
4168 break; 4174 break;
4175 case OpAccLo:
4176 op->type = OP_REG;
4177 op->bytes = (ctxt->d & ByteOp) ? 2 : ctxt->op_bytes;
4178 op->addr.reg = reg_rmw(ctxt, VCPU_REGS_RAX);
4179 fetch_register_operand(op);
4180 op->orig_val = op->val;
4181 break;
4182 case OpAccHi:
4183 if (ctxt->d & ByteOp) {
4184 op->type = OP_NONE;
4185 break;
4186 }
4187 op->type = OP_REG;
4188 op->bytes = ctxt->op_bytes;
4189 op->addr.reg = reg_rmw(ctxt, VCPU_REGS_RDX);
4190 fetch_register_operand(op);
4191 op->orig_val = op->val;
4192 break;
4169 case OpDI: 4193 case OpDI:
4170 op->type = OP_MEM; 4194 op->type = OP_MEM;
4171 op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; 4195 op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes;