Commit f40606b1 authored by Radim Krčmář's avatar Radim Krčmář Committed by Paolo Bonzini

KVM: x86: handle SMBASE as physical address in RSM

GET_SMSTATE depends on real mode to ensure that smbase+offset is treated
as a physical address, which has already caused a bug after shuffling
the code.  Enforce physical addressing.
Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
Reported-by: default avatarLaszlo Ersek <lersek@redhat.com>
Tested-by: default avatarLaszlo Ersek <lersek@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 7a036a6f
...@@ -2272,8 +2272,8 @@ static int emulator_has_longmode(struct x86_emulate_ctxt *ctxt) ...@@ -2272,8 +2272,8 @@ static int emulator_has_longmode(struct x86_emulate_ctxt *ctxt)
#define GET_SMSTATE(type, smbase, offset) \ #define GET_SMSTATE(type, smbase, offset) \
({ \ ({ \
type __val; \ type __val; \
int r = ctxt->ops->read_std(ctxt, smbase + offset, &__val, \ int r = ctxt->ops->read_phys(ctxt, smbase + offset, &__val, \
sizeof(__val), NULL); \ sizeof(__val)); \
if (r != X86EMUL_CONTINUE) \ if (r != X86EMUL_CONTINUE) \
return X86EMUL_UNHANDLEABLE; \ return X86EMUL_UNHANDLEABLE; \
__val; \ __val; \
...@@ -2484,8 +2484,7 @@ static int em_rsm(struct x86_emulate_ctxt *ctxt) ...@@ -2484,8 +2484,7 @@ static int em_rsm(struct x86_emulate_ctxt *ctxt)
/* /*
* Get back to real mode, to prepare a safe state in which to load * Get back to real mode, to prepare a safe state in which to load
* CR0/CR3/CR4/EFER. Also this will ensure that addresses passed * CR0/CR3/CR4/EFER.
* to read_std/write_std are not virtual.
* *
* CR4.PCIDE must be zero, because it is a 64-bit mode only feature. * CR4.PCIDE must be zero, because it is a 64-bit mode only feature.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment