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...@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) */
> 

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to