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
>

Reply via email to