diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2013-05-30 16:35:55 +0200 |
---|---|---|
committer | Gleb Natapov <gleb@redhat.com> | 2013-06-03 11:27:12 +0300 |
commit | 8acb42070ec4c87a9baab5c7bac626030d5bef28 (patch) | |
tree | 5515211b023326ba26a1c2f25656d7269a6cf672 /arch | |
parent | 103f98ea64a1b0a67d8a1b23070b4db3533db2b8 (diff) | |
download | lwn-8acb42070ec4c87a9baab5c7bac626030d5bef28.tar.gz lwn-8acb42070ec4c87a9baab5c7bac626030d5bef28.zip |
KVM: fix sil/dil/bpl/spl in the mod/rm fields
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.
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')
-rw-r--r-- | arch/x86/kvm/emulate.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 0f42c2a48166..5953dcea752d 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -1240,9 +1240,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; |