From: Baoquan He <bhe@redhat.com>
To: mingo@kernel.org, matt@codeblueprint.co.uk
Cc: linux-kernel@vger.kernel.org, keescook@chromium.org,
tglx@linutronix.de, hpa@zytor.com, izumi.taku@jp.fujitsu.com,
fanc.fnst@cn.fujitsu.com, thgarnie@google.com,
n-horiguchi@ah.jp.nec.com, ard.biesheuvel@linaro.org,
linux-efi@vger.kernel.org, x86@kernel.org
Subject: [PATCH v10 1/2] efi: Introduce efi_early_memdesc_ptr to get pointer to memmap descriptor
Date: Wed, 16 Aug 2017 21:46:51 +0800 [thread overview]
Message-ID: <20170816134651.GF21273@x1> (raw)
In-Reply-To: <1502722464-20614-2-git-send-email-bhe@redhat.com>
The existing map iteration helper for_each_efi_memory_desc_in_map can
only be used after OS initializes EFI subsystem to fill data of struct
efi_memory_map. Before that we also need iterate map descriptors which
are stored in several intermediate structures, like struct efi_boot_memmap
for arch independent usage and struct efi_info for x86 arch only.
Introduce efi_early_memdesc_ptr to get pointer to a map descriptor, and
replace several places of open code with it.
Signed-off-by: Baoquan He <bhe@redhat.com>
---
v9->v10:
Use the 'EFI subsystem' instead of EFI since EFI usually means
firmware. Here we are talking about EFI subsystem inside kernel.
arch/x86/boot/compressed/eboot.c | 2 +-
drivers/firmware/efi/libstub/efi-stub-helper.c | 4 ++--
include/linux/efi.h | 21 +++++++++++++++++++++
3 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index c3e869eaef0c..e007887a33b0 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -767,7 +767,7 @@ static efi_status_t setup_e820(struct boot_params *params,
m |= (u64)efi->efi_memmap_hi << 32;
#endif
- d = (efi_memory_desc_t *)(m + (i * efi->efi_memdesc_size));
+ d = efi_early_memdesc_ptr(m, efi->efi_memdesc_size, i);
switch (d->type) {
case EFI_RESERVED_TYPE:
case EFI_RUNTIME_SERVICES_CODE:
diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c
index b0184360efc6..50a9cab5a834 100644
--- a/drivers/firmware/efi/libstub/efi-stub-helper.c
+++ b/drivers/firmware/efi/libstub/efi-stub-helper.c
@@ -205,7 +205,7 @@ efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
unsigned long m = (unsigned long)map;
u64 start, end;
- desc = (efi_memory_desc_t *)(m + (i * desc_size));
+ desc = efi_early_memdesc_ptr(m, desc_size, i);
if (desc->type != EFI_CONVENTIONAL_MEMORY)
continue;
@@ -298,7 +298,7 @@ efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
unsigned long m = (unsigned long)map;
u64 start, end;
- desc = (efi_memory_desc_t *)(m + (i * desc_size));
+ desc = efi_early_memdesc_ptr(m, desc_size, i);
if (desc->type != EFI_CONVENTIONAL_MEMORY)
continue;
diff --git a/include/linux/efi.h b/include/linux/efi.h
index 8269bcb8ccf7..ec296bc96bc5 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -1020,6 +1020,27 @@ extern int efi_memattr_init(void);
extern int efi_memattr_apply_permissions(struct mm_struct *mm,
efi_memattr_perm_setter fn);
+/*
+ * efi_early_memdesc_ptr - get the n-th efi memmap descriptor
+ * @map: the start of efi memmap
+ * @desc_size: the size of space for each efi memmap descriptor
+ * @n: the index of efi memmap descriptor
+ *
+ * EFI boot service provides function GetMemoryMap() to get a copy of the
+ * current memory map which is an array of memory descriptors, each of
+ * which describes a contiguous block of memory. And also get the size of
+ * map, and the size of each descriptor, etc. Note that per section 6.2 of
+ * UEFI Spec 2.6 Errata A, the returned size of each descriptor might not
+ * be equal to sizeof(efi_memory_memdesc_t) since efi_memory_memdesc_t may
+ * be extended in the future in response to hardware innovation. Thus OS
+ * MUST use the returned size of descriptor to find the start of each
+ * efi_memory_memdesc_t in the memory map array. This should only be used
+ * during bootup since for_each_efi_memory_desc_xxx is suggested after OS
+ * initializes EFI subsystem to fill data of struct efi_memory_map.
+ */
+#define efi_early_memdesc_ptr(map, desc_size, n) \
+ (efi_memory_desc_t *)((void *)(map) + ((n) * (desc_size)))
+
/* Iterate through an efi_memory_map */
#define for_each_efi_memory_desc_in_map(m, md) \
for ((md) = (m)->map; \
--
2.5.5
next prev parent reply other threads:[~2017-08-16 13:46 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-14 14:54 [PATCH v9 0/2] x86/boot/KASLR: Restrict kernel to be randomized in mirror regions Baoquan He
2017-08-14 14:54 ` [PATCH v9 1/2] efi: Introduce efi_early_memdesc_ptr to get pointer to memmap descriptor Baoquan He
[not found] ` <1502722464-20614-2-git-send-email-bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2017-08-16 11:37 ` Matt Fleming
2017-08-16 11:37 ` Matt Fleming
[not found] ` <20170816113726.GA3384-mF/unelCI9GS6iBeEJttW/XRex20P6io@public.gmane.org>
2017-08-16 13:18 ` Baoquan He
2017-08-16 13:18 ` Baoquan He
2017-08-16 13:46 ` Baoquan He [this message]
2017-08-17 10:20 ` [tip:x86/boot] " tip-bot for Baoquan He
2017-08-14 14:54 ` [PATCH v9 2/2] x86/boot/KASLR: Restrict kernel to be randomized in mirror regions Baoquan He
2017-08-17 10:21 ` [tip:x86/boot] x86/boot/KASLR: Prefer mirrored memory regions for the kernel physical address tip-bot for Baoquan He
2017-08-17 13:04 ` [PATCH v9 2/2] x86/boot/KASLR: Restrict kernel to be randomized in mirror regions Baoquan He
2017-08-18 15:10 ` Ard Biesheuvel
2017-08-18 15:10 ` Ard Biesheuvel
2017-08-19 1:22 ` Baoquan He
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=20170816134651.GF21273@x1 \
--to=bhe@redhat.com \
--cc=ard.biesheuvel@linaro.org \
--cc=fanc.fnst@cn.fujitsu.com \
--cc=hpa@zytor.com \
--cc=izumi.taku@jp.fujitsu.com \
--cc=keescook@chromium.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matt@codeblueprint.co.uk \
--cc=mingo@kernel.org \
--cc=n-horiguchi@ah.jp.nec.com \
--cc=tglx@linutronix.de \
--cc=thgarnie@google.com \
--cc=x86@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.