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

Simon Glass sjg at chromium.org
Fri Jul 31 17:45:45 CEST 2015


Hi Bin,

On 24 July 2015 at 02:19, Bin Meng <bmeng.cn at gmail.com> wrote:
> 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.

That's true but I think it is good practice to use it most of the
time. It avoids a cast and I suspect we may consider adding a sandbox
EFI implementation in future.

>
>> +       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

Regards,
Simon


More information about the U-Boot mailing list