mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
x86/efi: Drop support for the EFI_PROPERTIES_TABLE
Drop support for the EFI_PROPERTIES_TABLE. It was a failed, short-lived experiment that broke the boot both on Linux and Windows, and was replaced by the EFI_MEMORY_ATTRIBUTES_TABLE shortly after. Suggested-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Nicolas Saenz Julienne <nsaenz@amazon.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
parent
8fbe4c49c0
commit
7eb4e1dd71
@ -54,14 +54,12 @@
|
|||||||
#include <asm/uv/uv.h>
|
#include <asm/uv/uv.h>
|
||||||
|
|
||||||
static unsigned long efi_systab_phys __initdata;
|
static unsigned long efi_systab_phys __initdata;
|
||||||
static unsigned long prop_phys = EFI_INVALID_TABLE_ADDR;
|
|
||||||
static unsigned long uga_phys = EFI_INVALID_TABLE_ADDR;
|
static unsigned long uga_phys = EFI_INVALID_TABLE_ADDR;
|
||||||
static unsigned long efi_runtime, efi_nr_tables;
|
static unsigned long efi_runtime, efi_nr_tables;
|
||||||
|
|
||||||
unsigned long efi_fw_vendor, efi_config_table;
|
unsigned long efi_fw_vendor, efi_config_table;
|
||||||
|
|
||||||
static const efi_config_table_type_t arch_tables[] __initconst = {
|
static const efi_config_table_type_t arch_tables[] __initconst = {
|
||||||
{EFI_PROPERTIES_TABLE_GUID, &prop_phys, "PROP" },
|
|
||||||
{UGA_IO_PROTOCOL_GUID, &uga_phys, "UGA" },
|
{UGA_IO_PROTOCOL_GUID, &uga_phys, "UGA" },
|
||||||
#ifdef CONFIG_X86_UV
|
#ifdef CONFIG_X86_UV
|
||||||
{UV_SYSTEM_TABLE_GUID, &uv_systab_phys, "UVsystab" },
|
{UV_SYSTEM_TABLE_GUID, &uv_systab_phys, "UVsystab" },
|
||||||
@ -82,7 +80,6 @@ static const unsigned long * const efi_tables[] = {
|
|||||||
&efi_runtime,
|
&efi_runtime,
|
||||||
&efi_config_table,
|
&efi_config_table,
|
||||||
&efi.esrt,
|
&efi.esrt,
|
||||||
&prop_phys,
|
|
||||||
&efi_mem_attr_table,
|
&efi_mem_attr_table,
|
||||||
#ifdef CONFIG_EFI_RCI2_TABLE
|
#ifdef CONFIG_EFI_RCI2_TABLE
|
||||||
&rci2_table_phys,
|
&rci2_table_phys,
|
||||||
@ -502,22 +499,6 @@ void __init efi_init(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the EFI Properties table if it exists */
|
|
||||||
if (prop_phys != EFI_INVALID_TABLE_ADDR) {
|
|
||||||
efi_properties_table_t *tbl;
|
|
||||||
|
|
||||||
tbl = early_memremap_ro(prop_phys, sizeof(*tbl));
|
|
||||||
if (tbl == NULL) {
|
|
||||||
pr_err("Could not map Properties table!\n");
|
|
||||||
} else {
|
|
||||||
if (tbl->memory_protection_attribute &
|
|
||||||
EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA)
|
|
||||||
set_bit(EFI_NX_PE_DATA, &efi.flags);
|
|
||||||
|
|
||||||
early_memunmap(tbl, sizeof(*tbl));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
set_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
set_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
||||||
efi_clean_memmap();
|
efi_clean_memmap();
|
||||||
|
|
||||||
|
@ -412,51 +412,9 @@ static int __init efi_update_mem_attr(struct mm_struct *mm, efi_memory_desc_t *m
|
|||||||
|
|
||||||
void __init efi_runtime_update_mappings(void)
|
void __init efi_runtime_update_mappings(void)
|
||||||
{
|
{
|
||||||
efi_memory_desc_t *md;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Use the EFI Memory Attribute Table for mapping permissions if it
|
|
||||||
* exists, since it is intended to supersede EFI_PROPERTIES_TABLE.
|
|
||||||
*/
|
|
||||||
if (efi_enabled(EFI_MEM_ATTR)) {
|
if (efi_enabled(EFI_MEM_ATTR)) {
|
||||||
efi_disable_ibt_for_runtime = false;
|
efi_disable_ibt_for_runtime = false;
|
||||||
efi_memattr_apply_permissions(NULL, efi_update_mem_attr);
|
efi_memattr_apply_permissions(NULL, efi_update_mem_attr);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EFI_MEMORY_ATTRIBUTES_TABLE is intended to replace
|
|
||||||
* EFI_PROPERTIES_TABLE. So, use EFI_PROPERTIES_TABLE to update
|
|
||||||
* permissions only if EFI_MEMORY_ATTRIBUTES_TABLE is not
|
|
||||||
* published by the firmware. Even if we find a buggy implementation of
|
|
||||||
* EFI_MEMORY_ATTRIBUTES_TABLE, don't fall back to
|
|
||||||
* EFI_PROPERTIES_TABLE, because of the same reason.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!efi_enabled(EFI_NX_PE_DATA))
|
|
||||||
return;
|
|
||||||
|
|
||||||
for_each_efi_memory_desc(md) {
|
|
||||||
unsigned long pf = 0;
|
|
||||||
|
|
||||||
if (!(md->attribute & EFI_MEMORY_RUNTIME))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!(md->attribute & EFI_MEMORY_WB))
|
|
||||||
pf |= _PAGE_PCD;
|
|
||||||
|
|
||||||
if ((md->attribute & EFI_MEMORY_XP) ||
|
|
||||||
(md->type == EFI_RUNTIME_SERVICES_DATA))
|
|
||||||
pf |= _PAGE_NX;
|
|
||||||
|
|
||||||
if (!(md->attribute & EFI_MEMORY_RO) &&
|
|
||||||
(md->type != EFI_RUNTIME_SERVICES_CODE))
|
|
||||||
pf |= _PAGE_RW;
|
|
||||||
|
|
||||||
if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT))
|
|
||||||
pf |= _PAGE_ENC;
|
|
||||||
|
|
||||||
efi_update_mappings(md, pf);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,7 +379,6 @@ void efi_native_runtime_setup(void);
|
|||||||
#define EFI_SYSTEM_RESOURCE_TABLE_GUID EFI_GUID(0xb122a263, 0x3661, 0x4f68, 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80)
|
#define EFI_SYSTEM_RESOURCE_TABLE_GUID EFI_GUID(0xb122a263, 0x3661, 0x4f68, 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80)
|
||||||
#define EFI_FILE_SYSTEM_GUID EFI_GUID(0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
|
#define EFI_FILE_SYSTEM_GUID EFI_GUID(0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
|
||||||
#define DEVICE_TREE_GUID EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
|
#define DEVICE_TREE_GUID EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
|
||||||
#define EFI_PROPERTIES_TABLE_GUID EFI_GUID(0x880aaca3, 0x4adc, 0x4a04, 0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5)
|
|
||||||
#define EFI_RNG_PROTOCOL_GUID EFI_GUID(0x3152bca5, 0xeade, 0x433d, 0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
|
#define EFI_RNG_PROTOCOL_GUID EFI_GUID(0x3152bca5, 0xeade, 0x433d, 0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
|
||||||
#define EFI_RNG_ALGORITHM_RAW EFI_GUID(0xe43176d7, 0xb6e8, 0x4827, 0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61)
|
#define EFI_RNG_ALGORITHM_RAW EFI_GUID(0xe43176d7, 0xb6e8, 0x4827, 0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61)
|
||||||
#define EFI_MEMORY_ATTRIBUTES_TABLE_GUID EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
|
#define EFI_MEMORY_ATTRIBUTES_TABLE_GUID EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
|
||||||
@ -580,15 +579,6 @@ struct efi_mem_range {
|
|||||||
u64 attribute;
|
u64 attribute;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
u32 version;
|
|
||||||
u32 length;
|
|
||||||
u64 memory_protection_attribute;
|
|
||||||
} efi_properties_table_t;
|
|
||||||
|
|
||||||
#define EFI_PROPERTIES_TABLE_VERSION 0x00010000
|
|
||||||
#define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA 0x1
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
u16 version;
|
u16 version;
|
||||||
u16 length;
|
u16 length;
|
||||||
@ -871,10 +861,9 @@ static inline int efi_range_is_wc(unsigned long start, unsigned long len)
|
|||||||
#define EFI_PARAVIRT 6 /* Access is via a paravirt interface */
|
#define EFI_PARAVIRT 6 /* Access is via a paravirt interface */
|
||||||
#define EFI_ARCH_1 7 /* First arch-specific bit */
|
#define EFI_ARCH_1 7 /* First arch-specific bit */
|
||||||
#define EFI_DBG 8 /* Print additional debug info at runtime */
|
#define EFI_DBG 8 /* Print additional debug info at runtime */
|
||||||
#define EFI_NX_PE_DATA 9 /* Can runtime data regions be mapped non-executable? */
|
#define EFI_MEM_ATTR 9 /* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */
|
||||||
#define EFI_MEM_ATTR 10 /* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */
|
#define EFI_MEM_NO_SOFT_RESERVE 10 /* Is the kernel configured to ignore soft reservations? */
|
||||||
#define EFI_MEM_NO_SOFT_RESERVE 11 /* Is the kernel configured to ignore soft reservations? */
|
#define EFI_PRESERVE_BS_REGIONS 11 /* Are EFI boot-services memory segments available? */
|
||||||
#define EFI_PRESERVE_BS_REGIONS 12 /* Are EFI boot-services memory segments available? */
|
|
||||||
|
|
||||||
#ifdef CONFIG_EFI
|
#ifdef CONFIG_EFI
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user