[PATCH] efi_loader: consider no-map property of reserved memory

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Sep 2 09:10:22 CEST 2020


On 31.08.20 20:08, Atish Patra wrote:
> On Thu, Aug 27, 2020 at 9:16 AM Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>>
>> If a reserved memory node in the device tree has the property no-map,
>> remove it from the UEFI memory map provided by GetMemoryMap().
>>
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>

In the mail-thread starting a

[PATCH 1/1] EBBR: GetMemoryMap(), handling of no-map DT property
https://lists.linaro.org/pipermail/boot-architecture/2020-September/001389.html

the issue has been discussed. The conclusion was that we should not
change the current behavior.

Best regards

Heinrich

>> ---
>>  cmd/bootefi.c               | 34 ++++++++++++++++++++++++++++------
>>  include/efi.h               |  3 +++
>>  lib/efi_loader/efi_memory.c |  7 +++++--
>>  3 files changed, 36 insertions(+), 8 deletions(-)
>>
>> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
>> index 40d5ef2b3a..f173105251 100644
>> --- a/cmd/bootefi.c
>> +++ b/cmd/bootefi.c
>> @@ -135,12 +135,29 @@ done:
>>         return ret;
>>  }
>>
>> -static void efi_reserve_memory(u64 addr, u64 size)
>> +/**
>> + * efi_reserve_memory() - add reserved memory to memory map
>> + *
>> + * @addr:      start address of the reserved memory range
>> + * @size:      size of the reserved memory range
>> + * @nomap:     indicates that the memory range shall be hidden from the memory
>> + *             map
>> + */
>> +static void efi_reserve_memory(u64 addr, u64 size, bool nomap)
>>  {
>> +       int type;
>> +       efi_uintn_t ret;
>> +
>>         /* Convert from sandbox address space. */
>>         addr = (uintptr_t)map_sysmem(addr, 0);
>> -       if (efi_add_memory_map(addr, size,
>> -                              EFI_RESERVED_MEMORY_TYPE) != EFI_SUCCESS)
>> +
>> +       if (nomap)
>> +               type = EFI_NO_MAP_MEMORY;
>> +       else
>> +               type = EFI_RESERVED_MEMORY_TYPE;
>> +
>> +       ret = efi_add_memory_map(addr, size, type);
>> +       if (ret != EFI_SUCCESS)
>>                 log_err("Reserved memory mapping failed addr %llx size %llx\n",
>>                         addr, size);
>>  }
>> @@ -166,7 +183,7 @@ static void efi_carve_out_dt_rsv(void *fdt)
>>         for (i = 0; i < nr_rsv; i++) {
>>                 if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
>>                         continue;
>> -               efi_reserve_memory(addr, size);
>> +               efi_reserve_memory(addr, size, false);
>>         }
>>
>>         /* process reserved-memory */
>> @@ -186,8 +203,13 @@ static void efi_carve_out_dt_rsv(void *fdt)
>>                          * a size instead of a reg property.
>>                          */
>>                         if (fdt_addr != FDT_ADDR_T_NONE &&
>> -                           fdtdec_get_is_enabled(fdt, subnode))
>> -                               efi_reserve_memory(fdt_addr, fdt_size);
>> +                           fdtdec_get_is_enabled(fdt, subnode)) {
>> +                               bool nomap;
>> +
>> +                               nomap = !!fdt_getprop(fdt, subnode, "no-map",
>> +                                                     NULL);
>> +                               efi_reserve_memory(fdt_addr, fdt_size, nomap);
>> +                       }
>>                         subnode = fdt_next_subnode(fdt, subnode);
>>                 }
>>         }
>> diff --git a/include/efi.h b/include/efi.h
>> index f986aad877..50190021ef 100644
>> --- a/include/efi.h
>> +++ b/include/efi.h
>> @@ -181,6 +181,9 @@ enum efi_mem_type {
>>
>>         EFI_MAX_MEMORY_TYPE,
>>         EFI_TABLE_END,  /* For efi_build_mem_table() */
>> +
>> +       /* Memory that shall not be mapped */
>> +       EFI_NO_MAP_MEMORY,
>
> Should it be named as EFI_NO_MAP_RSVD_MEMORY to avoid ambiguity ?
>
>>  };
>>
>>  /* Attribute values */
>> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
>> index 7be756e370..d156b9533c 100644
>> --- a/lib/efi_loader/efi_memory.c
>> +++ b/lib/efi_loader/efi_memory.c
>> @@ -251,7 +251,7 @@ static efi_status_t efi_add_memory_map_pg(u64 start, u64 pages,
>>         EFI_PRINT("%s: 0x%llx 0x%llx %d %s\n", __func__,
>>                   start, pages, memory_type, overlap_only_ram ? "yes" : "no");
>>
>> -       if (memory_type >= EFI_MAX_MEMORY_TYPE)
>> +       if (memory_type >= EFI_MAX_MEMORY_TYPE && memory_type != EFI_NO_MAP_MEMORY)
>>                 return EFI_INVALID_PARAMETER;
>>
>>         if (!pages)
>> @@ -327,7 +327,10 @@ static efi_status_t efi_add_memory_map_pg(u64 start, u64 pages,
>>         }
>>
>>         /* Add our new map */
>> -        list_add_tail(&newlist->link, &efi_mem);
>> +       if (memory_type == EFI_NO_MAP_MEMORY)
>> +               free(newlist);
>> +       else
>> +               list_add_tail(&newlist->link, &efi_mem);
>>
>>         /* And make sure memory is listed in descending order */
>>         efi_mem_sort();
>> --
>> 2.28.0
>>
>
>



More information about the U-Boot mailing list