Loading drivers/misc/qseecom.c +50 −13 Original line number Diff line number Diff line Loading @@ -275,6 +275,40 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } case SCM_SVC_ES: { switch (tz_cmd_id) { case SCM_SAVE_PARTITION_HASH_ID: { u32 tzbuflen = PAGE_ALIGN(SHA256_DIGEST_LENGTH); struct qseecom_save_partition_hash_req *p_hash_req = (struct qseecom_save_partition_hash_req *) req_buf; char *tzbuf = kzalloc(tzbuflen, GFP_KERNEL); if (!tzbuf) { pr_err("error allocating data\n"); return -ENOMEM; } memset(tzbuf, 0, tzbuflen); memcpy(tzbuf, p_hash_req->digest, SHA256_DIGEST_LENGTH); dmac_flush_range(tzbuf, tzbuf + tzbuflen); smc_id = TZ_ES_SAVE_PARTITION_HASH_ID; desc.arginfo = TZ_ES_SAVE_PARTITION_HASH_ID_PARAM_ID; desc.args[0] = p_hash_req->partition_id; desc.args[1] = virt_to_phys(tzbuf); desc.args[2] = SHA256_DIGEST_LENGTH; ret = scm_call2(smc_id, &desc); kzfree(tzbuf); break; } default: { pr_err("tz_cmd_id %d is not supported by scm_call2\n", tz_cmd_id); ret = -EINVAL; break; } } /* end of switch (tz_cmd_id) */ break; } /* end of case SCM_SVC_ES */ case SCM_SVC_TZSCHEDULER: { switch (qseos_cmd_id) { case QSEOS_APP_START_COMMAND: { Loading Loading @@ -3866,30 +3900,30 @@ static int qseecom_update_key_user_info(struct qseecom_dev_handle *data, static int qseecom_is_es_activated(void __user *argp) { struct qseecom_is_es_activated_req req; struct qseecom_command_scm_resp resp; int ret; int resp_buf; if (qseecom.qsee_version < QSEE_VERSION_04) { pr_err("invalid qsee version"); pr_err("invalid qsee version\n"); return -ENODEV; } if (argp == NULL) { pr_err("arg is null"); pr_err("arg is null\n"); return -EINVAL; } ret = qseecom_scm_call(SCM_SVC_ES, SCM_IS_ACTIVATED_ID, NULL, 0, (void *) &resp_buf, sizeof(resp_buf)); ret = qseecom_scm_call(SCM_SVC_ES, SCM_IS_ACTIVATED_ID, &req, sizeof(req), &resp, sizeof(resp)); if (ret) { pr_err("scm_call failed"); pr_err("scm_call failed\n"); return ret; } req.is_activated = resp_buf; req.is_activated = resp.result; ret = copy_to_user(argp, &req, sizeof(req)); if (ret) { pr_err("copy_to_user failed"); pr_err("copy_to_user failed\n"); return ret; } Loading @@ -3899,28 +3933,31 @@ static int qseecom_is_es_activated(void __user *argp) static int qseecom_save_partition_hash(void __user *argp) { struct qseecom_save_partition_hash_req req; struct qseecom_command_scm_resp resp; int ret; memset(&resp, 0x00, sizeof(resp)); if (qseecom.qsee_version < QSEE_VERSION_04) { pr_err("invalid qsee version "); pr_err("invalid qsee version\n"); return -ENODEV; } if (argp == NULL) { pr_err("arg is null"); pr_err("arg is null\n"); return -EINVAL; } ret = copy_from_user(&req, argp, sizeof(req)); if (ret) { pr_err("copy_from_user failed"); pr_err("copy_from_user failed\n"); return ret; } ret = qseecom_scm_call(SCM_SVC_ES, SCM_SAVE_PARTITION_HASH_ID, (void *) &req, sizeof(req), NULL, 0); (void *)&req, sizeof(req), (void *)&resp, sizeof(resp)); if (ret) { pr_err("qseecom_scm_call failed"); pr_err("qseecom_scm_call failed\n"); return ret; } Loading include/soc/qcom/qseecomi.h +9 −0 Original line number Diff line number Diff line Loading @@ -249,6 +249,7 @@ __packed struct qseecom_client_send_fsm_key_req { #define TZ_SVC_EXTERNAL 3 /* External image loading */ #define TZ_SVC_RPMB 4 /* RPMB */ #define TZ_SVC_KEYSTORE 5 /* Keystore management */ #define TZ_SVC_ES 16 /* Enterprise Security */ /*---------------------------------------------------------------------------- * Owning Entity IDs (defined by ARM SMC doc) Loading Loading @@ -505,4 +506,12 @@ __packed struct qseecom_client_send_fsm_key_req { TZ_SYSCALL_CREATE_PARAM_ID_2( \ TZ_SYSCALL_PARAM_TYPE_BUF_RW, TZ_SYSCALL_PARAM_TYPE_VAL) #define TZ_ES_SAVE_PARTITION_HASH_ID \ TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_SIP, TZ_SVC_ES, 0x01) #define TZ_ES_SAVE_PARTITION_HASH_ID_PARAM_ID \ TZ_SYSCALL_CREATE_PARAM_ID_3( \ TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ TZ_SYSCALL_PARAM_TYPE_VAL) #endif /* __QSEECOMI_H_ */ Loading
drivers/misc/qseecom.c +50 −13 Original line number Diff line number Diff line Loading @@ -275,6 +275,40 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } case SCM_SVC_ES: { switch (tz_cmd_id) { case SCM_SAVE_PARTITION_HASH_ID: { u32 tzbuflen = PAGE_ALIGN(SHA256_DIGEST_LENGTH); struct qseecom_save_partition_hash_req *p_hash_req = (struct qseecom_save_partition_hash_req *) req_buf; char *tzbuf = kzalloc(tzbuflen, GFP_KERNEL); if (!tzbuf) { pr_err("error allocating data\n"); return -ENOMEM; } memset(tzbuf, 0, tzbuflen); memcpy(tzbuf, p_hash_req->digest, SHA256_DIGEST_LENGTH); dmac_flush_range(tzbuf, tzbuf + tzbuflen); smc_id = TZ_ES_SAVE_PARTITION_HASH_ID; desc.arginfo = TZ_ES_SAVE_PARTITION_HASH_ID_PARAM_ID; desc.args[0] = p_hash_req->partition_id; desc.args[1] = virt_to_phys(tzbuf); desc.args[2] = SHA256_DIGEST_LENGTH; ret = scm_call2(smc_id, &desc); kzfree(tzbuf); break; } default: { pr_err("tz_cmd_id %d is not supported by scm_call2\n", tz_cmd_id); ret = -EINVAL; break; } } /* end of switch (tz_cmd_id) */ break; } /* end of case SCM_SVC_ES */ case SCM_SVC_TZSCHEDULER: { switch (qseos_cmd_id) { case QSEOS_APP_START_COMMAND: { Loading Loading @@ -3866,30 +3900,30 @@ static int qseecom_update_key_user_info(struct qseecom_dev_handle *data, static int qseecom_is_es_activated(void __user *argp) { struct qseecom_is_es_activated_req req; struct qseecom_command_scm_resp resp; int ret; int resp_buf; if (qseecom.qsee_version < QSEE_VERSION_04) { pr_err("invalid qsee version"); pr_err("invalid qsee version\n"); return -ENODEV; } if (argp == NULL) { pr_err("arg is null"); pr_err("arg is null\n"); return -EINVAL; } ret = qseecom_scm_call(SCM_SVC_ES, SCM_IS_ACTIVATED_ID, NULL, 0, (void *) &resp_buf, sizeof(resp_buf)); ret = qseecom_scm_call(SCM_SVC_ES, SCM_IS_ACTIVATED_ID, &req, sizeof(req), &resp, sizeof(resp)); if (ret) { pr_err("scm_call failed"); pr_err("scm_call failed\n"); return ret; } req.is_activated = resp_buf; req.is_activated = resp.result; ret = copy_to_user(argp, &req, sizeof(req)); if (ret) { pr_err("copy_to_user failed"); pr_err("copy_to_user failed\n"); return ret; } Loading @@ -3899,28 +3933,31 @@ static int qseecom_is_es_activated(void __user *argp) static int qseecom_save_partition_hash(void __user *argp) { struct qseecom_save_partition_hash_req req; struct qseecom_command_scm_resp resp; int ret; memset(&resp, 0x00, sizeof(resp)); if (qseecom.qsee_version < QSEE_VERSION_04) { pr_err("invalid qsee version "); pr_err("invalid qsee version\n"); return -ENODEV; } if (argp == NULL) { pr_err("arg is null"); pr_err("arg is null\n"); return -EINVAL; } ret = copy_from_user(&req, argp, sizeof(req)); if (ret) { pr_err("copy_from_user failed"); pr_err("copy_from_user failed\n"); return ret; } ret = qseecom_scm_call(SCM_SVC_ES, SCM_SAVE_PARTITION_HASH_ID, (void *) &req, sizeof(req), NULL, 0); (void *)&req, sizeof(req), (void *)&resp, sizeof(resp)); if (ret) { pr_err("qseecom_scm_call failed"); pr_err("qseecom_scm_call failed\n"); return ret; } Loading
include/soc/qcom/qseecomi.h +9 −0 Original line number Diff line number Diff line Loading @@ -249,6 +249,7 @@ __packed struct qseecom_client_send_fsm_key_req { #define TZ_SVC_EXTERNAL 3 /* External image loading */ #define TZ_SVC_RPMB 4 /* RPMB */ #define TZ_SVC_KEYSTORE 5 /* Keystore management */ #define TZ_SVC_ES 16 /* Enterprise Security */ /*---------------------------------------------------------------------------- * Owning Entity IDs (defined by ARM SMC doc) Loading Loading @@ -505,4 +506,12 @@ __packed struct qseecom_client_send_fsm_key_req { TZ_SYSCALL_CREATE_PARAM_ID_2( \ TZ_SYSCALL_PARAM_TYPE_BUF_RW, TZ_SYSCALL_PARAM_TYPE_VAL) #define TZ_ES_SAVE_PARTITION_HASH_ID \ TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_SIP, TZ_SVC_ES, 0x01) #define TZ_ES_SAVE_PARTITION_HASH_ID_PARAM_ID \ TZ_SYSCALL_CREATE_PARAM_ID_3( \ TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ TZ_SYSCALL_PARAM_TYPE_VAL) #endif /* __QSEECOMI_H_ */