[PATCH v3 06/13] efi: register iomem resources for UEFI reserved regions

Ard Biesheuvel ard.biesheuvel at linaro.org
Tue Nov 18 04:57:05 PST 2014


Register memory regions reserved by UEFI as IORESOURCE_MEM resources,
so that they are reserved for other uses, and also makes them turn up
in /proc/iomem.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
---
 drivers/firmware/efi/virtmap.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/drivers/firmware/efi/virtmap.c b/drivers/firmware/efi/virtmap.c
index d1f1d416944f..98735fb43581 100644
--- a/drivers/firmware/efi/virtmap.c
+++ b/drivers/firmware/efi/virtmap.c
@@ -13,6 +13,7 @@
 #include <linux/rwsem.h>
 #include <linux/spinlock.h>
 #include <linux/atomic.h>
+#include <linux/bootmem.h>
 
 #include <asm/efi.h>
 #include <asm/pgtable.h>
@@ -52,6 +53,39 @@ static pgprot_t efi_md_access_prot(efi_memory_desc_t *md, pgprot_t prot)
 	return pgprot_device(prot);
 }
 
+static __init void efi_register_mem_resource(efi_memory_desc_t *md)
+{
+	struct resource *res, *parent;
+
+	res = alloc_bootmem_low(sizeof(*res));
+	res->start = md->phys_addr;
+	res->end = res->start + (md->num_pages << EFI_PAGE_SHIFT) - 1;
+	res->flags = IORESOURCE_MEM;
+
+	if (md->type == EFI_MEMORY_MAPPED_IO &&
+	    (md->attribute & EFI_MEMORY_RUNTIME)) {
+		/*
+		 * Device regions with the EFI_MEMORY_RUNTIME attribute
+		 * are owned by the UEFI firmware, so make sure they are
+		 * tagged as exclusive: this will also prevent access
+		 * via /dev/mem if CONFIG_STRICT_DEVMEM is in effect.
+		 */
+		res->name = "UEFI Runtime I/O";
+		res->flags |= IORESOURCE_EXCLUSIVE;
+	} else {
+		res->name  = "UEFI Reserved";
+	}
+
+	/*
+	 * Try to register this resource at the top level. If it conflicts with
+	 * an existing entry ('System RAM', most likely), register it as its
+	 * child instead.
+	 */
+	parent = request_resource_conflict(&iomem_resource, res);
+	if (parent)
+		request_resource(parent, res);
+}
+
 void __init efi_virtmap_init(void)
 {
 	efi_memory_desc_t *md;
@@ -63,6 +97,8 @@ void __init efi_virtmap_init(void)
 		u64 paddr, npages, size;
 		pgprot_t prot;
 
+		if (!efi_mem_is_usable_region(md))
+			efi_register_mem_resource(md);
 		if (!(md->attribute & EFI_MEMORY_RUNTIME))
 			continue;
 		if (WARN(md->virt_addr == 0,
-- 
1.8.3.2




More information about the linux-arm-kernel mailing list