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?


Alex

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

Reply via email to