From: ard.biesheuvel@linaro.org (Ard Biesheuvel)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 11/13] arm64/efi: use plain memblock API for adding and removing reserved RAM
Date: Tue, 18 Nov 2014 13:57:10 +0100 [thread overview]
Message-ID: <1416315432-8534-12-git-send-email-ard.biesheuvel@linaro.org> (raw)
In-Reply-To: <1416315432-8534-1-git-send-email-ard.biesheuvel@linaro.org>
The memblock API is agnostic of page size, so we can use it on both
4 KB and 64 KB granule kernels to install all UEFI memory regions
(EFI_MEMORY_WB) using memblock_add(), and the memblock layer will stitch
all unaligned regions together. Then we start punching holes in it for the
reserved regions, this time taking the native page size into account.
Finally, the reserved regions are memblock_remove()'d as well. This will
ensure that the regions are accessible via mmap(/dev/mem), even when
CONFIG_STRICT_DEVMEM is in effect.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm64/kernel/efi.c | 41 +++++++++--------------------------------
drivers/firmware/efi/virtmap.c | 15 +++++++++------
2 files changed, 18 insertions(+), 38 deletions(-)
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c
index 3009c22e2620..2c0a858f699e 100644
--- a/arch/arm64/kernel/efi.c
+++ b/arch/arm64/kernel/efi.c
@@ -105,24 +105,6 @@ out:
return retval;
}
-/*
- * Return true for RAM regions we want to permanently reserve.
- */
-static __init int is_reserve_region(efi_memory_desc_t *md)
-{
- switch (md->type) {
- case EFI_LOADER_CODE:
- case EFI_LOADER_DATA:
- case EFI_BOOT_SERVICES_CODE:
- case EFI_BOOT_SERVICES_DATA:
- case EFI_CONVENTIONAL_MEMORY:
- return 0;
- default:
- break;
- }
- return is_normal_ram(md);
-}
-
static __init void reserve_regions(void)
{
efi_memory_desc_t *md;
@@ -134,31 +116,26 @@ static __init void reserve_regions(void)
for_each_efi_memory_desc(&memmap, md) {
paddr = md->phys_addr;
npages = md->num_pages;
+ size = npages << EFI_PAGE_SHIFT;
if (uefi_debug) {
char buf[64];
- pr_info(" 0x%012llx-0x%012llx %s",
- paddr, paddr + (npages << EFI_PAGE_SHIFT) - 1,
+ pr_info(" 0x%012llx-0x%012llx %s\n",
+ paddr, paddr + size - 1,
efi_md_typeattr_format(buf, sizeof(buf), md));
}
- memrange_efi_to_native(&paddr, &npages);
- size = npages << PAGE_SHIFT;
+ if (is_normal_ram(md)) {
+ memblock_add(paddr, size);
- if (is_normal_ram(md))
- early_init_dt_add_memory_arch(paddr, size);
-
- if (is_reserve_region(md)) {
- memblock_reserve(paddr, size);
- if (uefi_debug)
- pr_cont("*");
+ if (!efi_mem_is_usable_region(md)) {
+ memrange_efi_to_native(&paddr, &npages);
+ memblock_reserve(paddr, npages << PAGE_SHIFT);
+ }
}
- if (uefi_debug)
- pr_cont("\n");
}
-
set_bit(EFI_MEMMAP, &efi.flags);
}
diff --git a/drivers/firmware/efi/virtmap.c b/drivers/firmware/efi/virtmap.c
index 98735fb43581..4b6a5c31629f 100644
--- a/drivers/firmware/efi/virtmap.c
+++ b/drivers/firmware/efi/virtmap.c
@@ -8,6 +8,7 @@
*/
#include <linux/efi.h>
+#include <linux/memblock.h>
#include <linux/mm_types.h>
#include <linux/rbtree.h>
#include <linux/rwsem.h>
@@ -97,8 +98,15 @@ void __init efi_virtmap_init(void)
u64 paddr, npages, size;
pgprot_t prot;
- if (!efi_mem_is_usable_region(md))
+ paddr = md->phys_addr;
+ npages = md->num_pages;
+ memrange_efi_to_native(&paddr, &npages);
+ size = npages << PAGE_SHIFT;
+
+ if (!efi_mem_is_usable_region(md)) {
efi_register_mem_resource(md);
+ memblock_remove(paddr, size);
+ }
if (!(md->attribute & EFI_MEMORY_RUNTIME))
continue;
if (WARN(md->virt_addr == 0,
@@ -106,11 +114,6 @@ void __init efi_virtmap_init(void)
md->phys_addr))
return;
- paddr = md->phys_addr;
- npages = md->num_pages;
- memrange_efi_to_native(&paddr, &npages);
- size = npages << PAGE_SHIFT;
-
pr_info(" EFI remap 0x%012llx => %p\n",
md->phys_addr, (void *)md->virt_addr);
--
1.8.3.2
next prev parent reply other threads:[~2014-11-18 12:57 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-18 12:56 [PATCH v3 00/13] arm64: stable UEFI mappings for kexec Ard Biesheuvel
2014-11-18 12:57 ` [PATCH v3 01/13] arm64/mm: add explicit struct_mm argument to __create_mapping() Ard Biesheuvel
2014-11-18 12:57 ` [PATCH v3 02/13] arm64/mm: add create_pgd_mapping() to create private page tables Ard Biesheuvel
2014-11-25 14:32 ` Will Deacon
2014-11-18 12:57 ` [PATCH v3 03/13] arm64: improve CONFIG_STRICT_DEVMEM handling Ard Biesheuvel
2014-11-25 17:39 ` Matt Fleming
2014-11-25 17:48 ` Borislav Petkov
2014-11-26 9:30 ` Dave Young
2014-11-26 16:23 ` Ard Biesheuvel
2014-11-27 6:22 ` Dave Young
2014-11-18 12:57 ` [PATCH v3 04/13] efi: split off remapping code from efi_config_init() Ard Biesheuvel
2014-11-25 17:24 ` Matt Fleming
2014-11-25 17:48 ` Will Deacon
2014-11-18 12:57 ` [PATCH v3 05/13] efi: add common infrastructure for stub-installed virtual mapping Ard Biesheuvel
2014-11-18 12:57 ` [PATCH v3 06/13] efi: register iomem resources for UEFI reserved regions Ard Biesheuvel
2014-11-18 12:57 ` [PATCH v3 07/13] arm64/efi: move SetVirtualAddressMap() to UEFI stub Ard Biesheuvel
2014-11-18 12:57 ` [PATCH v3 08/13] arm64/efi: remove free_boot_services() and friends Ard Biesheuvel
2014-11-18 12:57 ` [PATCH v3 09/13] arm64/efi: remove idmap manipulations from UEFI code Ard Biesheuvel
2014-11-18 12:57 ` [PATCH v3 10/13] arm64/efi: use UEFI memory map unconditionally if available Ard Biesheuvel
2014-11-18 12:57 ` Ard Biesheuvel [this message]
2014-11-20 17:28 ` [PATCH v3 11/13] arm64/efi: use plain memblock API for adding and removing reserved RAM Mark Salter
2014-11-20 17:38 ` Ard Biesheuvel
2014-11-20 17:54 ` Mark Salter
2014-11-21 12:07 ` Ard Biesheuvel
2014-11-21 15:21 ` Mark Salter
2014-11-26 16:59 ` Ard Biesheuvel
2014-11-18 12:57 ` [PATCH v3 12/13] efi: efistub: allow allocation alignment larger than EFI_PAGE_SIZE Ard Biesheuvel
2014-11-27 17:30 ` Matt Fleming
2014-11-18 12:57 ` [PATCH v3 13/13] arm64/efi: set EFI_ALLOC_ALIGN to 64 KB Ard Biesheuvel
2014-11-20 1:27 ` [PATCH v3 00/13] arm64: stable UEFI mappings for kexec Geoff Levand
2014-11-20 22:05 ` Geoff Levand
2014-11-22 8:49 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1416315432-8534-12-git-send-email-ard.biesheuvel@linaro.org \
--to=ard.biesheuvel@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).