]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_loader: separate UEFI variable API from implemementation
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 26 Jun 2020 15:57:48 +0000 (17:57 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 11 Jul 2020 21:14:16 +0000 (23:14 +0200)
Separate the remaining UEFI variable API functions GetNextVariableName and
QueryVariableInfo() from internal functions implementing them.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
include/efi_variable.h
lib/efi_loader/efi_var_common.c
lib/efi_loader/efi_variable.c
lib/efi_loader/efi_variable_tee.c

index 6789118eba58830c3aa0e0c68af6403252d8f594..3ba274fce173409ac0e3aed54ff05b2c00ba76d6 100644 (file)
@@ -40,4 +40,43 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
                                  u32 attributes, efi_uintn_t data_size,
                                  const void *data, bool ro_check);
 
+/**
+ * efi_get_next_variable_name_int() - enumerate the current variable names
+ *
+ * @variable_name_size:        size of variable_name buffer in byte
+ * @variable_name:     name of uefi variable's name in u16
+ * @vendor:            vendor's guid
+ *
+ * See the Unified Extensible Firmware Interface (UEFI) specification for
+ * details.
+ *
+ * Return: status code
+ */
+efi_status_t efi_get_next_variable_name_int(efi_uintn_t *variable_name_size,
+                                           u16 *variable_name,
+                                           efi_guid_t *vendor);
+
+/**
+ * efi_query_variable_info_int() - get information about EFI variables
+ *
+ * This function implements the QueryVariableInfo() runtime service.
+ *
+ * See the Unified Extensible Firmware Interface (UEFI) specification for
+ * details.
+ *
+ * @attributes:                                bitmask to select variables to be
+ *                                     queried
+ * @maximum_variable_storage_size:     maximum size of storage area for the
+ *                                     selected variable types
+ * @remaining_variable_storage_size:   remaining size of storage are for the
+ *                                     selected variable types
+ * @maximum_variable_size:             maximum size of a variable of the
+ *                                     selected type
+ * Returns:                            status code
+ */
+efi_status_t efi_query_variable_info_int(u32 attributes,
+                                        u64 *maximum_variable_storage_size,
+                                        u64 *remaining_variable_storage_size,
+                                        u64 *maximum_variable_size);
+
 #endif
index 6a4efa3f2775b2f4e0ebfc044fa64bb1de0da5ce..1e2be1135b94e9ac7b21cb1ef23f76e2adb1922a 100644 (file)
@@ -76,3 +76,65 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name,
 
        return EFI_EXIT(ret);
 }
+
+/**
+ * efi_get_next_variable_name() - enumerate the current variable names
+ *
+ * @variable_name_size:        size of variable_name buffer in byte
+ * @variable_name:     name of uefi variable's name in u16
+ * @vendor:            vendor's guid
+ *
+ * See the Unified Extensible Firmware Interface (UEFI) specification for
+ * details.
+ *
+ * Return: status code
+ */
+efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
+                                              u16 *variable_name,
+                                              efi_guid_t *vendor)
+{
+       efi_status_t ret;
+
+       EFI_ENTRY("%p \"%ls\" %pUl", variable_name_size, variable_name, vendor);
+
+       ret = efi_get_next_variable_name_int(variable_name_size, variable_name,
+                                            vendor);
+
+       return EFI_EXIT(ret);
+}
+
+/**
+ * efi_query_variable_info() - get information about EFI variables
+ *
+ * This function implements the QueryVariableInfo() runtime service.
+ *
+ * See the Unified Extensible Firmware Interface (UEFI) specification for
+ * details.
+ *
+ * @attributes:                                bitmask to select variables to be
+ *                                     queried
+ * @maximum_variable_storage_size:     maximum size of storage area for the
+ *                                     selected variable types
+ * @remaining_variable_storage_size:   remaining size of storage are for the
+ *                                     selected variable types
+ * @maximum_variable_size:             maximum size of a variable of the
+ *                                     selected type
+ * Returns:                            status code
+ */
+efi_status_t EFIAPI efi_query_variable_info(
+                       u32 attributes, u64 *maximum_variable_storage_size,
+                       u64 *remaining_variable_storage_size,
+                       u64 *maximum_variable_size)
+{
+       efi_status_t ret;
+
+       EFI_ENTRY("%x %p %p %p", attributes, maximum_variable_storage_size,
+                 remaining_variable_storage_size, maximum_variable_size);
+
+       ret = efi_query_variable_info_int(attributes,
+                                         maximum_variable_storage_size,
+                                         remaining_variable_storage_size,
+                                         maximum_variable_size);
+
+       return EFI_EXIT(ret);
+}
index 6ec1f973269bb3e9fb6e4cd06f95be117dd18108..36bac8670279861e1a42f2f653ef3372ae830570 100644 (file)
@@ -745,23 +745,9 @@ static efi_status_t parse_uboot_variable(char *variable,
        return EFI_SUCCESS;
 }
 
-/**
- * efi_get_next_variable_name() - enumerate the current variable names
- *
- * @variable_name_size:        size of variable_name buffer in byte
- * @variable_name:     name of uefi variable's name in u16
- * @vendor:            vendor's guid
- *
- * This function implements the GetNextVariableName service.
- *
- * See the Unified Extensible Firmware Interface (UEFI) specification for
- * details.
- *
- * Return: status code
- */
-efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
-                                              u16 *variable_name,
-                                              efi_guid_t *vendor)
+efi_status_t efi_get_next_variable_name_int(efi_uintn_t *variable_name_size,
+                                           u16 *variable_name,
+                                           efi_guid_t *vendor)
 {
        char *native_name, *variable;
        ssize_t name_len, list_len;
@@ -771,10 +757,8 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
        int i;
        efi_status_t ret;
 
-       EFI_ENTRY("%p \"%ls\" %pUl", variable_name_size, variable_name, vendor);
-
        if (!variable_name_size || !variable_name || !vendor)
-               return EFI_EXIT(EFI_INVALID_PARAMETER);
+               return EFI_INVALID_PARAMETER;
 
        if (variable_name[0]) {
                /* check null-terminated string */
@@ -782,12 +766,12 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
                        if (!variable_name[i])
                                break;
                if (i >= *variable_name_size)
-                       return EFI_EXIT(EFI_INVALID_PARAMETER);
+                       return EFI_INVALID_PARAMETER;
 
                /* search for the last-returned variable */
                ret = efi_to_native(&native_name, variable_name, vendor);
                if (ret)
-                       return EFI_EXIT(ret);
+                       return ret;
 
                name_len = strlen(native_name);
                for (variable = efi_variables_list; variable && *variable;) {
@@ -802,14 +786,14 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
 
                free(native_name);
                if (!(variable && *variable))
-                       return EFI_EXIT(EFI_INVALID_PARAMETER);
+                       return EFI_INVALID_PARAMETER;
 
                /* next variable */
                variable = strchr(variable, '\n');
                if (variable)
                        variable++;
                if (!(variable && *variable))
-                       return EFI_EXIT(EFI_NOT_FOUND);
+                       return EFI_NOT_FOUND;
        } else {
                /*
                 *new search: free a list used in the previous search
@@ -824,7 +808,7 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
                                     &efi_variables_list, 0, 1, regexlist);
 
                if (list_len <= 1)
-                       return EFI_EXIT(EFI_NOT_FOUND);
+                       return EFI_NOT_FOUND;
 
                variable = efi_variables_list;
        }
@@ -832,7 +816,7 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
        ret = parse_uboot_variable(variable, variable_name_size, variable_name,
                                   vendor, &attributes);
 
-       return EFI_EXIT(ret);
+       return ret;
 }
 
 efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
@@ -1057,13 +1041,17 @@ err:
        return ret;
 }
 
+efi_status_t efi_query_variable_info_int(u32 attributes,
+                                        u64 *maximum_variable_storage_size,
+                                        u64 *remaining_variable_storage_size,
+                                        u64 *maximum_variable_size)
+{
+       return EFI_UNSUPPORTED;
+}
+
 /**
- * efi_query_variable_info() - get information about EFI variables
- *
- * This function implements the QueryVariableInfo() runtime service.
- *
- * See the Unified Extensible Firmware Interface (UEFI) specification for
- * details.
+ * efi_query_variable_info_runtime() - runtime implementation of
+ *                                    QueryVariableInfo()
  *
  * @attributes:                                bitmask to select variables to be
  *                                     queried
@@ -1075,7 +1063,7 @@ err:
  *                                     selected type
  * Returns:                            status code
  */
-efi_status_t __efi_runtime EFIAPI efi_query_variable_info(
+efi_status_t __efi_runtime EFIAPI efi_query_variable_info_runtime(
                        u32 attributes,
                        u64 *maximum_variable_storage_size,
                        u64 *remaining_variable_storage_size,
@@ -1144,6 +1132,8 @@ void efi_variables_boot_exit_notify(void)
        efi_runtime_services.get_next_variable_name =
                                efi_get_next_variable_name_runtime;
        efi_runtime_services.set_variable = efi_set_variable_runtime;
+       efi_runtime_services.query_variable_info =
+                               efi_query_variable_info_runtime;
        efi_update_table_header_crc32(&efi_runtime_services.hdr);
 }
 
index 1d6d4fe807bd98d91194f357d6c5e21c1f3810ae..ff90aa8e81c6559671e3314b2370283a28c6515a 100644 (file)
@@ -312,23 +312,9 @@ out:
        return ret;
 }
 
-/**
- * efi_get_next_variable_name() - enumerate the current variable names
- *
- * @variable_name_size:        size of variable_name buffer in bytes
- * @variable_name:     name of uefi variable's name in u16
- * @guid:              vendor's guid
- *
- * This function implements the GetNextVariableName service.
- *
- * See the Unified Extensible Firmware Interface (UEFI) specification for
- * details.
- *
- * Return: status code
- */
-efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
-                                              u16 *variable_name,
-                                              efi_guid_t *guid)
+efi_status_t efi_get_next_variable_name_int(efi_uintn_t *variable_name_size,
+                                           u16 *variable_name,
+                                           efi_guid_t *guid)
 {
        struct smm_variable_getnext *var_getnext;
        efi_uintn_t payload_size;
@@ -338,8 +324,6 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
        u8 *comm_buf = NULL;
        efi_status_t ret;
 
-       EFI_ENTRY("%p \"%ls\" %pUl", variable_name_size, variable_name, guid);
-
        if (!variable_name_size || !variable_name || !guid) {
                ret = EFI_INVALID_PARAMETER;
                goto out;
@@ -396,7 +380,7 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
 
 out:
        free(comm_buf);
-       return EFI_EXIT(ret);
+       return ret;
 }
 
 efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
@@ -448,37 +432,16 @@ out:
        return ret;
 }
 
-/**
- * efi_query_variable_info() - get information about EFI variables
- *
- * This function implements the QueryVariableInfo() runtime service.
- *
- * See the Unified Extensible Firmware Interface (UEFI) specification for
- * details.
- *
- * @attributes:                                bitmask to select variables to be
- *                                     queried
- * @maximum_variable_storage_size:     maximum size of storage area for the
- *                                     selected variable types
- * @remaining_variable_storage_size:   remaining size of storage are for the
- *                                     selected variable types
- * @maximum_variable_size:             maximum size of a variable of the
- *                                     selected type
- * Returns:                            status code
- */
-efi_status_t EFIAPI __efi_runtime
-efi_query_variable_info(u32 attributes, u64 *max_variable_storage_size,
-                       u64 *remain_variable_storage_size,
-                       u64 *max_variable_size)
+efi_status_t efi_query_variable_info_int(u32 attributes,
+                                        u64 *max_variable_storage_size,
+                                        u64 *remain_variable_storage_size,
+                                        u64 *max_variable_size)
 {
        struct smm_variable_query_info *mm_query_info;
        efi_uintn_t payload_size;
        efi_status_t ret;
        u8 *comm_buf;
 
-       EFI_ENTRY("%x %p %p %p", attributes, max_variable_storage_size,
-                 remain_variable_storage_size, max_variable_size);
-
        payload_size = sizeof(*mm_query_info);
        comm_buf = setup_mm_hdr((void **)&mm_query_info, payload_size,
                                SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO,
@@ -497,7 +460,7 @@ efi_query_variable_info(u32 attributes, u64 *max_variable_storage_size,
 
 out:
        free(comm_buf);
-       return EFI_EXIT(ret);
+       return ret;
 }
 
 /**