From: Nadav Amit <namit@cs.technion.ac.il>
Date: Sun, 2 Nov 2014 09:54:58 +0000 (+0200)
Subject: KVM: x86: Emulator mis-decodes VEX instructions on real-mode
X-Git-Tag: firefly_0821_release~176^2~2635^2~74
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d14cb5df59037f690e62f828c9977c23b1a59e0b;p=firefly-linux-kernel-4.4.55.git

KVM: x86: Emulator mis-decodes VEX instructions on real-mode

Commit 7fe864dc942c (KVM: x86: Mark VEX-prefix instructions emulation as
unimplemented, 2014-06-02) marked VEX instructions as such in protected
mode.  VEX-prefix instructions are not supported relevant on real-mode
and VM86, but should cause #UD instead of being decoded as LES/LDS.

Fix this behaviour to be consistent with real hardware.

Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
[Check for mod == 3, rather than 2 or 3. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 765f1897814b..bf4d23e0f76e 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -4517,8 +4517,7 @@ done_prefixes:
 
 	/* vex-prefix instructions are not implemented */
 	if (ctxt->opcode_len == 1 && (ctxt->b == 0xc5 || ctxt->b == 0xc4) &&
-	    (mode == X86EMUL_MODE_PROT64 ||
-	    (mode >= X86EMUL_MODE_PROT16 && (ctxt->modrm & 0x80)))) {
+	    (mode == X86EMUL_MODE_PROT64 || (ctxt->modrm & 0xc0) == 0xc0)) {
 		ctxt->d = NotImpl;
 	}