aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2013-05-30 07:22:39 -0400
committerGleb Natapov <gleb@redhat.com>2013-06-03 04:20:53 -0400
commit103f98ea64a1b0a67d8a1b23070b4db3533db2b8 (patch)
tree63982e54452910b3f7b6e16a5b48a8b7dbbfb7e4 /arch/x86
parentd4cb9df5d1f79950b34e78ec5d1b1b59d6e9c7b7 (diff)
KVM: Emulate multibyte NOP
This is encountered when booting RHEL5.9 64-bit. There is another bug after this one that is not a simple emulation failure, but this one lets the boot proceed a bit. Cc: <stable@vger.kernel.org> # 3.9 Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Gleb Natapov <gleb@redhat.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kvm/emulate.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 8db0010ed150..0f42c2a48166 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3997,7 +3997,8 @@ static const struct opcode twobyte_table[256] = {
3997 DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N, 3997 DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N,
3998 N, D(ImplicitOps | ModRM), N, N, 3998 N, D(ImplicitOps | ModRM), N, N,
3999 /* 0x10 - 0x1F */ 3999 /* 0x10 - 0x1F */
4000 N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N, 4000 N, N, N, N, N, N, N, N,
4001 D(ImplicitOps | ModRM), N, N, N, N, N, N, D(ImplicitOps | ModRM),
4001 /* 0x20 - 0x2F */ 4002 /* 0x20 - 0x2F */
4002 DIP(ModRM | DstMem | Priv | Op3264, cr_read, check_cr_read), 4003 DIP(ModRM | DstMem | Priv | Op3264, cr_read, check_cr_read),
4003 DIP(ModRM | DstMem | Priv | Op3264, dr_read, check_dr_read), 4004 DIP(ModRM | DstMem | Priv | Op3264, dr_read, check_dr_read),
@@ -4836,6 +4837,7 @@ twobyte_insn:
4836 case 0x08: /* invd */ 4837 case 0x08: /* invd */
4837 case 0x0d: /* GrpP (prefetch) */ 4838 case 0x0d: /* GrpP (prefetch) */
4838 case 0x18: /* Grp16 (prefetch/nop) */ 4839 case 0x18: /* Grp16 (prefetch/nop) */
4840 case 0x1f: /* nop */
4839 break; 4841 break;
4840 case 0x20: /* mov cr, reg */ 4842 case 0x20: /* mov cr, reg */
4841 ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg); 4843 ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg);