Commit 0b789eee authored by Gleb Natapov's avatar Gleb Natapov

KVM: emulator: fix unimplemented instruction detection

Unimplemented instruction detection is broken for group instructions
since it relies on "flags" field of opcode to be zero, but all
instructions in a group inherit flags from a group encoding. Fix that by
having a separate flag for unimplemented instructions.
Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>
parent f8da94e9
...@@ -132,8 +132,9 @@ ...@@ -132,8 +132,9 @@
#define Priv (1<<27) /* instruction generates #GP if current CPL != 0 */ #define Priv (1<<27) /* instruction generates #GP if current CPL != 0 */
#define No64 (1<<28) #define No64 (1<<28)
#define PageTable (1 << 29) /* instruction used to write page table */ #define PageTable (1 << 29) /* instruction used to write page table */
#define NotImpl (1 << 30) /* instruction is not implemented */
/* Source 2 operand type */ /* Source 2 operand type */
#define Src2Shift (30) #define Src2Shift (31)
#define Src2None (OpNone << Src2Shift) #define Src2None (OpNone << Src2Shift)
#define Src2CL (OpCL << Src2Shift) #define Src2CL (OpCL << Src2Shift)
#define Src2ImmByte (OpImmByte << Src2Shift) #define Src2ImmByte (OpImmByte << Src2Shift)
...@@ -3624,7 +3625,7 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt) ...@@ -3624,7 +3625,7 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
#define DI(_y, _i) { .flags = (_y), .intercept = x86_intercept_##_i } #define DI(_y, _i) { .flags = (_y), .intercept = x86_intercept_##_i }
#define DIP(_y, _i, _p) { .flags = (_y), .intercept = x86_intercept_##_i, \ #define DIP(_y, _i, _p) { .flags = (_y), .intercept = x86_intercept_##_i, \
.check_perm = (_p) } .check_perm = (_p) }
#define N D(0) #define N D(NotImpl)
#define EXT(_f, _e) { .flags = ((_f) | RMExt), .u.group = (_e) } #define EXT(_f, _e) { .flags = ((_f) | RMExt), .u.group = (_e) }
#define G(_f, _g) { .flags = ((_f) | Group | ModRM), .u.group = (_g) } #define G(_f, _g) { .flags = ((_f) | Group | ModRM), .u.group = (_g) }
#define GD(_f, _g) { .flags = ((_f) | GroupDual | ModRM), .u.gdual = (_g) } #define GD(_f, _g) { .flags = ((_f) | GroupDual | ModRM), .u.gdual = (_g) }
...@@ -4382,7 +4383,7 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) ...@@ -4382,7 +4383,7 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
ctxt->intercept = opcode.intercept; ctxt->intercept = opcode.intercept;
/* Unrecognised? */ /* Unrecognised? */
if (ctxt->d == 0 || (ctxt->d & Undefined)) if (ctxt->d == 0 || (ctxt->d & NotImpl) || (ctxt->d & Undefined))
return EMULATION_FAILED; return EMULATION_FAILED;
if (!(ctxt->d & VendorSpecific) && ctxt->only_vendor_specific_insn) if (!(ctxt->d & VendorSpecific) && ctxt->only_vendor_specific_insn)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment