Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'efi/urgent' into efi/next

+31 -14
+1 -1
arch/loongarch/include/asm/efi.h
··· 32 32 33 33 #define EFI_KIMG_PREFERRED_ADDRESS PHYSADDR(VMLINUX_LOAD_ADDRESS) 34 34 35 - unsigned long kernel_entry_address(void); 35 + unsigned long kernel_entry_address(unsigned long kernel_addr); 36 36 37 37 #endif /* _ASM_LOONGARCH_EFI_H */
+2 -2
drivers/firmware/efi/libstub/loongarch-stub.c
··· 35 35 return status; 36 36 } 37 37 38 - unsigned long kernel_entry_address(void) 38 + unsigned long kernel_entry_address(unsigned long kernel_addr) 39 39 { 40 40 unsigned long base = (unsigned long)&kernel_offset - kernel_offset; 41 41 42 - return (unsigned long)&kernel_entry - base + VMLINUX_LOAD_ADDRESS; 42 + return (unsigned long)&kernel_entry - base + kernel_addr; 43 43 }
+3 -3
drivers/firmware/efi/libstub/loongarch.c
··· 37 37 return EFI_SUCCESS; 38 38 } 39 39 40 - unsigned long __weak kernel_entry_address(void) 40 + unsigned long __weak kernel_entry_address(unsigned long kernel_addr) 41 41 { 42 - return *(unsigned long *)(PHYSADDR(VMLINUX_LOAD_ADDRESS) + 8); 42 + return *(unsigned long *)(kernel_addr + 8) - VMLINUX_LOAD_ADDRESS + kernel_addr; 43 43 } 44 44 45 45 efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image, ··· 73 73 csr_write64(CSR_DMW0_INIT, LOONGARCH_CSR_DMWIN0); 74 74 csr_write64(CSR_DMW1_INIT, LOONGARCH_CSR_DMWIN1); 75 75 76 - real_kernel_entry = (void *)kernel_entry_address(); 76 + real_kernel_entry = (void *)kernel_entry_address(kernel_addr); 77 77 78 78 real_kernel_entry(true, (unsigned long)cmdline_ptr, 79 79 (unsigned long)efi_system_table);
+24 -7
drivers/firmware/efi/libstub/x86-stub.c
··· 307 307 efi_err("Memory acceptance protocol failed\n"); 308 308 } 309 309 310 + static efi_char16_t *efistub_fw_vendor(void) 311 + { 312 + unsigned long vendor = efi_table_attr(efi_system_table, fw_vendor); 313 + 314 + return (efi_char16_t *)vendor; 315 + } 316 + 310 317 static const efi_char16_t apple[] = L"Apple"; 311 318 312 319 static void setup_quirks(struct boot_params *boot_params) 313 320 { 314 - efi_char16_t *fw_vendor = (efi_char16_t *)(unsigned long) 315 - efi_table_attr(efi_system_table, fw_vendor); 316 - 317 - if (!memcmp(fw_vendor, apple, sizeof(apple))) { 318 - if (IS_ENABLED(CONFIG_APPLE_PROPERTIES)) 319 - retrieve_apple_device_properties(boot_params); 320 - } 321 + if (IS_ENABLED(CONFIG_APPLE_PROPERTIES) && 322 + !memcmp(efistub_fw_vendor(), apple, sizeof(apple))) 323 + retrieve_apple_device_properties(boot_params); 321 324 } 322 325 323 326 /* ··· 768 765 769 766 if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && !efi_nokaslr) { 770 767 u64 range = KERNEL_IMAGE_SIZE - LOAD_PHYSICAL_ADDR - kernel_total_size; 768 + static const efi_char16_t ami[] = L"American Megatrends"; 771 769 772 770 efi_get_seed(seed, sizeof(seed)); 773 771 774 772 virt_addr += (range * seed[1]) >> 32; 775 773 virt_addr &= ~(CONFIG_PHYSICAL_ALIGN - 1); 774 + 775 + /* 776 + * Older Dell systems with AMI UEFI firmware v2.0 may hang 777 + * while decompressing the kernel if physical address 778 + * randomization is enabled. 779 + * 780 + * https://bugzilla.kernel.org/show_bug.cgi?id=218173 781 + */ 782 + if (efi_system_table->hdr.revision <= EFI_2_00_SYSTEM_TABLE_REVISION && 783 + !memcmp(efistub_fw_vendor(), ami, sizeof(ami))) { 784 + efi_debug("AMI firmware v2.0 or older detected - disabling physical KASLR\n"); 785 + seed[0] = 0; 786 + } 776 787 } 777 788 778 789 status = efi_random_alloc(alloc_size, CONFIG_PHYSICAL_ALIGN, &addr,
+1 -1
drivers/firmware/efi/unaccepted_memory.c
··· 101 101 * overlap on physical address level. 102 102 */ 103 103 list_for_each_entry(entry, &accepting_list, list) { 104 - if (entry->end < range.start) 104 + if (entry->end <= range.start) 105 105 continue; 106 106 if (entry->start >= range.end) 107 107 continue;