Hi Harsimran,
[...]
> + efi_status_t ret, mm_communicate_ret = EFI_SUCCESS;
> + struct var_check_property var_property;
> + struct smm_variable_access *var_acc;
> + efi_uintn_t payload_size;
> + efi_uintn_t name_size;
> + u8 *comm_buf = NULL;
> + bool ro;
> +
> + if (!variable_name || variable_name[0] == 0 || !guid)
> + return EFI_INVALID_PARAMETER;
> +
> + if (data_size > 0 && !data)
> + return EFI_INVALID_PARAMETER;
> +
> + /* Check payload size */
> + name_size = u16_strsize(variable_name);
> + payload_size = MM_VARIABLE_ACCESS_HEADER_SIZE + name_size + data_size;
> + if (payload_size > max_payload_size)
> + return EFI_INVALID_PARAMETER;
> +
> + ro = !!(attributes & EFI_VARIABLE_READ_ONLY);
> + attributes &= EFI_VARIABLE_MASK;
> +
> + ret = get_property_int(variable_name, name_size, guid,
> + &var_property);
> + if (ret != EFI_SUCCESS)
> + return ret;
> +
> + if (var_property.property & VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY)
> + return EFI_WRITE_PROTECTED;
> +
> + comm_buf = setup_mm_hdr((void **)&var_acc, payload_size,
> + SMM_VARIABLE_FUNCTION_SET_VARIABLE, &ret);
> + if (!comm_buf)
> + return ret;
> +
> + /* Fill in contents */
> + efi_memcpy_runtime(&var_acc->guid, guid, sizeof(*guid));
> + var_acc->data_size = data_size;
> + var_acc->name_size = name_size;
> + var_acc->attr = attributes;
> + efi_memcpy_runtime(var_acc->name, variable_name, name_size);
> + efi_memcpy_runtime((u8 *)var_acc->name + name_size, data, data_size);
> +
> + /* Communicate */
> + ret = mm_communicate(comm_buf, payload_size);
> + if (ret != EFI_SUCCESS)
> + mm_communicate_ret = ret;
> +
> + if (ro && !(var_property.property &
> VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY)) {
> + var_property.revision = VAR_CHECK_VARIABLE_PROPERTY_REVISION;
> + var_property.property |=
> VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY;
> + var_property.attributes = attributes;
> + var_property.minsize = 1;
> + var_property.maxsize = data_size;
> + ret = set_property_int(variable_name, name_size, guid,
> &var_property);
> + }
> +
> + return (mm_communicate_ret == EFI_SUCCESS) ? ret : mm_communicate_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
> + * Return: status code
> + */
> +efi_status_t EFIAPI __efi_runtime
> +efi_query_variable_info_runtime(u32 attributes, u64
> *max_variable_storage_size,
> + u64 *remain_variable_storage_size,
> + u64 *max_variable_size)
> +{
> + return EFI_UNSUPPORTED;
This will lead to a compile time error
lib/efi_loader/efi_variable_tee.c:1179:1: error: redefinition of
‘efi_query_variable_info_runtime’
1179 | efi_query_variable_info_runtime(u32 attributes, u64
*max_variable_storage_size,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/efi_loader/efi_variable_tee.c:1074:1: note: previous definition of
‘efi_query_variable_info_runtime’ with type ‘efi_status_t(u32, u64 *,
u64 *, u64 *)’ {aka ‘long unsigned int(unsigned int, long long
unsigned int *, long long unsigned int *, long long unsigned int *)’}
1074 | efi_query_variable_info_runtime(u32 attributes, u64
*max_variable_storage_size,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Is what I am getting locally.
Each patch needs to apply individually without breakage/errors.
Cheers
/Ilias
> +}
> +
> +/**
> + * efi_set_variable_runtime() - runtime implementation of SetVariable()
> + *
> + * This function implements the SetVariable() runtime service for OP-TEE
> + * without FF-A runtime transport.
> + *
> + * @variable_name: name of the variable
> + * @guid: vendor GUID
> + * @attributes: attributes of the variable
> + * @data_size: size of the buffer with the variable value
> + * @data: buffer with the variable value
> + * Return: status code
> + */
> +static efi_status_t __efi_runtime EFIAPI
> efi_set_variable_runtime(u16 *variable_name, const efi_guid_t *guid,
> u32 attributes, efi_uintn_t data_size,
> const void *data)
> @@ -1124,12 +1233,16 @@ void efi_variables_boot_exit_notify(void)
> free(var_buf);
>
> /* Update runtime service table */
> + if (IS_ENABLED(CONFIG_ARM_FFA_RT_MODE)) {
> + efi_runtime_services.set_variable =
> efi_set_variable_ffa_runtime;
> + } else {
> + efi_runtime_services.set_variable = efi_set_variable_runtime;
> + }
> efi_runtime_services.query_variable_info =
> efi_query_variable_info_runtime;
> efi_runtime_services.get_variable = efi_get_variable_runtime;
> efi_runtime_services.get_next_variable_name =
> efi_get_next_variable_name_runtime;
> - efi_runtime_services.set_variable = efi_set_variable_runtime;
> efi_update_table_header_crc32(&efi_runtime_services.hdr);
>
> /* Record that ExitBootServices() has been called */
> --
> 2.43.0
>