Alex, On Mon, Jan 21, 2019 at 02:07:31PM +0100, Alexander Graf wrote: > 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.aka...@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?
Actually, no. A UEFI variable on u-boot is encoded as ascii representation of binary data. That means, for example, => env set -e PlatformLang en => env print -e PlatformLang: {boot,run}(blob) 00000000: 65 6e en => env print ... efi_8be4df61-93ca-11d2-aa0d-00e098032b8c_PlatformLang={boot,run}(blob)656e ... the value of "PlatformLang" as a u-boot variable here is "656e", not "en." So if we want to use print_hex_dump(), we first have to convert that string to a binary. But then print_hex_dump() converts the binary to a string. It's just rediculuous, isn't it? You might think that the value in this case should be {boot, run}(utf8)en ^^^^ It's possible, but it depends on a variable and currently my do_set_efi_var() doesn't support it anyway. Thanks, -Takahiro Akashi > > Alex > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot