[U-Boot] [PATCH v5 1/7] cmd: add efidebug command

Alexander Graf agraf at suse.de
Mon Jan 21 13:07:31 UTC 2019


On 01/21/2019 08:49 AM, AKASHI Takahiro wrote:
> Currently, there is no easy way to add or modify UEFI variables.
> In particular, bootmgr supports BootOrder/BootXXXX variables, it is
> quite hard to define them as u-boot variables because they are represented
> in a complicated and encoded format.
>
> The new command, efidebug, helps address these issues and give us
> more friendly interfaces:
>   * efidebug boot add: add BootXXXX variable
>   * efidebug boot rm: remove BootXXXX variable
>   * efidebug boot dump: display all BootXXXX variables
>   * efidebug boot next: set BootNext variable
>   * efidebug boot order: set/display a boot order (BootOrder)
>   * efidebug setvar: set an UEFI variable (with limited functionality)
>   * efidebug dumpvar: display all UEFI variables
>
> Please note that the file, efidebug.c, will be compiled under
> CONFIG_EFI_LOADER because some helper functions will be used
> to enable "env -e" command in a later patch whether or not
> the command is compiled in.
>
> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
> ---
>   MAINTAINERS       |   1 +
>   cmd/Kconfig       |  10 +
>   cmd/Makefile      |   1 +
>   cmd/efidebug.c    | 755 ++++++++++++++++++++++++++++++++++++++++++++++
>   include/command.h |   6 +
>   5 files changed, 773 insertions(+)
>   create mode 100644 cmd/efidebug.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index ae825014bda9..301c5c69ea25 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -438,6 +438,7 @@ F:	lib/efi*/
>   F:	test/py/tests/test_efi*
>   F:	test/unicode_ut.c
>   F:	cmd/bootefi.c
> +F:	cmd/efidebug.c
>   F:	tools/file2include.c
>   
>   FPGA
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index ea1a325eb301..d9cab3cc0c49 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -1397,6 +1397,16 @@ config CMD_DISPLAY
>   	  displayed on a simple board-specific display. Implement
>   	  display_putc() to use it.
>   
> +config CMD_EFIDEBUG
> +	bool "efidebug - display/customize UEFI environment"
> +	depends on EFI_LOADER
> +	default n
> +	help
> +	  Enable the 'efidebug' command which provides a subset of UEFI
> +	  shell utility with simplified functionality. It will be useful
> +	  particularly for managing boot parameters as  well as examining
> +	  various EFI status for debugging.
> +
>   config CMD_LED
>   	bool "led"
>   	default y if LED
> diff --git a/cmd/Makefile b/cmd/Makefile
> index 15ae4d250f50..e48d34c394ee 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -51,6 +51,7 @@ obj-$(CONFIG_CMD_ECHO) += echo.o
>   obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o
>   obj-$(CONFIG_CMD_EEPROM) += eeprom.o
>   obj-$(CONFIG_EFI_STUB) += efi.o
> +obj-$(CONFIG_EFI_LOADER) += efidebug.o
>   obj-$(CONFIG_CMD_ELF) += elf.o
>   obj-$(CONFIG_HUSH_PARSER) += exit.o
>   obj-$(CONFIG_CMD_EXT4) += ext4.o
> diff --git a/cmd/efidebug.c b/cmd/efidebug.c
> new file mode 100644
> index 000000000000..c54fb6cfa101
> --- /dev/null
> +++ b/cmd/efidebug.c
> @@ -0,0 +1,755 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + *  UEFI Shell-like command
> + *
> + *  Copyright (c) 2018 AKASHI Takahiro, Linaro Limited
> + */
> +
> +#include <charset.h>
> +#include <common.h>
> +#include <command.h>
> +#include <efi_loader.h>
> +#include <environment.h>
> +#include <errno.h>
> +#include <exports.h>
> +#include <hexdump.h>
> +#include <malloc.h>
> +#include <search.h>
> +#include <linux/ctype.h>
> +#include <asm/global_data.h>
> +
> +static void dump_var_data(char *data, unsigned long len)
> +{
> +	char *start, *end, *p;
> +	unsigned long pos, count;
> +	char hex[3], line[9];
> +	int i;
> +
> +	end = data + len;
> +	for (start = data, pos = 0; start < end; start += count, pos += count) {
> +		count = end - start;
> +		if (count > 16)
> +			count = 16;
> +
> +		/* count should be multiple of two */
> +		printf("%08lx: ", pos);
> +
> +		/* in hex format */
> +		p = start;
> +		for (i = 0; i < count / 2; p += 2, i++)
> +			printf(" %c%c", *p, *(p + 1));
> +		for (; i < 8; i++)
> +			printf("   ");
> +
> +		/* in character format */
> +		p = start;
> +		hex[2] = '\0';
> +		for (i = 0; i < count / 2; i++) {
> +			hex[0] = *p++;
> +			hex[1] = *p++;
> +			line[i] = (char)simple_strtoul(hex, 0, 16);
> +			if (line[i] < 0x20 || line[i] > 0x7f)
> +				line[i] = '.';
> +		}
> +		line[i] = '\0';
> +		printf("  %s\n", line);
> +	}
> +}

Is this print_hex_dump() reimplemented?


Alex



More information about the U-Boot mailing list