Fwd: Re: [PATCH] efi_loader: Omit memory with "no-map" when returning memory map.
Kristian Amlie
kristian.amlie at northern.tech
Tue Aug 31 13:12:57 CEST 2021
On 31/08/2021 12:46, Heinrich Schuchardt wrote:
>
>
> ------------------------------------------------------------------------
> *Von:* Ard Biesheuvel <ardb at kernel.org>
> *Gesendet:* 31. August 2021 12:33:56 MESZ
> *An:* Heinrich Schuchardt <xypron.glpk at gmx.de>
> *CC:* Kristian Amlie <kristian.amlie at northern.tech>
> *Betreff:* Re: [PATCH] efi_loader: Omit memory with "no-map" when
> returning memory map.
>
> On Tue, 31 Aug 2021 at 08:41, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
>
> On 8/27/21 9:55 AM, Kristian Amlie wrote:
>
> You can use scripts/get_maintainer.pl to find the right addressees for
> your patches.
>
> efi_reserve_memory() states that memory marked with "no-map"
> shall not
> be accessed by the UEFI payload. Make sure efi_get_memory_map()
> honors
> this.
>
>
> Accessing memory and describing memory are two different things.
> Describing reserved memory in the memory map is important, because it
> helps us distinguish it from MMIO regions.
Ok, my mistake, I thought the kernel would deduce this separately
through the DTB.
>
> This helps the case when booting vexpress_ca9x4 under QEMU. Because
> the kernel wants to use an address in the lowest 128MiB of the
> range,
> but this range is reserved with "no-map", the kernel complains
> that it
> can not allocate the low memory it needs. In reality the actual
> usable
> memory starts much higher, which is reflected correctly in the
> memory
> map after this fix.
>
>
>
> This is a u-boot patch right? (I cannot tell from the context, as
> there are no mailing lists on cc)
>
> It is u-boot's job to describe all the memory, no matter how it is
> used. Even if the kernel itself may not use it as system memory, there
> are cases where kernel infrastructure is used to map these regions:
> for instance, the ACPI core may need to map a SystemMemory OpRegion,
> and we need the EFI memory map to tell us whether to use memory or I/O
> semantics.
>
> As for the 128 MB issue: can you reproduce this with a recent kernel?
> We made some changes recently to the EFI stub as well as the
> decompressor code to prevent the decompressor code from relocating
> itself to the base of DRAM, and to allow the decompressed kernel to
> reside at any 2 MB aligned offset in memory.
I'll try this and get back to you!
--
Kristian
>
>
> The 'no-map' requirement needs to be fulfilled by the kernel.
>
> The GetMemoryMap() boot time service must comply to the UEFI
> specification.
>
> The Devicetree Specification has this clarification:
>
> "Reserved regions with the no-map property must be listed in the memory
> map with type EfiReservedMemoryType. All other reserved regions must be
> listed with type EfiBootServicesData."
> https://devicetree-specification.readthedocs.io/en/latest/chapter3-devicenodes.html
> <https://devicetree-specification.readthedocs.io/en/latest/chapter3-devicenodes.html>
>
> Should the kernel calculate its internal 128 MiB requirement incorrectly
> this needs be fixed in the kernel EFI stub. Does the problem exist with
> kernel 5.14?
>
> I wonder if the 128 MiB requirement of the kernel can be lifted for
> 32bit ARM as we already did for RISC-V. Cf.
>
>
> As mentioned above, this should already be fixed, in v5.11 or later
>
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.14&id=c79e89ecaa246c880292ba68cbe08c9c30db77e3
> <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.14&id=c79e89ecaa246c880292ba68cbe08c9c30db77e3>
>
> Cc Ard, maintainer of the kernel EFI stub.
>
> Best regards
>
> Heinrich
>
>
> Signed-off-by: Kristian Amlie <kristian.amlie at northern.tech>
> ------------------------------------------------------------------------
> lib/efi_loader/efi_memory.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/lib/efi_loader/efi_memory.c
> b/lib/efi_loader/efi_memory.c
> index f4acbee4f9..7f8543143a 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -646,8 +646,16 @@ efi_status_t efi_get_memory_map(efi_uintn_t
> *memory_map_size,
>
> provided_map_size = *memory_map_size;
>
> - list_for_each(lhandle, &efi_mem)
> + list_for_each(lhandle, &efi_mem) {
> + struct efi_mem_list *lmem;
> +
> + lmem = list_entry(lhandle, struct efi_mem_list, link);
> +
> + if (lmem->desc.type == EFI_RESERVED_MEMORY_TYPE)
> + continue;
> +
> map_entries++;
> + }
>
> map_size = map_entries * sizeof(struct efi_mem_desc);
>
> @@ -672,6 +680,10 @@ efi_status_t efi_get_memory_map(efi_uintn_t
> *memory_map_size,
> struct efi_mem_list *lmem;
>
> lmem = list_entry(lhandle, struct efi_mem_list, link);
> +
> + if (lmem->desc.type == EFI_RESERVED_MEMORY_TYPE)
> + continue;
> +
> *memory_map = lmem->desc;
> memory_map--;
> }
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210831/240eea8f/attachment.sig>
More information about the U-Boot
mailing list