Merge branch '2019-10-28-azure-ci-support'
[oweals/u-boot.git] / cmd / nvedit_efi.c
index e65b38dbf399b9fbb22969de561b3abb2d215d04..ede4cd5235ea822de6d6bb2aea13185b9b506eac 100644 (file)
@@ -9,6 +9,7 @@
 #include <common.h>
 #include <command.h>
 #include <efi_loader.h>
+#include <env.h>
 #include <exports.h>
 #include <hexdump.h>
 #include <malloc.h>
@@ -291,8 +292,11 @@ static int append_value(char **bufp, size_t *sizep, char *data)
                if (!tmp_buf)
                        return -1;
 
-               if (hex2bin((u8 *)tmp_buf, data, len) < 0)
+               if (hex2bin((u8 *)tmp_buf, data, len) < 0) {
+                       printf("Error: illegal hexadecimal string\n");
+                       free(tmp_buf);
                        return -1;
+               }
 
                value = tmp_buf;
        } else { /* string */
@@ -326,7 +330,7 @@ out:
 }
 
 /**
- * do_env_print_efi() - set UEFI variable
+ * do_env_set_efi() - set UEFI variable
  *
  * @cmdtp:     Command table
  * @flag:      Command flag
@@ -346,6 +350,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)
@@ -359,6 +364,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 */
@@ -370,6 +385,8 @@ int do_env_set_efi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
                for ( ; argc > 0; argc--, argv++)
                        if (append_value(&value, &size, argv[0]) < 0) {
+                               printf("## Failed to process an argument, %s\n",
+                                      argv[0]);
                                ret = CMD_RET_FAILURE;
                                goto out;
                        }
@@ -378,6 +395,7 @@ int do_env_set_efi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        len = utf8_utf16_strnlen(var_name, strlen(var_name));
        var_name16 = malloc((len + 1) * 2);
        if (!var_name16) {
+               printf("## Out of memory\n");
                ret = CMD_RET_FAILURE;
                goto out;
        }
@@ -385,11 +403,14 @@ 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));
-       ret = (ret == EFI_SUCCESS ? CMD_RET_SUCCESS : CMD_RET_FAILURE);
+       if (ret == EFI_SUCCESS) {
+               ret = CMD_RET_SUCCESS;
+       } else {
+               printf("## Failed to set EFI variable\n");
+               ret = CMD_RET_FAILURE;
+       }
 out:
        free(value);
        free(var_name16);