[U-Boot] [PATCH 2/5] x86: efi_loader: Build EFI memory map per E820 table
Heinrich Schuchardt
xypron.glpk at gmx.de
Sun Jun 24 09:41:26 UTC 2018
On 06/23/2018 12:03 PM, Bin Meng wrote:
> On x86 traditional E820 table is used to pass the memory information
> to kernel. With EFI loader we can build the EFI memory map from it.
>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
> arch/x86/lib/e820.c | 39 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 39 insertions(+)
>
> diff --git a/arch/x86/lib/e820.c b/arch/x86/lib/e820.c
> index 9a9ec99..8b34f67 100644
> --- a/arch/x86/lib/e820.c
> +++ b/arch/x86/lib/e820.c
> @@ -4,6 +4,7 @@
> */
>
> #include <common.h>
> +#include <efi_loader.h>
> #include <asm/e820.h>
>
> DECLARE_GLOBAL_DATA_PTR;
> @@ -34,3 +35,41 @@ __weak unsigned int install_e820_map(unsigned int max_entries,
>
> return 4;
> }
> +
> +#if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD)
> +void efi_add_known_memory(void)
> +{
> + struct e820_entry e820[E820MAX];
> + unsigned int i, num;
> + u64 start, pages;
> + int type;
> +
> + num = install_e820_map(ARRAY_SIZE(e820), e820);
Thanks for the patch. Not handling the E820 table is a known deficiency
of our EFI implementation.
I am a bit worried about error handling here.
What guarantees that lib_sysinfo.n_memranges <= E820MAX?
install_e820_map() prints a message if max_entries is too small but it
does not return an error code.
So only if num < E820MAX we can be sure that the call returned all
information of interest.
My idea is that the interface of efi_add_known_memory() should be
changed to allow returning an error code if it fails. And
efi_memory_init() should return an eventual error to board_init_r().
Best regards
Heinrich
> +
> + for (i = 0; i < num; ++i) {
> + start = e820[i].addr;
> + pages = ALIGN(e820[i].size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT;
> +
> + switch (e820[i].type) {
> + case E820_RAM:
> + type = EFI_CONVENTIONAL_MEMORY;
> + break;
> + case E820_RESERVED:
> + type = EFI_RESERVED_MEMORY_TYPE;
> + break;
> + case E820_ACPI:
> + type = EFI_ACPI_RECLAIM_MEMORY;
> + break;
> + case E820_NVS:
> + type = EFI_ACPI_MEMORY_NVS;
> + break;
> + case E820_UNUSABLE:
> + default:
> + type = EFI_UNUSABLE_MEMORY;
> + break;
> + }
> +
> + efi_add_memory_map(start, pages, type, false);
> + }
> +}
> +#endif /* defined(EFI_LOADER) && !defined(CONFIG_SPL_BUILD) */
>
More information about the U-Boot
mailing list