Commit a3a34899 authored by danh-arm's avatar danh-arm
Browse files

Merge pull request #405 from vwadekar/tlkd-resume-fid-v3

TLKD: pass results with TLK_RESUME_FID function ID
parents 3679240a ca15d9bc
...@@ -198,41 +198,6 @@ uint64_t tlkd_smc_handler(uint32_t smc_fid, ...@@ -198,41 +198,6 @@ uint64_t tlkd_smc_handler(uint32_t smc_fid,
SMC_RET1(ns_cpu_context, x1); SMC_RET1(ns_cpu_context, x1);
/*
* Request from non secure world to resume the preempted
* Standard SMC call.
*/
case TLK_RESUME_FID:
/* RESUME should be invoked only by normal world */
if (!ns)
SMC_RET1(handle, SMC_UNK);
/*
* This is a resume request from the non-secure client.
* save the non-secure state and send the request to
* the secure payload.
*/
assert(handle == cm_get_context(NON_SECURE));
/* Check if we are already preempted before resume */
if (!get_std_smc_active_flag(tlk_ctx.state))
SMC_RET1(handle, SMC_UNK);
cm_el1_sysregs_context_save(NON_SECURE);
/*
* We are done stashing the non-secure context. Ask the
* secure payload to do the work now.
*/
/* We just need to return to the preempted point in
* SP and the execution will resume as normal.
*/
cm_el1_sysregs_context_restore(SECURE);
cm_set_next_eret_context(SECURE);
SMC_RET0(handle);
/* /*
* This is a request from the non-secure context to: * This is a request from the non-secure context to:
* *
...@@ -243,6 +208,7 @@ uint64_t tlkd_smc_handler(uint32_t smc_fid, ...@@ -243,6 +208,7 @@ uint64_t tlkd_smc_handler(uint32_t smc_fid,
* Applications. * Applications.
* c. open/close sessions * c. open/close sessions
* d. issue commands to the Trusted Apps * d. issue commands to the Trusted Apps
* e. resume the preempted standard SMC call.
*/ */
case TLK_REGISTER_LOGBUF: case TLK_REGISTER_LOGBUF:
case TLK_REGISTER_REQBUF: case TLK_REGISTER_REQBUF:
...@@ -250,6 +216,7 @@ uint64_t tlkd_smc_handler(uint32_t smc_fid, ...@@ -250,6 +216,7 @@ uint64_t tlkd_smc_handler(uint32_t smc_fid,
case TLK_CLOSE_TA_SESSION: case TLK_CLOSE_TA_SESSION:
case TLK_TA_LAUNCH_OP: case TLK_TA_LAUNCH_OP:
case TLK_TA_SEND_EVENT: case TLK_TA_SEND_EVENT:
case TLK_RESUME_FID:
if (!ns) if (!ns)
SMC_RET1(handle, SMC_UNK); SMC_RET1(handle, SMC_UNK);
...@@ -262,9 +229,18 @@ uint64_t tlkd_smc_handler(uint32_t smc_fid, ...@@ -262,9 +229,18 @@ uint64_t tlkd_smc_handler(uint32_t smc_fid,
*/ */
assert(handle == cm_get_context(NON_SECURE)); assert(handle == cm_get_context(NON_SECURE));
/* Check if we are already preempted */ /*
* Check if we are already processing a standard SMC
* call. Of all the supported fids, only the "resume"
* fid expects the flag to be set.
*/
if (smc_fid == TLK_RESUME_FID) {
if (!get_std_smc_active_flag(tlk_ctx.state))
SMC_RET1(handle, SMC_UNK);
} else {
if (get_std_smc_active_flag(tlk_ctx.state)) if (get_std_smc_active_flag(tlk_ctx.state))
SMC_RET1(handle, SMC_UNK); SMC_RET1(handle, SMC_UNK);
}
cm_el1_sysregs_context_save(NON_SECURE); cm_el1_sysregs_context_save(NON_SECURE);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment