diff --git a/include/bl32/payloads/tlk.h b/include/bl32/payloads/tlk.h index 65fd333..910f50f 100644 --- a/include/bl32/payloads/tlk.h +++ b/include/bl32/payloads/tlk.h @@ -35,6 +35,7 @@ * Generate function IDs for the Trusted OS/Apps */ #define TLK_TOS_STD_FID(fid) ((fid) | 0x72000000 | (0 << 31)) +#define TLK_TA_STD_FID(fid) ((fid) | 0x70000000 | (0 << 31)) /* * Trusted OS specific function IDs @@ -54,9 +55,17 @@ #define TLK_FID_SHARED_MEMBUF (0x32000005 | (1 << 31)) /* + * Trusted Application specific function IDs + */ +#define TLK_OPEN_TA_SESSION TLK_TA_STD_FID(0x1) +#define TLK_CLOSE_TA_SESSION TLK_TA_STD_FID(0x2) +#define TLK_TA_LAUNCH_OP TLK_TA_STD_FID(0x3) +#define TLK_TA_SEND_EVENT TLK_TA_STD_FID(0x4) + +/* * Total number of function IDs implemented for services offered to NS clients. */ -#define TLK_NUM_FID 0 +#define TLK_NUM_FID 7 /* TLK implementation version numbers */ #define TLK_VERSION_MAJOR 0x0 /* Major version */ diff --git a/services/spd/tlkd/tlkd_main.c b/services/spd/tlkd/tlkd_main.c index bea4c48..c22203b 100644 --- a/services/spd/tlkd/tlkd_main.c +++ b/services/spd/tlkd/tlkd_main.c @@ -193,6 +193,10 @@ /* Passing a NULL context is a critical programming error */ assert(handle); + /* These SMCs are only supported by CPU0 */ + if ((read_mpidr() & MPIDR_CPU_MASK) != 0) + SMC_RET1(handle, SMC_UNK); + /* Determine which security state this SMC originated from */ ns = is_caller_non_secure(flags); @@ -267,9 +271,16 @@ * b. register shared memory with the SP for passing args * required for maintaining sessions with the Trusted * Applications. + * c. open/close sessions + * d. issue commands to the Trusted Apps */ case TLK_REGISTER_LOGBUF: case TLK_REGISTER_REQBUF: + case TLK_OPEN_TA_SESSION: + case TLK_CLOSE_TA_SESSION: + case TLK_TA_LAUNCH_OP: + case TLK_TA_SEND_EVENT: + if (!ns || !tlk_args_results_buf) SMC_RET1(handle, SMC_UNK); @@ -442,3 +453,25 @@ NULL, tlkd_smc_handler ); + +/* Define a SPD runtime service descriptor for fast SMC calls */ +DECLARE_RT_SVC( + tlkd_tap_fast, + + OEN_TAP_START, + OEN_TAP_END, + SMC_TYPE_FAST, + NULL, + tlkd_smc_handler +); + +/* Define a SPD runtime service descriptor for standard SMC calls */ +DECLARE_RT_SVC( + tlkd_tap_std, + + OEN_TAP_START, + OEN_TAP_END, + SMC_TYPE_STD, + NULL, + tlkd_smc_handler +);