summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2013-05-30 16:35:55 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-06-07 12:53:21 -0700
commitc534bfb76524145e32a5066ca73b6836ce744c38 (patch)
tree31c486a08a306d4412711c8eadf7479e23dd54eb
parent744a4e1d595d9e4b39ff843fe6957defd7dd3ac6 (diff)
downloadlwn-c534bfb76524145e32a5066ca73b6836ce744c38.tar.gz
lwn-c534bfb76524145e32a5066ca73b6836ce744c38.zip
KVM: fix sil/dil/bpl/spl in the mod/rm fields
commit 8acb42070ec4c87a9baab5c7bac626030d5bef28 upstream. The x86-64 extended low-byte registers were fetched correctly from reg, but not from mod/rm. This fixes another bug in the boot of RHEL5.9 64-bit, but it is still not enough. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--arch/x86/kvm/emulate.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 25792086fb83..698eecee9182 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1239,9 +1239,12 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
ctxt->modrm_seg = VCPU_SREG_DS;
if (ctxt->modrm_mod == 3) {
+ int highbyte_regs = ctxt->rex_prefix == 0;
+
op->type = OP_REG;
op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes;
- op->addr.reg = decode_register(ctxt, ctxt->modrm_rm, ctxt->d & ByteOp);
+ op->addr.reg = decode_register(ctxt, ctxt->modrm_rm,
+ highbyte_regs && (ctxt->d & ByteOp));
if (ctxt->d & Sse) {
op->type = OP_XMM;
op->bytes = 16;