]> git.baikalelectronics.ru Git - kernel.git/commit
x86/boot/compressed/64: Set EFER.LME=1 in 32-bit trampoline before returning to long...
authorWei Huang <wei@redhat.com>
Fri, 4 Jan 2019 05:44:11 +0000 (23:44 -0600)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 29 Jan 2019 20:58:59 +0000 (21:58 +0100)
commit8fa180bc3dc870cdb92e5973654bc14c3092fdad
treece025b3d79a965312fe3a1356cfb4bc95f1f5e7b
parentcc7963a55fa0100fc4580aa6cba193be1841d32e
x86/boot/compressed/64: Set EFER.LME=1 in 32-bit trampoline before returning to long mode

In some old AMD KVM implementation, guest's EFER.LME bit is cleared by KVM
when the hypervsior detects that the guest sets CR0.PG to 0. This causes
the guest OS to reboot when it tries to return from 32-bit trampoline code
because the CPU is in incorrect state: CR4.PAE=1, CR0.PG=1, CS.L=1, but
EFER.LME=0.  As a precaution, set EFER.LME=1 as part of long mode
activation procedure. This extra step won't cause any harm when Linux is
booted on a bare-metal machine.

Signed-off-by: Wei Huang <wei@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: bp@alien8.de
Cc: hpa@zytor.com
Link: https://lkml.kernel.org/r/20190104054411.12489-1-wei@redhat.com
arch/x86/boot/compressed/head_64.S
arch/x86/boot/compressed/pgtable.h