diff mbox

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

Message ID 1346687565-32320-4-git-send-email-colin.king@canonical.com
State Accepted
Headers show

Commit Message

Colin Ian King Sept. 3, 2012, 3:52 p.m. UTC
From: Colin Ian King <colin.king@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@canonical.com>
---
 src/uefi/uefidump/uefidump.c |   79 +++++++++++++++++++++++++++++++++++-------
 1 file changed, 67 insertions(+), 12 deletions(-)

Comments

Ivan Hu Sept. 5, 2012, 7:22 a.m. UTC | #1
On 09/03/2012 11:52 PM, Colin King wrote:
> From: Colin Ian King <colin.king@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@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)
>

Acked-by: Ivan Hu <ivan.hu@canonical.com>
Keng-Yu Lin Sept. 11, 2012, 5:54 a.m. UTC | #2
On Mon, Sep 3, 2012 at 11:52 PM, Colin King <colin.king@canonical.com> wrote:
> From: Colin Ian King <colin.king@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@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
>
Acked-by: Keng-Yu Lin <kengyu@canonical.com>
diff mbox

Patch

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)