mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-04 19:54:03 +08:00
KVM: x86: 32-bit wraparound read/write not emulated correctly
If we got a wraparound of 32-bit operand, and the limit is 0xffffffff, read and writes should be successful. It just needs to be done in two segments. Signed-off-by: Nadav Amit <namit@cs.technion.ac.il> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
2b42fce695
commit
bac155310b
@ -684,9 +684,13 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt,
|
||||
}
|
||||
if (addr.ea > lim)
|
||||
goto bad;
|
||||
*max_size = min_t(u64, ~0u, (u64)lim + 1 - addr.ea);
|
||||
if (size > *max_size)
|
||||
goto bad;
|
||||
if (lim == 0xffffffff)
|
||||
*max_size = ~0u;
|
||||
else {
|
||||
*max_size = (u64)lim + 1 - addr.ea;
|
||||
if (size > *max_size)
|
||||
goto bad;
|
||||
}
|
||||
la &= (u32)-1;
|
||||
break;
|
||||
}
|
||||
|
@ -4495,6 +4495,8 @@ int emulator_read_write(struct x86_emulate_ctxt *ctxt, unsigned long addr,
|
||||
if (rc != X86EMUL_CONTINUE)
|
||||
return rc;
|
||||
addr += now;
|
||||
if (ctxt->mode != X86EMUL_MODE_PROT64)
|
||||
addr = (u32)addr;
|
||||
val += now;
|
||||
bytes -= now;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user