diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2013-05-30 07:22:39 -0400 |
|---|---|---|
| committer | Gleb Natapov <gleb@redhat.com> | 2013-06-03 04:20:53 -0400 |
| commit | 103f98ea64a1b0a67d8a1b23070b4db3533db2b8 (patch) | |
| tree | 63982e54452910b3f7b6e16a5b48a8b7dbbfb7e4 | |
| parent | d4cb9df5d1f79950b34e78ec5d1b1b59d6e9c7b7 (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>
| -rw-r--r-- | arch/x86/kvm/emulate.c | 4 |
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); |
