mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-05-02 00:20:05 +00:00
FFA Version interface update
Change handler of FFA version interface: - Return SPMD's version if the origin of the call is secure; - Return SPMC's version if origin is non-secure. Signed-off-by: J-Alves <joao.alves@arm.com> Change-Id: I0d1554da79b72b1e02da6cc363a2288119c32f44
This commit is contained in:
parent
3fbec43648
commit
4388f28f0f
2 changed files with 24 additions and 12 deletions
|
@ -12,13 +12,13 @@
|
||||||
#include <tools_share/uuid.h>
|
#include <tools_share/uuid.h>
|
||||||
|
|
||||||
/* FFA error codes. */
|
/* FFA error codes. */
|
||||||
#define FFA_ERROR_NOT_SUPPORTED -1
|
#define FFA_ERROR_NOT_SUPPORTED -1
|
||||||
#define FFA_ERROR_INVALID_PARAMETER -2
|
#define FFA_ERROR_INVALID_PARAMETER -2
|
||||||
#define FFA_ERROR_NO_MEMORY -3
|
#define FFA_ERROR_NO_MEMORY -3
|
||||||
#define FFA_ERROR_BUSY -4
|
#define FFA_ERROR_BUSY -4
|
||||||
#define FFA_ERROR_INTERRUPTED -5
|
#define FFA_ERROR_INTERRUPTED -5
|
||||||
#define FFA_ERROR_DENIED -6
|
#define FFA_ERROR_DENIED -6
|
||||||
#define FFA_ERROR_RETRY -7
|
#define FFA_ERROR_RETRY -7
|
||||||
|
|
||||||
/* The macros below are used to identify FFA calls from the SMC function ID */
|
/* The macros below are used to identify FFA calls from the SMC function ID */
|
||||||
#define FFA_FNUM_MIN_VALUE U(0x60)
|
#define FFA_FNUM_MIN_VALUE U(0x60)
|
||||||
|
@ -30,13 +30,15 @@
|
||||||
|
|
||||||
/* FFA_VERSION helpers */
|
/* FFA_VERSION helpers */
|
||||||
#define FFA_VERSION_MAJOR U(1)
|
#define FFA_VERSION_MAJOR U(1)
|
||||||
#define FFA_VERSION_MAJOR_SHIFT 16
|
#define FFA_VERSION_MAJOR_SHIFT 16
|
||||||
#define FFA_VERSION_MAJOR_MASK U(0x7FFF)
|
#define FFA_VERSION_MAJOR_MASK U(0x7FFF)
|
||||||
#define FFA_VERSION_MINOR U(0)
|
#define FFA_VERSION_MINOR U(0)
|
||||||
#define FFA_VERSION_MINOR_SHIFT 0
|
#define FFA_VERSION_MINOR_SHIFT 0
|
||||||
#define FFA_VERSION_MINOR_MASK U(0xFFFF)
|
#define FFA_VERSION_MINOR_MASK U(0xFFFF)
|
||||||
|
#define FFA_VERSION_BIT31_MASK U(0x1u << 31)
|
||||||
|
|
||||||
#define MAKE_FFA_VERSION(major, minor) \
|
|
||||||
|
#define MAKE_FFA_VERSION(major, minor) \
|
||||||
((((major) & FFA_VERSION_MAJOR_MASK) << FFA_VERSION_MAJOR_SHIFT) | \
|
((((major) & FFA_VERSION_MAJOR_MASK) << FFA_VERSION_MAJOR_SHIFT) | \
|
||||||
(((minor) & FFA_VERSION_MINOR_MASK) << FFA_VERSION_MINOR_SHIFT))
|
(((minor) & FFA_VERSION_MINOR_MASK) << FFA_VERSION_MINOR_SHIFT))
|
||||||
#define FFA_VERSION_COMPILED MAKE_FFA_VERSION(FFA_VERSION_MAJOR, \
|
#define FFA_VERSION_COMPILED MAKE_FFA_VERSION(FFA_VERSION_MAJOR, \
|
||||||
|
|
|
@ -350,6 +350,7 @@ uint64_t spmd_smc_handler(uint32_t smc_fid,
|
||||||
spmd_spm_core_context_t *ctx = spmd_get_context();
|
spmd_spm_core_context_t *ctx = spmd_get_context();
|
||||||
bool secure_origin;
|
bool secure_origin;
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
|
uint32_t input_version;
|
||||||
|
|
||||||
/* Determine which security state this SMC originated from */
|
/* Determine which security state this SMC originated from */
|
||||||
secure_origin = is_caller_secure(flags);
|
secure_origin = is_caller_secure(flags);
|
||||||
|
@ -375,15 +376,24 @@ uint64_t spmd_smc_handler(uint32_t smc_fid,
|
||||||
break; /* not reached */
|
break; /* not reached */
|
||||||
|
|
||||||
case FFA_VERSION:
|
case FFA_VERSION:
|
||||||
|
input_version = (uint32_t)(0xFFFFFFFF & x1);
|
||||||
/*
|
/*
|
||||||
* TODO: This is an optimization that the version information
|
* If caller is secure and SPMC was initialized,
|
||||||
* provided by the SPM Core manifest is returned by the SPM
|
* return FFA_VERSION of SPMD.
|
||||||
* dispatcher. It might be a better idea to simply forward this
|
* If caller is non secure and SPMC was initialized,
|
||||||
* call to the SPM Core and wash our hands completely.
|
* return SPMC's version.
|
||||||
|
* Sanity check to "input_version".
|
||||||
*/
|
*/
|
||||||
ret = MAKE_FFA_VERSION(spmc_attrs.major_version,
|
if ((input_version & FFA_VERSION_BIT31_MASK) ||
|
||||||
spmc_attrs.minor_version);
|
(ctx->state == SPMC_STATE_RESET)) {
|
||||||
SMC_RET8(handle, FFA_SUCCESS_SMC32, FFA_TARGET_INFO_MBZ, ret,
|
ret = FFA_ERROR_NOT_SUPPORTED;
|
||||||
|
} else if (!secure_origin) {
|
||||||
|
ret = MAKE_FFA_VERSION(spmc_attrs.major_version, spmc_attrs.minor_version);
|
||||||
|
} else {
|
||||||
|
ret = MAKE_FFA_VERSION(FFA_VERSION_MAJOR, FFA_VERSION_MINOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
SMC_RET8(handle, ret, FFA_TARGET_INFO_MBZ, FFA_TARGET_INFO_MBZ,
|
||||||
FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
|
FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
|
||||||
FFA_PARAM_MBZ, FFA_PARAM_MBZ);
|
FFA_PARAM_MBZ, FFA_PARAM_MBZ);
|
||||||
break; /* not reached */
|
break; /* not reached */
|
||||||
|
|
Loading…
Add table
Reference in a new issue