|
@@ -78,6 +78,7 @@
|
|
|
#define Prefix (1<<16) /* Instruction varies with 66/f2/f3 prefix */
|
|
|
#define Sse (1<<17) /* SSE Vector instruction */
|
|
|
/* Misc flags */
|
|
|
+#define Prot (1<<21) /* instruction generates #UD if not in prot-mode */
|
|
|
#define VendorSpecific (1<<22) /* Vendor specific instruction */
|
|
|
#define NoAccess (1<<23) /* Don't access memory (lea/invlpg/verr etc) */
|
|
|
#define Op3264 (1<<24) /* Operand is 64b in long mode, 32b otherwise */
|
|
@@ -3143,6 +3144,12 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
+ /* Instruction can only be executed in protected mode */
|
|
|
+ if ((c->d & Prot) && !(ctxt->mode & X86EMUL_MODE_PROT)) {
|
|
|
+ rc = emulate_ud(ctxt);
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
/* Do instruction specific permission checks */
|
|
|
if (c->check_perm) {
|
|
|
rc = c->check_perm(ctxt);
|