[PATCH 3/6] uefi: uefifump: Add support for dumping SecureBoot and SetupMode vars

Colin King colin.king at canonical.com
Mon Sep 3 15:52:42 UTC 2012


From: Colin Ian King <colin.king at canonical.com>

Add support for dumping SecureBoot and SetupMode uefi variables. We
also abstract out the UEFI variable hex dumping to allow us to hex
dump these two variables if they are not 1 byte long.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/uefi/uefidump/uefidump.c |   79 +++++++++++++++++++++++++++++++++++-------
 1 file changed, 67 insertions(+), 12 deletions(-)

diff --git a/src/uefi/uefidump/uefidump.c b/src/uefi/uefidump/uefidump.c
index eb7c6c3..96d294c 100644
--- a/src/uefi/uefidump/uefidump.c
+++ b/src/uefi/uefidump/uefidump.c
@@ -29,6 +29,22 @@ typedef struct {
 	uefidump_func	func;		/* Function to dump this variable */
 } uefidump_info;
 
+static void uefidump_var_hexdump(fwts_framework *fw, fwts_uefi_var *var)
+{
+	int i;
+	uint8_t *data = (uint8_t*)&var->data;
+
+	fwts_log_info_verbatum(fw,  "  Size: %d bytes of data.", (int)var->datalen);
+
+	for (i = 0; i < (int)var->datalen; i+= 16) {
+		char buffer[128];
+		int left = (int)var->datalen - i;
+
+		fwts_dump_raw_data(buffer, sizeof(buffer), data + i, i, left > 16 ? 16 : left);
+		fwts_log_info_verbatum(fw,  "  Data: %s", buffer+2);
+	}
+}
+
 static char *uefidump_vprintf(char *str, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
 
 /*
@@ -509,6 +525,54 @@ static void uefidump_info_dump_type0(fwts_framework *fw, fwts_uefi_var *var)
 	}
 }
 
+static void uefidump_info_secure_boot(fwts_framework *fw, fwts_uefi_var *var)
+{
+	if (var->datalen != 1) {
+		/* Should be 1 byte, of not, dump it out as a hex dump */
+		uefidump_var_hexdump(fw, var);
+	} else {
+		char *mode;
+		uint8_t value = (uint8_t)var->data[0];
+
+		switch (value) {
+		case 0:
+			mode = " (Secure Boot Mode Off)";
+			break;
+		case 1:
+			mode = " (Secure Boot Mode On)";
+			break;
+		default:
+			mode = "";
+			break;
+		}
+		fwts_log_info_verbatum(fw, "  Value: 0x%2.2x%s.", value, mode);
+	}
+}
+
+static void uefidump_info_setup_mode(fwts_framework *fw, fwts_uefi_var *var)
+{
+	if (var->datalen != 1) {
+		/* Should be 1 byte, of not, dump it out as a hex dump */
+		uefidump_var_hexdump(fw, var);
+	} else {
+		char *mode;
+		uint8_t value = (uint8_t)var->data[0];
+
+		switch (value) {
+		case 0:
+			mode = " (User Mode)";
+			break;
+		case 1:
+			mode = " (Setup Mode)";
+			break;
+		default:
+			mode = "";
+			break;
+		}
+		fwts_log_info_verbatum(fw, "  Value: 0x%2.2x%s.", value, mode);
+	}
+}
+
 static uefidump_info uefidump_info_table[] = {
 	{ "PlatformLangCodes",	uefidump_info_platform_langcodes },
 	{ "PlatformLang",	uefidump_info_platform_lang },
@@ -528,6 +592,8 @@ static uefidump_info uefidump_info_table[] = {
 	{ "Timeout",		uefidump_info_timeout },
 	{ "Boot0",		uefidump_info_bootdev },
 	{ "dump-type0-",	uefidump_info_dump_type0 },
+	{ "SecureBoot",		uefidump_info_secure_boot },
+	{ "SetupMode",		uefidump_info_setup_mode },
 	{ NULL, NULL }
 };
 
@@ -569,8 +635,6 @@ static void uefidump_var(fwts_framework *fw, fwts_uefi_var *var)
 	char varname[512];
 	char guid_str[37];
 	uefidump_info *info;
-	int i;
-	uint8_t *data;
 
 	fwts_uefi_get_varname(varname, sizeof(varname), var);
 
@@ -588,16 +652,7 @@ static void uefidump_var(fwts_framework *fw, fwts_uefi_var *var)
 	}
 
 	/* otherwise just do a plain old hex dump */
-	fwts_log_info_verbatum(fw,  "  Size: %d bytes of data.", (int)var->datalen);
-	data = (uint8_t*)&var->data;
-
-	for (i=0; i<(int)var->datalen; i+= 16) {
-		char buffer[128];
-		int left = (int)var->datalen - i;
-
-		fwts_dump_raw_data(buffer, sizeof(buffer), data + i, i, left > 16 ? 16 : left);
-		fwts_log_info_verbatum(fw,  "  Data: %s", buffer+2);
-	}
+	uefidump_var_hexdump(fw, var);
 }
 
 static int uefidump_init(fwts_framework *fw)
-- 
1.7.10.4




More information about the fwts-devel mailing list