cmd: env: add -nv option for UEFI non-volatile variable
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Tue, 4 Jun 2019 06:52:11 +0000 (15:52 +0900)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 4 Jun 2019 21:56:14 +0000 (23:56 +0200)
With this option, -nv, at "setenv -e" command, a variable will be defined
as non-volatile.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
cmd/nvedit.c
cmd/nvedit_efi.c

index 24a6cf7824ad2816b723d33a3a24537564b2bc77..52c242b4f62277e8bff19a9536d32179b949f08e 100644 (file)
@@ -1344,8 +1344,9 @@ U_BOOT_CMD_COMPLETE(
        setenv, CONFIG_SYS_MAXARGS, 0,  do_env_set,
        "set environment variables",
 #if defined(CONFIG_CMD_NVEDIT_EFI)
-       "-e name [value ...]\n"
+       "-e [-nv] name [value ...]\n"
        "    - set UEFI variable 'name' to 'value' ...'\n"
+       "      'nv' option makes the variable non-volatile\n"
        "    - delete UEFI variable 'name' if 'value' not specified\n"
 #endif
        "setenv [-f] name value ...\n"
index ff8eaa1aad2df4c2b23678daee3f52017e44b38d..60a8ac84c8113a5e51a04ca312a17f52354b9dc5 100644 (file)
@@ -349,6 +349,7 @@ int do_env_set_efi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        u16 *var_name16 = NULL, *p;
        size_t len;
        efi_guid_t guid;
+       u32 attributes;
        efi_status_t ret;
 
        if (argc == 1)
@@ -362,6 +363,16 @@ int do_env_set_efi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                return CMD_RET_FAILURE;
        }
 
+       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) {
                /* delete */
@@ -391,9 +402,7 @@ int do_env_set_efi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        utf8_utf16_strncpy(&p, var_name, len + 1);
 
        guid = efi_global_variable_guid;
-       ret = EFI_CALL(efi_set_variable(var_name16, &guid,
-                                       EFI_VARIABLE_BOOTSERVICE_ACCESS |
-                                       EFI_VARIABLE_RUNTIME_ACCESS,
+       ret = EFI_CALL(efi_set_variable(var_name16, &guid, attributes,
                                        size, value));
        if (ret == EFI_SUCCESS) {
                ret = CMD_RET_SUCCESS;