diff options
| author | Nadav Amit <namit@cs.technion.ac.il> | 2014-11-02 04:55:00 -0500 |
|---|---|---|
| committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-11-08 02:20:54 -0500 |
| commit | ed9aad215ff3374ffd720b83d26fda91e4367090 (patch) | |
| tree | f0f3e9b04ee18a8541bc3e5b74938d7e76f67752 | |
| parent | 7f187922ddf6b67f2999a76dcb71663097b75497 (diff) | |
KVM: x86: MOVNTI emulation min opsize is not respected
Commit 3b32004a66e9 ("KVM: x86: movnti minimum op size of 32-bit is not kept")
did not fully fix the minimum operand size of MONTI emulation. Still, MOVNTI
may be mistakenly performed using 16-bit opsize.
This patch add No16 flag to mark an instruction does not support 16-bits
operand size.
Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
| -rw-r--r-- | arch/x86/kvm/emulate.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index dab9b74c29de..e020fed0b019 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
| @@ -167,6 +167,7 @@ | |||
| 167 | #define NoBigReal ((u64)1 << 50) /* No big real mode */ | 167 | #define NoBigReal ((u64)1 << 50) /* No big real mode */ |
| 168 | #define PrivUD ((u64)1 << 51) /* #UD instead of #GP on CPL > 0 */ | 168 | #define PrivUD ((u64)1 << 51) /* #UD instead of #GP on CPL > 0 */ |
| 169 | #define NearBranch ((u64)1 << 52) /* Near branches */ | 169 | #define NearBranch ((u64)1 << 52) /* Near branches */ |
| 170 | #define No16 ((u64)1 << 53) /* No 16 bit operand */ | ||
| 170 | 171 | ||
| 171 | #define DstXacc (DstAccLo | SrcAccHi | SrcWrite) | 172 | #define DstXacc (DstAccLo | SrcAccHi | SrcWrite) |
| 172 | 173 | ||
| @@ -4134,7 +4135,7 @@ static const struct opcode twobyte_table[256] = { | |||
| 4134 | D(DstReg | SrcMem8 | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov), | 4135 | D(DstReg | SrcMem8 | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov), |
| 4135 | /* 0xC0 - 0xC7 */ | 4136 | /* 0xC0 - 0xC7 */ |
| 4136 | F2bv(DstMem | SrcReg | ModRM | SrcWrite | Lock, em_xadd), | 4137 | F2bv(DstMem | SrcReg | ModRM | SrcWrite | Lock, em_xadd), |
| 4137 | N, D(DstMem | SrcReg | ModRM | Mov), | 4138 | N, I(DstMem | SrcReg | ModRM | No16 | Mov, em_mov), |
| 4138 | N, N, N, GD(0, &group9), | 4139 | N, N, N, GD(0, &group9), |
| 4139 | /* 0xC8 - 0xCF */ | 4140 | /* 0xC8 - 0xCF */ |
| 4140 | X8(I(DstReg, em_bswap)), | 4141 | X8(I(DstReg, em_bswap)), |
| @@ -4571,7 +4572,8 @@ done_prefixes: | |||
| 4571 | return EMULATION_FAILED; | 4572 | return EMULATION_FAILED; |
| 4572 | 4573 | ||
| 4573 | if (unlikely(ctxt->d & | 4574 | if (unlikely(ctxt->d & |
| 4574 | (NotImpl|Stack|Op3264|Sse|Mmx|Intercept|CheckPerm|NearBranch))) { | 4575 | (NotImpl|Stack|Op3264|Sse|Mmx|Intercept|CheckPerm|NearBranch| |
| 4576 | No16))) { | ||
| 4575 | /* | 4577 | /* |
| 4576 | * These are copied unconditionally here, and checked unconditionally | 4578 | * These are copied unconditionally here, and checked unconditionally |
| 4577 | * in x86_emulate_insn. | 4579 | * in x86_emulate_insn. |
| @@ -4596,6 +4598,9 @@ done_prefixes: | |||
| 4596 | ctxt->op_bytes = 4; | 4598 | ctxt->op_bytes = 4; |
| 4597 | } | 4599 | } |
| 4598 | 4600 | ||
| 4601 | if ((ctxt->d & No16) && ctxt->op_bytes == 2) | ||
| 4602 | ctxt->op_bytes = 4; | ||
| 4603 | |||
| 4599 | if (ctxt->d & Sse) | 4604 | if (ctxt->d & Sse) |
| 4600 | ctxt->op_bytes = 16; | 4605 | ctxt->op_bytes = 16; |
| 4601 | else if (ctxt->d & Mmx) | 4606 | else if (ctxt->d & Mmx) |
| @@ -5061,11 +5066,6 @@ twobyte_insn: | |||
| 5061 | ctxt->dst.val = (ctxt->src.bytes == 1) ? (s8) ctxt->src.val : | 5066 | ctxt->dst.val = (ctxt->src.bytes == 1) ? (s8) ctxt->src.val : |
| 5062 | (s16) ctxt->src.val; | 5067 | (s16) ctxt->src.val; |
| 5063 | break; | 5068 | break; |
| 5064 | case 0xc3: /* movnti */ | ||
| 5065 | ctxt->dst.bytes = ctxt->op_bytes; | ||
| 5066 | ctxt->dst.val = (ctxt->op_bytes == 8) ? (u64) ctxt->src.val : | ||
| 5067 | (u32) ctxt->src.val; | ||
| 5068 | break; | ||
| 5069 | default: | 5069 | default: |
| 5070 | goto cannot_emulate; | 5070 | goto cannot_emulate; |
| 5071 | } | 5071 | } |
