Merge tag 'efi-fixes-for-v6.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 21 May 2024 18:50:26 +0000 (11:50 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 21 May 2024 18:50:26 +0000 (11:50 -0700)
Pull EFI fix from Ard Biesheuvel:

 - Followup fix for the EFI boot sequence refactor, which may result in
   physical KASLR putting the kernel in a region which is being used for
   a special purpose via a command line argument.

* tag 'efi-fixes-for-v6.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi:
  x86/efistub: Omit physical KASLR when memory reservations exist

1  2 
drivers/firmware/efi/libstub/x86-stub.c

@@@ -496,7 -496,6 +496,7 @@@ efi_status_t __efiapi efi_pe_entry(efi_
        hdr->vid_mode   = 0xffff;
  
        hdr->type_of_loader = 0x21;
 +      hdr->initrd_addr_max = INT_MAX;
  
        /* Convert unicode cmdline to ascii */
        cmdline_ptr = efi_convert_cmdline(image, &options_size);
@@@ -776,6 -775,26 +776,26 @@@ static void error(char *str
        efi_warn("Decompression failed: %s\n", str);
  }
  
+ static const char *cmdline_memmap_override;
+ static efi_status_t parse_options(const char *cmdline)
+ {
+       static const char opts[][14] = {
+               "mem=", "memmap=", "efi_fake_mem=", "hugepages="
+       };
+       for (int i = 0; i < ARRAY_SIZE(opts); i++) {
+               const char *p = strstr(cmdline, opts[i]);
+               if (p == cmdline || (p > cmdline && isspace(p[-1]))) {
+                       cmdline_memmap_override = opts[i];
+                       break;
+               }
+       }
+       return efi_parse_options(cmdline);
+ }
  static efi_status_t efi_decompress_kernel(unsigned long *kernel_entry)
  {
        unsigned long virt_addr = LOAD_PHYSICAL_ADDR;
                    !memcmp(efistub_fw_vendor(), ami, sizeof(ami))) {
                        efi_debug("AMI firmware v2.0 or older detected - disabling physical KASLR\n");
                        seed[0] = 0;
+               } else if (cmdline_memmap_override) {
+                       efi_info("%s detected on the kernel command line - disabling physical KASLR\n",
+                                cmdline_memmap_override);
+                       seed[0] = 0;
                }
  
                boot_params_ptr->hdr.loadflags |= KASLR_FLAG;
@@@ -883,7 -906,7 +907,7 @@@ void __noreturn efi_stub_entry(efi_hand
        }
  
  #ifdef CONFIG_CMDLINE_BOOL
-       status = efi_parse_options(CONFIG_CMDLINE);
+       status = parse_options(CONFIG_CMDLINE);
        if (status != EFI_SUCCESS) {
                efi_err("Failed to parse options\n");
                goto fail;
        if (!IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) {
                unsigned long cmdline_paddr = ((u64)hdr->cmd_line_ptr |
                                               ((u64)boot_params->ext_cmd_line_ptr << 32));
-               status = efi_parse_options((char *)cmdline_paddr);
+               status = parse_options((char *)cmdline_paddr);
                if (status != EFI_SUCCESS) {
                        efi_err("Failed to parse options\n");
                        goto fail;