|
32 | 32 | #include <linux/module.h>
|
33 | 33 | #include <asm/kvm_x86_emulate.h>
|
34 | 34 |
|
| 35 | +#include "mmu.h" /* for is_long_mode() */ |
| 36 | + |
35 | 37 | /*
|
36 | 38 | * Opcode effective-address decode tables.
|
37 | 39 | * Note that we only emulate instructions that have at least one memory
|
@@ -209,15 +211,17 @@ static u32 opcode_table[256] = {
|
209 | 211 |
|
210 | 212 | static u32 twobyte_table[256] = {
|
211 | 213 | /* 0x00 - 0x0F */
|
212 |
| - 0, Group | GroupDual | Group7, 0, 0, 0, 0, ImplicitOps, 0, |
| 214 | + 0, Group | GroupDual | Group7, 0, 0, 0, ImplicitOps, ImplicitOps, 0, |
213 | 215 | ImplicitOps, ImplicitOps, 0, 0, 0, ImplicitOps | ModRM, 0, 0,
|
214 | 216 | /* 0x10 - 0x1F */
|
215 | 217 | 0, 0, 0, 0, 0, 0, 0, 0, ImplicitOps | ModRM, 0, 0, 0, 0, 0, 0, 0,
|
216 | 218 | /* 0x20 - 0x2F */
|
217 | 219 | ModRM | ImplicitOps, ModRM, ModRM | ImplicitOps, ModRM, 0, 0, 0, 0,
|
218 | 220 | 0, 0, 0, 0, 0, 0, 0, 0,
|
219 | 221 | /* 0x30 - 0x3F */
|
220 |
| - ImplicitOps, 0, ImplicitOps, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 222 | + ImplicitOps, 0, ImplicitOps, 0, |
| 223 | + ImplicitOps, ImplicitOps, 0, 0, |
| 224 | + 0, 0, 0, 0, 0, 0, 0, 0, |
221 | 225 | /* 0x40 - 0x47 */
|
222 | 226 | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
|
223 | 227 | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
|
@@ -1988,6 +1992,9 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
|
1988 | 1992 | goto cannot_emulate;
|
1989 | 1993 | }
|
1990 | 1994 | break;
|
| 1995 | + case 0x05: /* syscall */ |
| 1996 | + goto cannot_emulate; |
| 1997 | + break; |
1991 | 1998 | case 0x06:
|
1992 | 1999 | emulate_clts(ctxt->vcpu);
|
1993 | 2000 | c->dst.type = OP_NONE;
|
@@ -2054,6 +2061,12 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
|
2054 | 2061 | rc = X86EMUL_CONTINUE;
|
2055 | 2062 | c->dst.type = OP_NONE;
|
2056 | 2063 | break;
|
| 2064 | + case 0x34: /* sysenter */ |
| 2065 | + goto cannot_emulate; |
| 2066 | + break; |
| 2067 | + case 0x35: /* sysexit */ |
| 2068 | + goto cannot_emulate; |
| 2069 | + break; |
2057 | 2070 | case 0x40 ... 0x4f: /* cmov */
|
2058 | 2071 | c->dst.val = c->dst.orig_val = c->src.val;
|
2059 | 2072 | if (!test_cc(c->b, ctxt->eflags))
|
|
0 commit comments