History

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

Pull EFI fixes from Ingo Molnar: "Four fixes: - fix a kexec crash on arm64 - fix a reboot crash on some Android platforms - future-proof the code for upcoming ACPI 6.2 changes - fix a build warning on x86" * 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: efibc: Replace variable set function in notifier call x86/efi: fix a -Wtype-limits compilation warning efi/bgrt: Drop BGRT status field reserved bits check efi/memreserve: deal with memreserve entries in unmapped memory

Linus Torvalds committed 7 years ago

Commit a7211bc2 parents 2407e48 48c7d734 files · +18 −13Browse files

Unified · Split

4 files
  1. arch/x86/platform/efi/quirks.c +1 −1
  2. drivers/firmware/efi/efi-bgrt.c +0 −5
  3. drivers/firmware/efi/efi.c +10 −2
  4. drivers/firmware/efi/efibc.c +7 −5
arch/x86/platform/efi/quirks.c+1−1
@@ -728,7 +728,7 @@ void efi_recover_from_page_fault(unsigned long phys_addr) · 727 unmodified lines
728728 * Address range 0x0000 - 0x0fff is always mapped in the efi_pgd, so
729729 * page faulting on these addresses isn't expected.
730730 */
731− if (phys_addr >= 0x0000 && phys_addr <= 0x0fff)
731+ if (phys_addr <= 0x0fff)
732732 return;
733733
734734 /*
drivers/firmware/efi/efi-bgrt.c+0−5
@@ -47,11 +47,6 @@ void __init efi_bgrt_init(struct acpi_table_header *table) · 46 unmodified lines
4747 bgrt->version);
4848 goto out;
4949 }
50− if (bgrt->status & 0xfe) {
51− pr_notice("Ignoring BGRT: reserved status bits are non-zero %u\n",
52− bgrt->status);
53− goto out;
54− }
5550 if (bgrt->image_type != 0) {
5651 pr_notice("Ignoring BGRT: invalid image type %u (expected 0)\n",
5752 bgrt->image_type);
drivers/firmware/efi/efi.c+10−2
@@ -1009,14 +1009,16 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) · 1008 unmodified lines
10091009
10101010 /* first try to find a slot in an existing linked list entry */
10111011 for (prsv = efi_memreserve_root->next; prsv; prsv = rsv->next) {
1012− rsv = __va(prsv);
1012+ rsv = memremap(prsv, sizeof(*rsv), MEMREMAP_WB);
10131013 index = atomic_fetch_add_unless(&rsv->count, 1, rsv->size);
10141014 if (index < rsv->size) {
10151015 rsv->entry[index].base = addr;
10161016 rsv->entry[index].size = size;
10171017
1018+ memunmap(rsv);
10181019 return 0;
10191020 }
1021+ memunmap(rsv);
10201022 }
10211023
10221024 /* no slot found - allocate a new linked list entry */
@@ -1024,7 +1026,13 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) · 1 unmodified line
10241026 if (!rsv)
10251027 return -ENOMEM;
10261028
1027− rsv->size = EFI_MEMRESERVE_COUNT(PAGE_SIZE);
1029+ /*
1030+ * The memremap() call above assumes that a linux_efi_memreserve entry
1031+ * never crosses a page boundary, so let's ensure that this remains true
1032+ * even when kexec'ing a 4k pages kernel from a >4k pages kernel, by
1033+ * using SZ_4K explicitly in the size calculation below.
1034+ */
1035+ rsv->size = EFI_MEMRESERVE_COUNT(SZ_4K);
10281036 atomic_set(&rsv->count, 1);
10291037 rsv->entry[0].base = addr;
10301038 rsv->entry[0].size = size;
drivers/firmware/efi/efibc.c+7−5
@@ -43,11 +43,13 @@ static int efibc_set_variable(const char *name, const char *value) · 42 unmodified lines
4343 efibc_str_to_str16(value, (efi_char16_t *)entry->var.Data);
4444 memcpy(&entry->var.VendorGuid, &guid, sizeof(guid));
4545
46− ret = efivar_entry_set(entry,
47− EFI_VARIABLE_NON_VOLATILE
48− | EFI_VARIABLE_BOOTSERVICE_ACCESS
49− | EFI_VARIABLE_RUNTIME_ACCESS,
50− size, entry->var.Data, NULL);
46+ ret = efivar_entry_set_safe(entry->var.VariableName,
47+ entry->var.VendorGuid,
48+ EFI_VARIABLE_NON_VOLATILE
49+ | EFI_VARIABLE_BOOTSERVICE_ACCESS
50+ | EFI_VARIABLE_RUNTIME_ACCESS,
51+ false, size, entry->var.Data);
52+
5153 if (ret)
5254 pr_err("failed to set %s EFI variable: 0x%x\n",
5355 name, ret);