···32323333#define EFI_KIMG_PREFERRED_ADDRESS PHYSADDR(VMLINUX_LOAD_ADDRESS)34343535-unsigned long kernel_entry_address(void);3535+unsigned long kernel_entry_address(unsigned long kernel_addr);36363737#endif /* _ASM_LOONGARCH_EFI_H */
+2-2
drivers/firmware/efi/libstub/loongarch-stub.c
···3535 return status;3636}37373838-unsigned long kernel_entry_address(void)3838+unsigned long kernel_entry_address(unsigned long kernel_addr)3939{4040 unsigned long base = (unsigned long)&kernel_offset - kernel_offset;41414242- return (unsigned long)&kernel_entry - base + VMLINUX_LOAD_ADDRESS;4242+ return (unsigned long)&kernel_entry - base + kernel_addr;4343}
+3-3
drivers/firmware/efi/libstub/loongarch.c
···3737 return EFI_SUCCESS;3838}39394040-unsigned long __weak kernel_entry_address(void)4040+unsigned long __weak kernel_entry_address(unsigned long kernel_addr)4141{4242- return *(unsigned long *)(PHYSADDR(VMLINUX_LOAD_ADDRESS) + 8);4242+ return *(unsigned long *)(kernel_addr + 8) - VMLINUX_LOAD_ADDRESS + kernel_addr;4343}44444545efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image,···7373 csr_write64(CSR_DMW0_INIT, LOONGARCH_CSR_DMWIN0);7474 csr_write64(CSR_DMW1_INIT, LOONGARCH_CSR_DMWIN1);75757676- real_kernel_entry = (void *)kernel_entry_address();7676+ real_kernel_entry = (void *)kernel_entry_address(kernel_addr);77777878 real_kernel_entry(true, (unsigned long)cmdline_ptr,7979 (unsigned long)efi_system_table);
+24-7
drivers/firmware/efi/libstub/x86-stub.c
···307307 efi_err("Memory acceptance protocol failed\n");308308}309309310310+static efi_char16_t *efistub_fw_vendor(void)311311+{312312+ unsigned long vendor = efi_table_attr(efi_system_table, fw_vendor);313313+314314+ return (efi_char16_t *)vendor;315315+}316316+310317static const efi_char16_t apple[] = L"Apple";311318312319static void setup_quirks(struct boot_params *boot_params)313320{314314- efi_char16_t *fw_vendor = (efi_char16_t *)(unsigned long)315315- efi_table_attr(efi_system_table, fw_vendor);316316-317317- if (!memcmp(fw_vendor, apple, sizeof(apple))) {318318- if (IS_ENABLED(CONFIG_APPLE_PROPERTIES))319319- retrieve_apple_device_properties(boot_params);320320- }321321+ if (IS_ENABLED(CONFIG_APPLE_PROPERTIES) &&322322+ !memcmp(efistub_fw_vendor(), apple, sizeof(apple)))323323+ retrieve_apple_device_properties(boot_params);321324}322325323326/*···768765769766 if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && !efi_nokaslr) {770767 u64 range = KERNEL_IMAGE_SIZE - LOAD_PHYSICAL_ADDR - kernel_total_size;768768+ static const efi_char16_t ami[] = L"American Megatrends";771769772770 efi_get_seed(seed, sizeof(seed));773771774772 virt_addr += (range * seed[1]) >> 32;775773 virt_addr &= ~(CONFIG_PHYSICAL_ALIGN - 1);774774+775775+ /*776776+ * Older Dell systems with AMI UEFI firmware v2.0 may hang777777+ * while decompressing the kernel if physical address778778+ * randomization is enabled.779779+ *780780+ * https://bugzilla.kernel.org/show_bug.cgi?id=218173781781+ */782782+ if (efi_system_table->hdr.revision <= EFI_2_00_SYSTEM_TABLE_REVISION &&783783+ !memcmp(efistub_fw_vendor(), ami, sizeof(ami))) {784784+ efi_debug("AMI firmware v2.0 or older detected - disabling physical KASLR\n");785785+ seed[0] = 0;786786+ }776787 }777788778789 status = efi_random_alloc(alloc_size, CONFIG_PHYSICAL_ALIGN, &addr,
+1-1
drivers/firmware/efi/unaccepted_memory.c
···101101 * overlap on physical address level.102102 */103103 list_for_each_entry(entry, &accepting_list, list) {104104- if (entry->end < range.start)104104+ if (entry->end <= range.start)105105 continue;106106 if (entry->start >= range.end)107107 continue;