[2/4] cmd: efishell: support -nv option to setvar sub-command

Message ID 20181128060059.5508-3-takahiro.akashi@linaro.org
State New
Headers show
Series
  • efi_loader: non-volatile variables support
Related show

Commit Message

AKASHI Takahiro Nov. 28, 2018, 6 a.m.
With -nv specified, a variable to be created will have NON_VOLATILE
attribute.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
---
 cmd/efishell.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Comments

Heinrich Schuchardt Dec. 11, 2018, 6:50 p.m. | #1
On 11/28/18 7:00 AM, AKASHI Takahiro wrote:
> With -nv specified, a variable to be created will have NON_VOLATILE
> attribute.
> 
> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>

Why would we only make the NON_VOLATILE attribute available and not all
the other attributes like EFI_VARIABLE_BOOTSERVICE_ACCESS?

Where is the patch that ensures that non-volatile variables are not stored?

Currently we do not make EFI variables available to the operating system
so they are not really of much use.

Best regards

Heinrich

> ---
>  cmd/efishell.c | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/cmd/efishell.c b/cmd/efishell.c
> index 7cd3ca489559..7cdff757b06c 100644
> --- a/cmd/efishell.c
> +++ b/cmd/efishell.c
> @@ -249,11 +249,22 @@ static int _do_efi_set_var(int argc, char * const argv[])
>  	unsigned long size = 0;
>  	u16 *var_name16, *p;
>  	efi_guid_t guid;
> +	u32 attributes;
>  	efi_status_t ret;
>  
>  	if (argc == 1)
>  		return CMD_RET_SUCCESS;
>  
> +	attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS |
> +		     EFI_VARIABLE_RUNTIME_ACCESS;
> +	if (!strcmp(argv[1], "-nv")) {
> +		attributes |= EFI_VARIABLE_NON_VOLATILE;
> +		argc--;
> +		argv++;
> +		if (argc == 1)
> +			return CMD_RET_SUCCESS;
> +	}
> +
>  	var_name = argv[1];
>  	if (argc == 2) {
>  		/* remove */
> @@ -275,9 +286,7 @@ static int _do_efi_set_var(int argc, char * const argv[])
>  	utf8_utf16_strncpy(&p, var_name, strlen(var_name) + 1);
>  
>  	guid = efi_global_variable_guid;
> -	ret = efi_set_variable(var_name16, &guid,
> -			       EFI_VARIABLE_BOOTSERVICE_ACCESS |
> -			       EFI_VARIABLE_RUNTIME_ACCESS, size, value);
> +	ret = efi_set_variable(var_name16, &guid, attributes, size, value);
>  	ret = (ret == EFI_SUCCESS ? CMD_RET_SUCCESS : CMD_RET_FAILURE);
>  out:
>  	return ret;
> @@ -978,7 +987,7 @@ static char efishell_help_text[] =
>  	"\n"
>  	"efishell dumpvar [<name>]\n"
>  	"  - get uefi variable's value\n"
> -	"efishell setvar <name> [<value>]\n"
> +	"efishell setvar [-nv] <name> [<value>]\n"
>  	"  - set/delete uefi variable's value\n"
>  	"    <value> may be \"=\"...\"\", \"=0x...\" (set) or \"=\" (delete)\n"
>  	"efishell devices\n"
>

Patch

diff --git a/cmd/efishell.c b/cmd/efishell.c
index 7cd3ca489559..7cdff757b06c 100644
--- a/cmd/efishell.c
+++ b/cmd/efishell.c
@@ -249,11 +249,22 @@  static int _do_efi_set_var(int argc, char * const argv[])
 	unsigned long size = 0;
 	u16 *var_name16, *p;
 	efi_guid_t guid;
+	u32 attributes;
 	efi_status_t ret;
 
 	if (argc == 1)
 		return CMD_RET_SUCCESS;
 
+	attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS |
+		     EFI_VARIABLE_RUNTIME_ACCESS;
+	if (!strcmp(argv[1], "-nv")) {
+		attributes |= EFI_VARIABLE_NON_VOLATILE;
+		argc--;
+		argv++;
+		if (argc == 1)
+			return CMD_RET_SUCCESS;
+	}
+
 	var_name = argv[1];
 	if (argc == 2) {
 		/* remove */
@@ -275,9 +286,7 @@  static int _do_efi_set_var(int argc, char * const argv[])
 	utf8_utf16_strncpy(&p, var_name, strlen(var_name) + 1);
 
 	guid = efi_global_variable_guid;
-	ret = efi_set_variable(var_name16, &guid,
-			       EFI_VARIABLE_BOOTSERVICE_ACCESS |
-			       EFI_VARIABLE_RUNTIME_ACCESS, size, value);
+	ret = efi_set_variable(var_name16, &guid, attributes, size, value);
 	ret = (ret == EFI_SUCCESS ? CMD_RET_SUCCESS : CMD_RET_FAILURE);
 out:
 	return ret;
@@ -978,7 +987,7 @@  static char efishell_help_text[] =
 	"\n"
 	"efishell dumpvar [<name>]\n"
 	"  - get uefi variable's value\n"
-	"efishell setvar <name> [<value>]\n"
+	"efishell setvar [-nv] <name> [<value>]\n"
 	"  - set/delete uefi variable's value\n"
 	"    <value> may be \"=\"...\"\", \"=0x...\" (set) or \"=\" (delete)\n"
 	"efishell devices\n"