Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -2272,8 +2272,8 @@ static int emulator_has_longmode(struct x86_emulate_ctxt *ctxt)
#define GET_SMSTATE(type, smbase, offset)				  \
	({								  \
	 type __val;							  \
	 int r = ctxt->ops->read_std(ctxt, smbase + offset, &__val,       \
				     sizeof(__val), NULL);		  \
	 int r = ctxt->ops->read_phys(ctxt, smbase + offset, &__val,      \
				      sizeof(__val));			  \
	 if (r != X86EMUL_CONTINUE)					  \
		 return X86EMUL_UNHANDLEABLE;				  \
	 __val;								  \
@@ -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
	 * CR0/CR3/CR4/EFER.  Also this will ensure that addresses passed
	 * to read_std/write_std are not virtual.
	 * CR0/CR3/CR4/EFER.
	 *
	 * CR4.PCIDE must be zero, because it is a 64-bit mode only feature.
	 */