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:
J-Alves 2020-05-26 14:03:05 +01:00
parent 3fbec43648
commit 4388f28f0f
2 changed files with 24 additions and 12 deletions

View File

@ -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, \

View File

@ -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 */