Lines Matching +full:arm64 +full:- +full:efi

1 // SPDX-License-Identifier: GPL-2.0
6 #define pr_fmt(fmt) "efi: memattr: " fmt
8 #include <linux/efi.h>
31 pr_err("Failed to map EFI Memory Attributes table @ 0x%lx\n", in efi_memattr_init()
33 return -ENOMEM; in efi_memattr_init()
36 if (tbl->version > 2) { in efi_memattr_init()
37 pr_warn("Unexpected EFI Memory Attributes table version %d\n", in efi_memattr_init()
38 tbl->version); in efi_memattr_init()
42 tbl_size = sizeof(*tbl) + tbl->num_entries * tbl->desc_size; in efi_memattr_init()
44 set_bit(EFI_MEM_ATTR, &efi.flags); in efi_memattr_init()
58 u64 in_paddr = in->phys_addr; in entry_is_valid()
59 u64 in_size = in->num_pages << EFI_PAGE_SHIFT; in entry_is_valid()
64 if (in->type != EFI_RUNTIME_SERVICES_CODE && in entry_is_valid()
65 in->type != EFI_RUNTIME_SERVICES_DATA) { in entry_is_valid()
71 (!PAGE_ALIGNED(in->phys_addr) || in entry_is_valid()
72 !PAGE_ALIGNED(in->num_pages << EFI_PAGE_SHIFT))) { in entry_is_valid()
74 * Since arm64 may execute with page sizes of up to 64 KB, the in entry_is_valid()
85 u64 md_paddr = md->phys_addr; in entry_is_valid()
86 u64 md_size = md->num_pages << EFI_PAGE_SHIFT; in entry_is_valid()
88 if (!(md->attribute & EFI_MEMORY_RUNTIME)) in entry_is_valid()
90 if (md->virt_addr == 0 && md->phys_addr != 0) { in entry_is_valid()
95 if (md_paddr > in_paddr || (in_paddr - md_paddr) >= md_size) in entry_is_valid()
103 pr_warn("Entry covers multiple EFI memory map regions\n"); in entry_is_valid()
107 if (md->type != in->type) { in entry_is_valid()
108 pr_warn("Entry type deviates from EFI memory map region type\n"); in entry_is_valid()
112 out->virt_addr = in_paddr + (md->virt_addr - md_paddr); in entry_is_valid()
117 pr_warn("No matching entry found in the EFI memory map\n"); in entry_is_valid()
122 * To be called after the EFI page tables have been populated. If a memory
139 * We need the EFI memory map to be setup so we can use it to in efi_memattr_apply_permissions()
140 * lookup the virtual addresses of all entries in the of EFI in efi_memattr_apply_permissions()
149 pr_err("Failed to map EFI Memory Attributes table @ 0x%lx\n", in efi_memattr_apply_permissions()
151 return -ENOMEM; in efi_memattr_apply_permissions()
154 if (tbl->version > 1 && in efi_memattr_apply_permissions()
155 (tbl->flags & EFI_MEMORY_ATTRIBUTES_FLAGS_RT_FORWARD_CONTROL_FLOW_GUARD)) in efi_memattr_apply_permissions()
159 pr_info("Processing EFI Memory Attributes table:\n"); in efi_memattr_apply_permissions()
161 for (i = ret = 0; ret == 0 && i < tbl->num_entries; i++) { in efi_memattr_apply_permissions()
167 valid = entry_is_valid((void *)tbl->entry + i * tbl->desc_size, in efi_memattr_apply_permissions()
171 pr_info("%s 0x%012llx-0x%012llx %s\n", in efi_memattr_apply_permissions()
173 md.phys_addr + size - 1, in efi_memattr_apply_permissions()