From patchwork Mon Sep 3 15:52:42 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [3/6] uefi: uefifump: Add support for dumping SecureBoot and SetupMode vars Date: Mon, 03 Sep 2012 05:52:42 -0000 From: Colin King X-Patchwork-Id: 181376 Message-Id: <1346687565-32320-4-git-send-email-colin.king@canonical.com> To: fwts-devel@lists.ubuntu.com From: Colin Ian King 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 Acked-by: Ivan Hu Acked-by: Keng-Yu Lin --- 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)