On Fri, Jun 20, 2025 at 08:55:29AM -0700, Dave Hansen wrote: > On 6/20/25 06:53, Kirill A. Shutemov wrote: > > diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c > > index 463b784499a8..94c335229697 100644 > > --- a/arch/x86/platform/efi/efi.c > > +++ b/arch/x86/platform/efi/efi.c > > @@ -825,11 +825,24 @@ static void __init __efi_enter_virtual_mode(void) > > > > efi_sync_low_kernel_mappings(); > > > > + /* > > + * set_virtual_address_map is the only service located at lower > > + * addresses, so we have to temporarily disable LASS around it. > > + * Note that clearing EFLAGS.AC is not enough for this, the whole > > + * LASS needs to be disabled. > > + */ > > + if (cpu_feature_enabled(X86_FEATURE_LASS)) > > + cr4_clear_bits(X86_CR4_LASS); > > Could we do it like this instead? > > unsigned long lass = cr4_read_shadow() & X86_FEATURE_LASS; > ... > cr4_clear_bits(lass); > > > status = efi_set_virtual_address_map(efi.memmap.desc_size * count, > > efi.memmap.desc_size, > > efi.memmap.desc_version, > > (efi_memory_desc_t *)pa, > > efi_systab_phys); > > + > > + if (cpu_feature_enabled(X86_FEATURE_LASS)) > > + cr4_set_bits(X86_CR4_LASS); > > and: > > cr4_set_bits(lass); > > > if (status != EFI_SUCCESS) { > > pr_err("Unable to switch EFI into virtual mode (status=%lx)!\n", > > status); > > That way, neither the presence of X86_FEATURE_LASS nor the ordering of > setting up X86_CR4_LASS matters. > > Let's say the CPU supports X86_FEATURE_LASS and this code gets called > before the kernel is ready for LASS. It would break as written above. Okay, will rework this. -- Kiryl Shutsemau / Kirill A. Shutemov