On 7/7/2025 1:03 AM, Kirill A. Shutemov wrote: > From: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx> > > In order to map the EFI runtime services, set_virtual_address_map() > needs to be called, which resides in the lower half of the address > space. This means that LASS needs to be temporarily disabled around > this call. This can only be done before the CR pinning is set up. > > Instead of moving setup_cr_pinning() below efi_enter_virtual_mode() in > arch_cpu_finalize_init(), defer it until core initcall. > > Wrapping efi_enter_virtual_mode() into lass_stac()/clac() is not enough > because AC flag gates data accesses, but not instruction fetch. Clearing > the CR4 bit is required. > I think the wording might need to be reordered. How about? In order to map the EFI runtime services, set_virtual_address_map() needs to be called, which resides in the lower half of the address space. This means that LASS needs to be temporarily disabled around this call. Wrapping efi_enter_virtual_mode() into lass_stac()/clac() is not enough because AC flag gates data accesses, but not instruction fetch. Clearing the CR4 bit is required. However, this must be done before the CR pinning is set up. Instead of arbitrarily moving setup_cr_pinning() after efi_enter_virtual_mode() in arch_cpu_finalize_init(), defer it until core initcall. Other than that, Reviewed-by: Sohil Mehta <sohil.mehta@xxxxxxxxx> > Signed-off-by: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx> > Suggested-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > --- > arch/x86/kernel/cpu/common.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c > index ec62e2f9ea16..f10f9f618805 100644 > --- a/arch/x86/kernel/cpu/common.c > +++ b/arch/x86/kernel/cpu/common.c > @@ -490,11 +490,14 @@ void cr4_init(void) > * parsed), record any of the sensitive CR bits that are set, and > * enable CR pinning. > */ > -static void __init setup_cr_pinning(void) > +static int __init setup_cr_pinning(void) > { > cr4_pinned_bits = this_cpu_read(cpu_tlbstate.cr4) & cr4_pinned_mask; > static_key_enable(&cr_pinning.key); > + > + return 0; > } > +core_initcall(setup_cr_pinning); > > static __init int x86_nofsgsbase_setup(char *arg) > { > @@ -2082,7 +2085,6 @@ static __init void identify_boot_cpu(void) > enable_sep_cpu(); > #endif > cpu_detect_tlb(&boot_cpu_data); > - setup_cr_pinning(); > > tsx_init(); > tdx_init();