Merge branch 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI updates from Ingo Molnar: "The main EFI changes in this cycle were: - Fix the apple-properties code (Andy Shevchenko) - Add WARN() on arm64 if UEFI Runtime Services corrupt the reserved x18 register (Ard Biesheuvel) - Use efi_switch_mm() on x86 instead of manipulating %cr3 directly (Sai Praneeth) - Fix early memremap leak in ESRT code (Ard Biesheuvel) - Switch to L"xxx" notation for wide string literals (Ard Biesheuvel) - ... plus misc other cleanups and bugfixes" * 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/efi: Use efi_switch_mm() rather than manually twiddling with %cr3 x86/efi: Replace efi_pgd with efi_mm.pgd efi: Use string literals for efi_char16_t variable initializers efi/esrt: Fix handling of early ESRT table mapping efi: Use efi_mm in x86 as well as ARM efi: Make const array 'apple' static efi/apple-properties: Use memremap() instead of ioremap() efi: Reorder pr_notice() with add_device_randomness() call x86/efi: Replace GFP_ATOMIC with GFP_KERNEL in efi_query_variable_store() efi/arm64: Check whether x18 is preserved by runtime services calls efi/arm*: Stop printing addresses of virtual mappings efi/apple-properties: Remove redundant attribute initialization from unmarshal_key_value_pairs() efi/arm*: Only register page tables when they exist
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_data/x86/apple.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -52,8 +53,6 @@ struct properties_header {
|
||||
struct dev_header dev_header[0];
|
||||
};
|
||||
|
||||
static u8 one __initdata = 1;
|
||||
|
||||
static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
|
||||
struct device *dev, void *ptr,
|
||||
struct property_entry entry[])
|
||||
@@ -95,14 +94,9 @@ static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
|
||||
key_len - sizeof(key_len));
|
||||
|
||||
entry[i].name = key;
|
||||
entry[i].is_array = true;
|
||||
entry[i].length = val_len - sizeof(val_len);
|
||||
entry[i].is_array = !!entry[i].length;
|
||||
entry[i].pointer.raw_data = ptr + key_len + sizeof(val_len);
|
||||
if (!entry[i].length) {
|
||||
/* driver core doesn't accept empty properties */
|
||||
entry[i].length = 1;
|
||||
entry[i].pointer.raw_data = &one;
|
||||
}
|
||||
|
||||
if (dump_properties) {
|
||||
dev_info(dev, "property: %s\n", entry[i].name);
|
||||
@@ -196,7 +190,7 @@ static int __init map_properties(void)
|
||||
|
||||
pa_data = boot_params.hdr.setup_data;
|
||||
while (pa_data) {
|
||||
data = ioremap(pa_data, sizeof(*data));
|
||||
data = memremap(pa_data, sizeof(*data), MEMREMAP_WB);
|
||||
if (!data) {
|
||||
pr_err("cannot map setup_data header\n");
|
||||
return -ENOMEM;
|
||||
@@ -204,14 +198,14 @@ static int __init map_properties(void)
|
||||
|
||||
if (data->type != SETUP_APPLE_PROPERTIES) {
|
||||
pa_data = data->next;
|
||||
iounmap(data);
|
||||
memunmap(data);
|
||||
continue;
|
||||
}
|
||||
|
||||
data_len = data->len;
|
||||
iounmap(data);
|
||||
memunmap(data);
|
||||
|
||||
data = ioremap(pa_data, sizeof(*data) + data_len);
|
||||
data = memremap(pa_data, sizeof(*data) + data_len, MEMREMAP_WB);
|
||||
if (!data) {
|
||||
pr_err("cannot map setup_data payload\n");
|
||||
return -ENOMEM;
|
||||
@@ -236,7 +230,7 @@ static int __init map_properties(void)
|
||||
* to avoid breaking the chain of ->next pointers.
|
||||
*/
|
||||
data->len = 0;
|
||||
iounmap(data);
|
||||
memunmap(data);
|
||||
free_bootmem_late(pa_data + sizeof(*data), data_len);
|
||||
|
||||
return ret;
|
||||
|
@@ -31,15 +31,6 @@
|
||||
|
||||
extern u64 efi_system_table;
|
||||
|
||||
static struct mm_struct efi_mm = {
|
||||
.mm_rb = RB_ROOT,
|
||||
.mm_users = ATOMIC_INIT(2),
|
||||
.mm_count = ATOMIC_INIT(1),
|
||||
.mmap_sem = __RWSEM_INITIALIZER(efi_mm.mmap_sem),
|
||||
.page_table_lock = __SPIN_LOCK_UNLOCKED(efi_mm.page_table_lock),
|
||||
.mmlist = LIST_HEAD_INIT(efi_mm.mmlist),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ARM64_PTDUMP_DEBUGFS
|
||||
#include <asm/ptdump.h>
|
||||
|
||||
@@ -54,6 +45,9 @@ static struct ptdump_info efi_ptdump_info = {
|
||||
|
||||
static int __init ptdump_init(void)
|
||||
{
|
||||
if (!efi_enabled(EFI_RUNTIME_SERVICES))
|
||||
return 0;
|
||||
|
||||
return ptdump_debugfs_register(&efi_ptdump_info, "efi_page_tables");
|
||||
}
|
||||
device_initcall(ptdump_init);
|
||||
@@ -80,10 +74,7 @@ static bool __init efi_virtmap_init(void)
|
||||
return false;
|
||||
|
||||
ret = efi_create_mapping(&efi_mm, md);
|
||||
if (!ret) {
|
||||
pr_info(" EFI remap %pa => %p\n",
|
||||
&phys, (void *)(unsigned long)md->virt_addr);
|
||||
} else {
|
||||
if (ret) {
|
||||
pr_warn(" EFI remap %pa: failed to create mapping (%d)\n",
|
||||
&phys, ret);
|
||||
return false;
|
||||
|
@@ -75,6 +75,15 @@ static unsigned long *efi_tables[] = {
|
||||
&efi.mem_attr_table,
|
||||
};
|
||||
|
||||
struct mm_struct efi_mm = {
|
||||
.mm_rb = RB_ROOT,
|
||||
.mm_users = ATOMIC_INIT(2),
|
||||
.mm_count = ATOMIC_INIT(1),
|
||||
.mmap_sem = __RWSEM_INITIALIZER(efi_mm.mmap_sem),
|
||||
.page_table_lock = __SPIN_LOCK_UNLOCKED(efi_mm.page_table_lock),
|
||||
.mmlist = LIST_HEAD_INIT(efi_mm.mmlist),
|
||||
};
|
||||
|
||||
static bool disable_runtime;
|
||||
static int __init setup_noefi(char *arg)
|
||||
{
|
||||
@@ -542,9 +551,9 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
|
||||
seed = early_memremap(efi.rng_seed,
|
||||
sizeof(*seed) + size);
|
||||
if (seed != NULL) {
|
||||
pr_notice("seeding entropy pool\n");
|
||||
add_device_randomness(seed->bits, seed->size);
|
||||
early_memunmap(seed, sizeof(*seed) + size);
|
||||
pr_notice("seeding entropy pool\n");
|
||||
} else {
|
||||
pr_err("Could not map UEFI random seed!\n");
|
||||
}
|
||||
|
@@ -279,6 +279,7 @@ void __init efi_esrt_init(void)
|
||||
}
|
||||
|
||||
memcpy(&tmpesrt, va, sizeof(tmpesrt));
|
||||
early_memunmap(va, size);
|
||||
|
||||
if (tmpesrt.fw_resource_version == 1) {
|
||||
entry_size = sizeof (*v1_entries);
|
||||
@@ -291,7 +292,7 @@ void __init efi_esrt_init(void)
|
||||
if (tmpesrt.fw_resource_count > 0 && max - size < entry_size) {
|
||||
pr_err("ESRT memory map entry can only hold the header. (max: %zu size: %zu)\n",
|
||||
max - size, entry_size);
|
||||
goto err_memunmap;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -304,7 +305,7 @@ void __init efi_esrt_init(void)
|
||||
if (tmpesrt.fw_resource_count > 128) {
|
||||
pr_err("ESRT says fw_resource_count has very large value %d.\n",
|
||||
tmpesrt.fw_resource_count);
|
||||
goto err_memunmap;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -315,19 +316,11 @@ void __init efi_esrt_init(void)
|
||||
if (max < size + entries_size) {
|
||||
pr_err("ESRT does not fit on single memory map entry (size: %zu max: %zu)\n",
|
||||
size, max);
|
||||
goto err_memunmap;
|
||||
}
|
||||
|
||||
/* remap it with our (plausible) new pages */
|
||||
early_memunmap(va, size);
|
||||
size += entries_size;
|
||||
va = early_memremap(efi.esrt, size);
|
||||
if (!va) {
|
||||
pr_err("early_memremap(%p, %zu) failed.\n", (void *)efi.esrt,
|
||||
size);
|
||||
return;
|
||||
}
|
||||
|
||||
size += entries_size;
|
||||
|
||||
esrt_data = (phys_addr_t)efi.esrt;
|
||||
esrt_data_size = size;
|
||||
|
||||
@@ -336,8 +329,6 @@ void __init efi_esrt_init(void)
|
||||
efi_mem_reserve(esrt_data, esrt_data_size);
|
||||
|
||||
pr_debug("esrt-init: loaded.\n");
|
||||
err_memunmap:
|
||||
early_memunmap(va, size);
|
||||
}
|
||||
|
||||
static int __init register_entries(void)
|
||||
|
@@ -9,7 +9,7 @@ cflags-$(CONFIG_X86_32) := -march=i386
|
||||
cflags-$(CONFIG_X86_64) := -mcmodel=small
|
||||
cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ -O2 \
|
||||
-fPIC -fno-strict-aliasing -mno-red-zone \
|
||||
-mno-mmx -mno-sse
|
||||
-mno-mmx -mno-sse -fshort-wchar
|
||||
|
||||
cflags-$(CONFIG_ARM64) := $(subst -pg,,$(KBUILD_CFLAGS)) -fpie
|
||||
cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) \
|
||||
|
@@ -16,18 +16,12 @@
|
||||
|
||||
/* BIOS variables */
|
||||
static const efi_guid_t efi_variable_guid = EFI_GLOBAL_VARIABLE_GUID;
|
||||
static const efi_char16_t efi_SecureBoot_name[] = {
|
||||
'S', 'e', 'c', 'u', 'r', 'e', 'B', 'o', 'o', 't', 0
|
||||
};
|
||||
static const efi_char16_t efi_SetupMode_name[] = {
|
||||
'S', 'e', 't', 'u', 'p', 'M', 'o', 'd', 'e', 0
|
||||
};
|
||||
static const efi_char16_t efi_SecureBoot_name[] = L"SecureBoot";
|
||||
static const efi_char16_t efi_SetupMode_name[] = L"SetupMode";
|
||||
|
||||
/* SHIM variables */
|
||||
static const efi_guid_t shim_guid = EFI_SHIM_LOCK_GUID;
|
||||
static efi_char16_t const shim_MokSBState_name[] = {
|
||||
'M', 'o', 'k', 'S', 'B', 'S', 't', 'a', 't', 'e', 0
|
||||
};
|
||||
static const efi_char16_t shim_MokSBState_name[] = L"MokSBState";
|
||||
|
||||
#define get_efi_var(name, vendor, ...) \
|
||||
efi_call_runtime(get_variable, \
|
||||
|
@@ -16,11 +16,8 @@
|
||||
#include "efistub.h"
|
||||
|
||||
#ifdef CONFIG_RESET_ATTACK_MITIGATION
|
||||
static const efi_char16_t efi_MemoryOverWriteRequest_name[] = {
|
||||
'M', 'e', 'm', 'o', 'r', 'y', 'O', 'v', 'e', 'r', 'w', 'r', 'i', 't',
|
||||
'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'C', 'o', 'n', 't', 'r', 'o',
|
||||
'l', 0
|
||||
};
|
||||
static const efi_char16_t efi_MemoryOverWriteRequest_name[] =
|
||||
L"MemoryOverwriteRequestControl";
|
||||
|
||||
#define MEMORY_ONLY_RESET_CONTROL_GUID \
|
||||
EFI_GUID(0xe20939be, 0x32d4, 0x41be, 0xa1, 0x50, 0x89, 0x7f, 0x85, 0xd4, 0x98, 0x29)
|
||||
|
Reference in New Issue
Block a user