diff options
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r-- | arch/x86/kvm/emulate.c | 24 |
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; |