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

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull EFI fixes from Ingo Molnar:
"Two EFI boot fixes, one for arm64 and one for x86 systems with certain
firmware versions"

* 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
efi/fdt: Avoid FDT manipulation after ExitBootServices()
x86/efi: Always map the first physical page into the EFI pagetables

+19 -11
+16
arch/x86/platform/efi/efi_64.c
··· 269 269 efi_scratch.use_pgd = true; 270 270 271 271 /* 272 + * Certain firmware versions are way too sentimential and still believe 273 + * they are exclusive and unquestionable owners of the first physical page, 274 + * even though they explicitly mark it as EFI_CONVENTIONAL_MEMORY 275 + * (but then write-access it later during SetVirtualAddressMap()). 276 + * 277 + * Create a 1:1 mapping for this page, to avoid triple faults during early 278 + * boot with such firmware. We are free to hand this page to the BIOS, 279 + * as trim_bios_range() will reserve the first page and isolate it away 280 + * from memory allocators anyway. 281 + */ 282 + if (kernel_map_pages_in_pgd(pgd, 0x0, 0x0, 1, _PAGE_RW)) { 283 + pr_err("Failed to create 1:1 mapping for the first page!\n"); 284 + return 1; 285 + } 286 + 287 + /* 272 288 * When making calls to the firmware everything needs to be 1:1 273 289 * mapped and addressable with 32-bit pointers. Map the kernel 274 290 * text and allocate a new stack because we can't rely on the
+3 -11
drivers/firmware/efi/libstub/fdt.c
··· 187 187 struct exit_boot_struct { 188 188 efi_memory_desc_t *runtime_map; 189 189 int *runtime_entry_count; 190 + void *new_fdt_addr; 190 191 }; 191 192 192 193 static efi_status_t exit_boot_func(efi_system_table_t *sys_table_arg, ··· 203 202 efi_get_virtmap(*map->map, *map->map_size, *map->desc_size, 204 203 p->runtime_map, p->runtime_entry_count); 205 204 206 - return EFI_SUCCESS; 205 + return update_fdt_memmap(p->new_fdt_addr, map); 207 206 } 208 207 209 208 /* ··· 301 300 302 301 priv.runtime_map = runtime_map; 303 302 priv.runtime_entry_count = &runtime_entry_count; 303 + priv.new_fdt_addr = (void *)*new_fdt_addr; 304 304 status = efi_exit_boot_services(sys_table, handle, &map, &priv, 305 305 exit_boot_func); 306 306 307 307 if (status == EFI_SUCCESS) { 308 308 efi_set_virtual_address_map_t *svam; 309 - 310 - status = update_fdt_memmap((void *)*new_fdt_addr, &map); 311 - if (status != EFI_SUCCESS) { 312 - /* 313 - * The kernel won't get far without the memory map, but 314 - * may still be able to print something meaningful so 315 - * return success here. 316 - */ 317 - return EFI_SUCCESS; 318 - } 319 309 320 310 /* Install the new virtual address map */ 321 311 svam = sys_table->runtime->set_virtual_address_map;