From 48559aa9671da2b4a0c8ceb3101555bac7324c21 Mon Sep 17 00:00:00 2001 From: Nitin LNU Date: Sat, 4 Dec 2021 02:54:26 +0530 Subject: [PATCH] qseecom: Add loadapp check in block on listener Add load app check in block on listener function and give the dummy app id as in case of load app we not having app id yet populated it should be similar request we get from smcinvoke. Test Case: 1. Validated Sample app test cases. Change-Id: I075d011aeb17113d35630f2374c3b0ab318c8ad1 Signed-off-by: Nitin LNU --- drivers/misc/qseecom.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index cc516be3861b..9d89e3eb2a4d 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -373,6 +373,7 @@ struct qseecom_client_handle { bool from_smcinvoke; struct qtee_shm shm; /* kernel client's shm for req/rsp buf */ bool unload_pending; + bool from_loadapp; }; struct qseecom_listener_handle { @@ -2300,8 +2301,9 @@ static int __qseecom_process_reentrancy_blocked_on_listener( /* find app_id & img_name from list */ if (!ptr_app) { - if (data->client.from_smcinvoke) { - pr_debug("This request is from smcinvoke\n"); + if (data->client.from_smcinvoke || data->client.from_loadapp) { + pr_debug("This request is from %s\n", + (data->client.from_smcinvoke ? "smcinvoke" : "load_app")); ptr_app = &dummy_app_entry; ptr_app->app_id = data->client.app_id; } else { @@ -2379,8 +2381,10 @@ static int __qseecom_process_reentrancy_blocked_on_listener( ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, &ireq, sizeof(ireq), &continue_resp, sizeof(continue_resp)); + if (ret && qseecom.smcinvoke_support) { /* retry with legacy cmd */ + pr_warn("falling back to legacy method\n"); qseecom.smcinvoke_support = false; ireq.app_or_session_id = data->client.app_id; ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, @@ -2398,7 +2402,7 @@ static int __qseecom_process_reentrancy_blocked_on_listener( resp->result = continue_resp.result; resp->resp_type = continue_resp.resp_type; resp->data = continue_resp.data; - pr_debug("unblock resp = %d\n", resp->result); + pr_err("unblock resp = %d\n", resp->result); } while (resp->result == QSEOS_RESULT_BLOCKED_ON_LISTENER); if (resp->result != QSEOS_RESULT_INCOMPLETE) { @@ -2916,6 +2920,8 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) if (resp.result == QSEOS_RESULT_BLOCKED_ON_LISTENER) { pr_err("load app blocked on listener\n"); + data->client.app_id = resp.result; + data->client.from_loadapp = true; ret = __qseecom_process_reentrancy_blocked_on_listener(&resp, NULL, data); if (ret) { @@ -2926,14 +2932,16 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) } } - if (resp.result != QSEOS_RESULT_SUCCESS) { - pr_err("scm_call failed resp.result unknown, %d\n", - resp.result); - ret = -EFAULT; - goto loadapp_err; - } } while ((resp.result == QSEOS_RESULT_BLOCKED_ON_LISTENER) || (resp.result == QSEOS_RESULT_INCOMPLETE)); + + if (resp.result != QSEOS_RESULT_SUCCESS) { + pr_err("scm_call failed resp.result unknown, %d\n", + resp.result); + ret = -EFAULT; + goto loadapp_err; + } + app_id = resp.data; entry = kmalloc(sizeof(*entry), GFP_KERNEL);