Browse Source

bootcount: Add bootcount command

Add a command to manipulate the bootcounter. This is useful if you can
run device recovery from inside U-Boot and need to reset the bootcounter
after executing that process as part of altbootcmd.

Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
Reviewed-by: Lukasz Majewski <lukma@denx.de>
Alex Kiernan 7 years ago
parent
commit
b11ed7d602
3 changed files with 69 additions and 0 deletions
  1. 7 0
      cmd/Kconfig
  2. 1 0
      cmd/Makefile
  3. 61 0
      cmd/bootcount.c

+ 7 - 0
cmd/Kconfig

@@ -1229,6 +1229,13 @@ config CMD_BMP
 	  the image into RAM, then using this command to look at it or display
 	  the image into RAM, then using this command to look at it or display
 	  it.
 	  it.
 
 
+config CMD_BOOTCOUNT
+	bool "bootcount"
+	depends on BOOTCOUNT_LIMIT
+	help
+	  Enable the bootcount command, which allows interrogation and
+	  reset of the bootcounter.
+
 config CMD_BSP
 config CMD_BSP
 	bool "Enable board-specific commands"
 	bool "Enable board-specific commands"
 	help
 	help

+ 1 - 0
cmd/Makefile

@@ -22,6 +22,7 @@ obj-$(CONFIG_CMD_BEDBUG) += bedbug.o
 obj-$(CONFIG_CMD_BINOP) += binop.o
 obj-$(CONFIG_CMD_BINOP) += binop.o
 obj-$(CONFIG_CMD_BLOCK_CACHE) += blkcache.o
 obj-$(CONFIG_CMD_BLOCK_CACHE) += blkcache.o
 obj-$(CONFIG_CMD_BMP) += bmp.o
 obj-$(CONFIG_CMD_BMP) += bmp.o
+obj-$(CONFIG_CMD_BOOTCOUNT) += bootcount.o
 obj-$(CONFIG_CMD_BOOTEFI) += bootefi.o
 obj-$(CONFIG_CMD_BOOTEFI) += bootefi.o
 obj-$(CONFIG_CMD_BOOTMENU) += bootmenu.o
 obj-$(CONFIG_CMD_BOOTMENU) += bootmenu.o
 obj-$(CONFIG_CMD_BOOTSTAGE) += bootstage.o
 obj-$(CONFIG_CMD_BOOTSTAGE) += bootstage.o

+ 61 - 0
cmd/bootcount.c

@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <common.h>
+#include <command.h>
+#include <bootcount.h>
+
+static int do_bootcount_print(cmd_tbl_t *cmdtp, int flag, int argc,
+			      char * const argv[])
+{
+	printf("%lu\n", bootcount_load());
+	return CMD_RET_SUCCESS;
+}
+
+static int do_bootcount_reset(cmd_tbl_t *cmdtp, int flag, int argc,
+			      char * const argv[])
+{
+	/*
+	 * note that we're explicitly not resetting the environment
+	 * variable, so you still have the old bootcounter available
+	 */
+	bootcount_store(0);
+	return CMD_RET_SUCCESS;
+}
+
+static cmd_tbl_t bootcount_sub[] = {
+	U_BOOT_CMD_MKENT(print, 1, 1, do_bootcount_print, "", ""),
+	U_BOOT_CMD_MKENT(reset, 1, 1, do_bootcount_reset, "", ""),
+};
+
+static int do_bootcount(cmd_tbl_t *cmdtp, int flag, int argc,
+			char * const argv[])
+{
+	cmd_tbl_t *cp;
+
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	/* drop initial "bootcount" arg */
+	argc--;
+	argv++;
+
+	cp = find_cmd_tbl(argv[0], bootcount_sub, ARRAY_SIZE(bootcount_sub));
+	if (cp)
+		return cp->cmd(cmdtp, flag, argc, argv);
+
+	return CMD_RET_USAGE;
+}
+
+#if CONFIG_IS_ENABLED(SYS_LONGHELP)
+static char bootcount_help_text[] =
+	"print - print current bootcounter\n"
+	"reset - reset the bootcounter"
+	;
+#endif
+
+U_BOOT_CMD(bootcount, 2, 1, do_bootcount,
+	   "bootcount",
+#if CONFIG_IS_ENABLED(SYS_LONGHELP)
+	   bootcount_help_text
+#endif
+);