Loading arch/x86/include/asm/kvm_emulate.h +10 −12 Original line number Original line Diff line number Diff line Loading @@ -249,6 +249,15 @@ struct read_cache { unsigned long end; unsigned long end; }; }; /* Execution mode, passed to the emulator. */ enum x86emul_mode { X86EMUL_MODE_REAL, /* Real mode. */ X86EMUL_MODE_VM86, /* Virtual 8086 mode. */ X86EMUL_MODE_PROT16, /* 16-bit protected mode. */ X86EMUL_MODE_PROT32, /* 32-bit protected mode. */ X86EMUL_MODE_PROT64, /* 64-bit (long) mode. */ }; struct x86_emulate_ctxt { struct x86_emulate_ctxt { const struct x86_emulate_ops *ops; const struct x86_emulate_ops *ops; Loading @@ -256,7 +265,7 @@ struct x86_emulate_ctxt { unsigned long eflags; unsigned long eflags; unsigned long eip; /* eip before instruction emulation */ unsigned long eip; /* eip before instruction emulation */ /* Emulated execution mode, represented by an X86EMUL_MODE value. */ /* Emulated execution mode, represented by an X86EMUL_MODE value. */ int mode; enum x86emul_mode mode; /* interruptibility state, as a result of execution of STI or MOV SS */ /* interruptibility state, as a result of execution of STI or MOV SS */ int interruptibility; int interruptibility; Loading Loading @@ -308,17 +317,6 @@ struct x86_emulate_ctxt { #define REPE_PREFIX 0xf3 #define REPE_PREFIX 0xf3 #define REPNE_PREFIX 0xf2 #define REPNE_PREFIX 0xf2 /* Execution mode, passed to the emulator. */ #define X86EMUL_MODE_REAL 0 /* Real mode. */ #define X86EMUL_MODE_VM86 1 /* Virtual 8086 mode. */ #define X86EMUL_MODE_PROT16 2 /* 16-bit protected mode. */ #define X86EMUL_MODE_PROT32 4 /* 32-bit protected mode. */ #define X86EMUL_MODE_PROT64 8 /* 64-bit (long) mode. */ /* any protected mode */ #define X86EMUL_MODE_PROT (X86EMUL_MODE_PROT16|X86EMUL_MODE_PROT32| \ X86EMUL_MODE_PROT64) /* CPUID vendors */ /* CPUID vendors */ #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163 Loading arch/x86/kvm/emulate.c +3 −1 Original line number Original line Diff line number Diff line Loading @@ -2268,6 +2268,8 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) if (msr_data == 0x0) if (msr_data == 0x0) return emulate_gp(ctxt, 0); return emulate_gp(ctxt, 0); break; break; default: break; } } ctxt->eflags &= ~(EFLG_VM | EFLG_IF | EFLG_RF); ctxt->eflags &= ~(EFLG_VM | EFLG_IF | EFLG_RF); Loading Loading @@ -4400,7 +4402,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) } } /* Instruction can only be executed in protected mode */ /* Instruction can only be executed in protected mode */ if ((ctxt->d & Prot) && !(ctxt->mode & X86EMUL_MODE_PROT)) { if ((ctxt->d & Prot) && ctxt->mode < X86EMUL_MODE_PROT16) { rc = emulate_ud(ctxt); rc = emulate_ud(ctxt); goto done; goto done; } } Loading Loading
arch/x86/include/asm/kvm_emulate.h +10 −12 Original line number Original line Diff line number Diff line Loading @@ -249,6 +249,15 @@ struct read_cache { unsigned long end; unsigned long end; }; }; /* Execution mode, passed to the emulator. */ enum x86emul_mode { X86EMUL_MODE_REAL, /* Real mode. */ X86EMUL_MODE_VM86, /* Virtual 8086 mode. */ X86EMUL_MODE_PROT16, /* 16-bit protected mode. */ X86EMUL_MODE_PROT32, /* 32-bit protected mode. */ X86EMUL_MODE_PROT64, /* 64-bit (long) mode. */ }; struct x86_emulate_ctxt { struct x86_emulate_ctxt { const struct x86_emulate_ops *ops; const struct x86_emulate_ops *ops; Loading @@ -256,7 +265,7 @@ struct x86_emulate_ctxt { unsigned long eflags; unsigned long eflags; unsigned long eip; /* eip before instruction emulation */ unsigned long eip; /* eip before instruction emulation */ /* Emulated execution mode, represented by an X86EMUL_MODE value. */ /* Emulated execution mode, represented by an X86EMUL_MODE value. */ int mode; enum x86emul_mode mode; /* interruptibility state, as a result of execution of STI or MOV SS */ /* interruptibility state, as a result of execution of STI or MOV SS */ int interruptibility; int interruptibility; Loading Loading @@ -308,17 +317,6 @@ struct x86_emulate_ctxt { #define REPE_PREFIX 0xf3 #define REPE_PREFIX 0xf3 #define REPNE_PREFIX 0xf2 #define REPNE_PREFIX 0xf2 /* Execution mode, passed to the emulator. */ #define X86EMUL_MODE_REAL 0 /* Real mode. */ #define X86EMUL_MODE_VM86 1 /* Virtual 8086 mode. */ #define X86EMUL_MODE_PROT16 2 /* 16-bit protected mode. */ #define X86EMUL_MODE_PROT32 4 /* 32-bit protected mode. */ #define X86EMUL_MODE_PROT64 8 /* 64-bit (long) mode. */ /* any protected mode */ #define X86EMUL_MODE_PROT (X86EMUL_MODE_PROT16|X86EMUL_MODE_PROT32| \ X86EMUL_MODE_PROT64) /* CPUID vendors */ /* CPUID vendors */ #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163 Loading
arch/x86/kvm/emulate.c +3 −1 Original line number Original line Diff line number Diff line Loading @@ -2268,6 +2268,8 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) if (msr_data == 0x0) if (msr_data == 0x0) return emulate_gp(ctxt, 0); return emulate_gp(ctxt, 0); break; break; default: break; } } ctxt->eflags &= ~(EFLG_VM | EFLG_IF | EFLG_RF); ctxt->eflags &= ~(EFLG_VM | EFLG_IF | EFLG_RF); Loading Loading @@ -4400,7 +4402,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) } } /* Instruction can only be executed in protected mode */ /* Instruction can only be executed in protected mode */ if ((ctxt->d & Prot) && !(ctxt->mode & X86EMUL_MODE_PROT)) { if ((ctxt->d & Prot) && ctxt->mode < X86EMUL_MODE_PROT16) { rc = emulate_ud(ctxt); rc = emulate_ud(ctxt); goto done; goto done; } } Loading