Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b1308d1 authored by Zhen Kong's avatar Zhen Kong Committed by Gerrit - the friendly Code Review server
Browse files

qseecom: Save appname in qseecom when loading app by kernel client



We've made changes on app session managements to save app name in
qseecom when loading app by userspace client. This change is to save
app name when loading app by kernel client, then qseecom can compare
the app name correctly when sending commands to TZ.

CRs-Fixed: 748491
Change-Id: I341a1a89f0e8a45056be7a5ce0a6a540842bc5dd
Signed-off-by: default avatarZhen Kong <zkong@codeaurora.org>
parent e0aa4a54
Loading
Loading
Loading
Loading
+23 −11
Original line number Original line Diff line number Diff line
@@ -1384,9 +1384,8 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp)
		}
		}
		entry->app_id = app_id;
		entry->app_id = app_id;
		entry->ref_cnt = 1;
		entry->ref_cnt = 1;
		memset((void *)entry->app_name, 0, MAX_APP_NAME_SIZE);
		memcpy(entry->app_name, load_img_req.img_name,
		memcpy((void *)entry->app_name,
					MAX_APP_NAME_SIZE);
			(void *)load_img_req.img_name, MAX_APP_NAME_SIZE);
		/* Deallocate the handle */
		/* Deallocate the handle */
		if (!IS_ERR_OR_NULL(ihandle))
		if (!IS_ERR_OR_NULL(ihandle))
			ion_free(qseecom.ion_clnt, ihandle);
			ion_free(qseecom.ion_clnt, ihandle);
@@ -1400,9 +1399,8 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp)
		(char *)(load_img_req.img_name));
		(char *)(load_img_req.img_name));
	}
	}
	data->client.app_id = app_id;
	data->client.app_id = app_id;
	memset((void *)data->client.app_name, 0, MAX_APP_NAME_SIZE);
	memcpy(data->client.app_name, load_img_req.img_name,
	memcpy((void *)data->client.app_name,
					MAX_APP_NAME_SIZE);
		(void *)load_img_req.img_name, MAX_APP_NAME_SIZE);
	load_img_req.app_id = app_id;
	load_img_req.app_id = app_id;
	if (copy_to_user(argp, &load_img_req, sizeof(load_img_req))) {
	if (copy_to_user(argp, &load_img_req, sizeof(load_img_req))) {
		pr_err("copy_to_user failed\n");
		pr_err("copy_to_user failed\n");
@@ -1924,8 +1922,8 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data,
		name_len = min(strlen(data->client.app_name),
		name_len = min(strlen(data->client.app_name),
				strlen(ptr_app->app_name));
				strlen(ptr_app->app_name));
		if ((ptr_app->app_id == data->client.app_id) &&
		if ((ptr_app->app_id == data->client.app_id) &&
			 (!memcmp((void *)ptr_app->app_name,
			 (!memcmp(ptr_app->app_name,
				(void *)data->client.app_name, name_len))) {
				data->client.app_name, name_len))) {
			found_app = true;
			found_app = true;
			break;
			break;
		}
		}
@@ -2696,6 +2694,12 @@ int qseecom_start_app(struct qseecom_handle **handle,
	size_t len;
	size_t len;
	ion_phys_addr_t pa;
	ion_phys_addr_t pa;


	if (!app_name || strlen(app_name) >= MAX_APP_NAME_SIZE) {
		pr_err("The app_name (%s) with length %zu is not valid\n",
			app_name, strlen(app_name));
		return -EINVAL;
	}

	*handle = kzalloc(sizeof(struct qseecom_handle), GFP_KERNEL);
	*handle = kzalloc(sizeof(struct qseecom_handle), GFP_KERNEL);
	if (!(*handle)) {
	if (!(*handle)) {
		pr_err("failed to allocate memory for kernel client handle\n");
		pr_err("failed to allocate memory for kernel client handle\n");
@@ -2776,6 +2780,7 @@ int qseecom_start_app(struct qseecom_handle **handle,
		if (ret < 0)
		if (ret < 0)
			goto err;
			goto err;
		data->client.app_id = ret;
		data->client.app_id = ret;
		memcpy(data->client.app_name, app_name, MAX_APP_NAME_SIZE);
	}
	}
	if (!found_app) {
	if (!found_app) {
		entry = kmalloc(sizeof(*entry), GFP_KERNEL);
		entry = kmalloc(sizeof(*entry), GFP_KERNEL);
@@ -2786,6 +2791,7 @@ int qseecom_start_app(struct qseecom_handle **handle,
		}
		}
		entry->app_id = ret;
		entry->app_id = ret;
		entry->ref_cnt = 1;
		entry->ref_cnt = 1;
		memcpy(entry->app_name, app_name, MAX_APP_NAME_SIZE);


		spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
		spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
		list_add_tail(&entry->list, &qseecom.registered_app_list_head);
		list_add_tail(&entry->list, &qseecom.registered_app_list_head);
@@ -2849,6 +2855,9 @@ int qseecom_shutdown_app(struct qseecom_handle **handle)
		return -EINVAL;
		return -EINVAL;
	}
	}
	data =	(struct qseecom_dev_handle *) ((*handle)->dev);
	data =	(struct qseecom_dev_handle *) ((*handle)->dev);
	mutex_lock(&app_access_lock);
	atomic_inc(&data->ioctl_count);

	spin_lock_irqsave(&qseecom.registered_kclient_list_lock, flags);
	spin_lock_irqsave(&qseecom.registered_kclient_list_lock, flags);
	list_for_each_entry(kclient, &qseecom.registered_kclient_list_head,
	list_for_each_entry(kclient, &qseecom.registered_kclient_list_head,
				list) {
				list) {
@@ -2881,12 +2890,16 @@ int qseecom_shutdown_app(struct qseecom_handle **handle)
		if (data->perf_enabled == true)
		if (data->perf_enabled == true)
			qsee_disable_clock_vote(data, CLK_DFAB);
			qsee_disable_clock_vote(data, CLK_DFAB);
	}
	}

	atomic_dec(&data->ioctl_count);
	mutex_unlock(&app_access_lock);
	if (ret == 0) {
	if (ret == 0) {
		kzfree(data);
		kzfree(data);
		kzfree(*handle);
		kzfree(*handle);
		kzfree(kclient);
		kzfree(kclient);
		*handle = NULL;
		*handle = NULL;
	}
	}

	return ret;
	return ret;
}
}
EXPORT_SYMBOL(qseecom_shutdown_app);
EXPORT_SYMBOL(qseecom_shutdown_app);
@@ -3550,9 +3563,8 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data,
				&qseecom.registered_app_list_lock, flags);
				&qseecom.registered_app_list_lock, flags);
		data->client.app_id = ret;
		data->client.app_id = ret;
		query_req.app_id = ret;
		query_req.app_id = ret;
		memset((void *)data->client.app_name, 0, MAX_APP_NAME_SIZE);
		memcpy(data->client.app_name, query_req.app_name,
		memcpy((void *)data->client.app_name,
				MAX_APP_NAME_SIZE);
				(void *)query_req.app_name, MAX_APP_NAME_SIZE);
		if (copy_to_user(argp, &query_req, sizeof(query_req))) {
		if (copy_to_user(argp, &query_req, sizeof(query_req))) {
			pr_err("copy_to_user failed\n");
			pr_err("copy_to_user failed\n");
			return -EFAULT;
			return -EFAULT;