[U-Boot] [PATCH 41/48] efi: Add functions for decoding the EFI tables

Bin Meng bmeng.cn at gmail.com
Fri Jul 24 10:19:49 CEST 2015


Hi Simon,

On Wed, Jul 22, 2015 at 11:49 PM, Simon Glass <sjg at chromium.org> wrote:
> The EFI stub can pass a table to U-Boot with information about the memory map
> Potentially other things will follow. Add a way to access this table.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>

Reviewed-by: Bin Meng <bmeng.cn at gmail.com>

But please see nits below.

>  lib/efi/Makefile   |  1 +
>  lib/efi/efi_info.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 48 insertions(+)
>  create mode 100644 lib/efi/efi_info.c
>
> diff --git a/lib/efi/Makefile b/lib/efi/Makefile
> index ba2824e..84bc5e3 100644
> --- a/lib/efi/Makefile
> +++ b/lib/efi/Makefile
> @@ -5,6 +5,7 @@
>  #
>
>  obj-$(CONFIG_ARCH_EFI) += efi_app.o efi.o
> +obj-$(CONFIG_EFI_STUB) += efi_info.o
>
>  CFLAGS_REMOVE_efi_stub.o := -mregparm=3 \
>         $(if $(CONFIG_EFI_STUB_64BIT),-march=i386 -m32)
> diff --git a/lib/efi/efi_info.c b/lib/efi/efi_info.c
> new file mode 100644
> index 0000000..0cd9a7e
> --- /dev/null
> +++ b/lib/efi/efi_info.c
> @@ -0,0 +1,47 @@
> +/*
> + * Copyright (c) 2015 Google, Inc
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + *
> + * Access to the EFI information table
> + */
> +
> +#include <common.h>
> +#include <efi.h>
> +#include <errno.h>
> +#include <mapmem.h>
> +
> +int efi_info_get(enum efi_entry_t type, void **datap, int *sizep)
> +{
> +       struct efi_entry_hdr *entry;
> +       struct efi_info_hdr *info;
> +       int ret;
> +
> +       if (!gd->arch.table)
> +               return -ENODATA;
> +
> +       info = map_sysmem(gd->arch.table, 0);

Is map_sysmem() necessary? I think it only matters for sandbox. If
not, please remove.

> +       if (info->version != EFI_TABLE_VERSION) {
> +               ret = -EPROTONOSUPPORT;
> +               goto err;
> +       }
> +
> +       entry = (struct efi_entry_hdr *)((ulong)info + info->hdr_size);
> +       while (entry->type != EFIET_END) {
> +               if (entry->type == type) {
> +                       if (entry->addr)
> +                               *datap = map_sysmem(entry->addr, entry->size);
> +                       else
> +                               *datap = entry + 1;
> +                       *sizep = entry->size;
> +                       return 0;
> +               }
> +               entry = (struct efi_entry_hdr *)((ulong)entry + entry->link);
> +       }
> +
> +       ret = -ENOENT;
> +err:
> +       unmap_sysmem(info);
> +
> +       return ret;
> +}
> --

Regards,
Bin


More information about the U-Boot mailing list