mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-04 19:54:03 +08:00
KVM: x86: decode_modrm does not regard modrm correctly
In one occassion, decode_modrm uses the rm field after it is extended with REX.B to determine the addressing mode. Doing so causes it not to read the offset for rip-relative addressing with REX.B=1. This patch moves the fetch where we already mask REX.B away instead. Signed-off-by: Nadav Amit <namit@cs.technion.ac.il> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4114c27d45
commit
5b38ab877e
@ -1223,6 +1223,7 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
|
||||
if (index_reg != 4)
|
||||
modrm_ea += reg_read(ctxt, index_reg) << scale;
|
||||
} else if ((ctxt->modrm_rm & 7) == 5 && ctxt->modrm_mod == 0) {
|
||||
modrm_ea += insn_fetch(s32, ctxt);
|
||||
if (ctxt->mode == X86EMUL_MODE_PROT64)
|
||||
ctxt->rip_relative = 1;
|
||||
} else {
|
||||
@ -1231,10 +1232,6 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
|
||||
adjust_modrm_seg(ctxt, base_reg);
|
||||
}
|
||||
switch (ctxt->modrm_mod) {
|
||||
case 0:
|
||||
if (ctxt->modrm_rm == 5)
|
||||
modrm_ea += insn_fetch(s32, ctxt);
|
||||
break;
|
||||
case 1:
|
||||
modrm_ea += insn_fetch(s8, ctxt);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user