forked from Minki/linux
9cf3060640
TDX guest requires CR0.NE to be set. Clearing the bit triggers #GP(0). If CR0.NE is 0, the MS-DOS compatibility mode for handling floating-point exceptions is selected. In this mode, the software exception handler for floating-point exceptions is invoked externally using the processor’s FERR#, INTR, and IGNNE# pins. Using FERR# and IGNNE# to handle floating-point exception is deprecated. CR0.NE=0 also limits newer processors to operate with one logical processor active. Kernel uses CR0_STATE constant to initialize CR0. It has NE bit set. But during early boot kernel has more ad-hoc approach to setting bit in the register. During some of this ad-hoc manipulation, CR0.NE is cleared. This causes a #GP in TDX guests and makes it die in early boot. Make CR0 initialization consistent, deriving the initial value of CR0 from CR0_STATE. Since CR0_STATE always has CR0.NE=1, this ensures that CR0.NE is never 0 and avoids the #GP. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lkml.kernel.org/r/20220405232939.73860-23-kirill.shutemov@linux.intel.com |
||
---|---|---|
.. | ||
.gitignore | ||
acpi.c | ||
cmdline.c | ||
cpuflags.c | ||
early_serial_console.c | ||
efi_thunk_64.S | ||
error.c | ||
error.h | ||
head_32.S | ||
head_64.S | ||
ident_map_64.c | ||
idt_64.c | ||
idt_handlers_64.S | ||
kaslr.c | ||
kernel_info.S | ||
Makefile | ||
mem_encrypt.S | ||
misc.c | ||
misc.h | ||
mkpiggy.c | ||
pgtable_64.c | ||
pgtable.h | ||
sev.c | ||
string.c | ||
tdcall.S | ||
tdx.c | ||
tdx.h | ||
vmlinux.lds.S |