mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-09 13:49:24 -04:00
Merge "qseecom: add compat_qseecom to support 32bit process"
This commit is contained in:
commit
2648fff13a
4 changed files with 1266 additions and 2 deletions
|
|
@ -58,4 +58,6 @@ obj-$(CONFIG_PVPANIC) += pvpanic.o
|
|||
obj-$(CONFIG_HABANA_AI) += habanalabs/
|
||||
obj-$(CONFIG_XILINX_SDFEC) += xilinx_sdfec.o
|
||||
obj-$(CONFIG_UID_SYS_STATS) += uid_sys_stats.o
|
||||
obj-$(CONFIG_QSEECOM) += qseecom.o
|
||||
obj-$(CONFIG_QSEECOM) += qseecom-mod.o
|
||||
qseecom-mod-y := qseecom.o
|
||||
qseecom-mod-$(CONFIG_COMPAT) += compat_qseecom.o
|
||||
|
|
|
|||
920
drivers/misc/compat_qseecom.c
Normal file
920
drivers/misc/compat_qseecom.c
Normal file
|
|
@ -0,0 +1,920 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014-2018, 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/qseecom.h>
|
||||
#include <linux/compat.h>
|
||||
#include "compat_qseecom.h"
|
||||
|
||||
static int compat_get_qseecom_register_listener_req(
|
||||
struct compat_qseecom_register_listener_req __user *data32,
|
||||
struct qseecom_register_listener_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_ulong_t listener_id;
|
||||
compat_long_t ifd_data_fd;
|
||||
compat_uptr_t virt_sb_base;
|
||||
compat_ulong_t sb_size;
|
||||
|
||||
err = get_user(listener_id, &data32->listener_id);
|
||||
err |= put_user(listener_id, &data->listener_id);
|
||||
err |= get_user(ifd_data_fd, &data32->ifd_data_fd);
|
||||
err |= put_user(ifd_data_fd, &data->ifd_data_fd);
|
||||
|
||||
err |= get_user(virt_sb_base, &data32->virt_sb_base);
|
||||
/* upper bits won't get set, zero them */
|
||||
err |= put_user(NULL, &data->virt_sb_base);
|
||||
err |= put_user(virt_sb_base,
|
||||
(compat_uptr_t __user *)&data->virt_sb_base);
|
||||
|
||||
err |= get_user(sb_size, &data32->sb_size);
|
||||
err |= put_user(sb_size, &data->sb_size);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_load_img_req(
|
||||
struct compat_qseecom_load_img_req __user *data32,
|
||||
struct qseecom_load_img_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_ulong_t mdt_len;
|
||||
compat_ulong_t img_len;
|
||||
compat_long_t ifd_data_fd;
|
||||
compat_ulong_t app_arch;
|
||||
compat_uint_t app_id;
|
||||
|
||||
err = get_user(mdt_len, &data32->mdt_len);
|
||||
err |= put_user(mdt_len, &data->mdt_len);
|
||||
err |= get_user(img_len, &data32->img_len);
|
||||
err |= put_user(img_len, &data->img_len);
|
||||
err |= get_user(ifd_data_fd, &data32->ifd_data_fd);
|
||||
err |= put_user(ifd_data_fd, &data->ifd_data_fd);
|
||||
err |= copy_in_user(data->img_name, data32->img_name,
|
||||
MAX_APP_NAME_SIZE);
|
||||
err |= get_user(app_arch, &data32->app_arch);
|
||||
err |= put_user(app_arch, &data->app_arch);
|
||||
err |= get_user(app_id, &data32->app_id);
|
||||
err |= put_user(app_id, &data->app_id);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_send_cmd_req(
|
||||
struct compat_qseecom_send_cmd_req __user *data32,
|
||||
struct qseecom_send_cmd_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_uptr_t cmd_req_buf;
|
||||
compat_uint_t cmd_req_len;
|
||||
compat_uptr_t resp_buf;
|
||||
compat_uint_t resp_len;
|
||||
|
||||
err = get_user(cmd_req_buf, &data32->cmd_req_buf);
|
||||
err |= put_user(NULL, &data->cmd_req_buf);
|
||||
err |= put_user(cmd_req_buf,
|
||||
(compat_uptr_t __user *)&data->cmd_req_buf);
|
||||
err |= get_user(cmd_req_len, &data32->cmd_req_len);
|
||||
err |= put_user(cmd_req_len, &data->cmd_req_len);
|
||||
|
||||
err |= get_user(resp_buf, &data32->resp_buf);
|
||||
err |= put_user(NULL, &data->resp_buf);
|
||||
err |= put_user(resp_buf, (compat_uptr_t __user *)&data->resp_buf);
|
||||
err |= get_user(resp_len, &data32->resp_len);
|
||||
err |= put_user(resp_len, &data->resp_len);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_send_modfd_cmd_req(
|
||||
struct compat_qseecom_send_modfd_cmd_req __user *data32,
|
||||
struct qseecom_send_modfd_cmd_req __user *data)
|
||||
{
|
||||
int err;
|
||||
unsigned int i;
|
||||
compat_uptr_t cmd_req_buf;
|
||||
compat_uint_t cmd_req_len;
|
||||
compat_uptr_t resp_buf;
|
||||
compat_uint_t resp_len;
|
||||
compat_long_t fd;
|
||||
compat_ulong_t cmd_buf_offset;
|
||||
|
||||
err = get_user(cmd_req_buf, &data32->cmd_req_buf);
|
||||
err |= put_user(NULL, &data->cmd_req_buf);
|
||||
err |= put_user(cmd_req_buf,
|
||||
(compat_uptr_t __user *)&data->cmd_req_buf);
|
||||
err |= get_user(cmd_req_len, &data32->cmd_req_len);
|
||||
err |= put_user(cmd_req_len, &data->cmd_req_len);
|
||||
err |= get_user(resp_buf, &data32->resp_buf);
|
||||
err |= put_user(NULL, &data->resp_buf);
|
||||
err |= put_user(resp_buf, (compat_uptr_t __user *)&data->resp_buf);
|
||||
err |= get_user(resp_len, &data32->resp_len);
|
||||
err |= put_user(resp_len, &data->resp_len);
|
||||
for (i = 0; i < MAX_ION_FD; i++) {
|
||||
err |= get_user(fd, &data32->ifd_data[i].fd);
|
||||
err |= put_user(fd, &data->ifd_data[i].fd);
|
||||
err |= get_user(cmd_buf_offset,
|
||||
&data32->ifd_data[i].cmd_buf_offset);
|
||||
err |= put_user(cmd_buf_offset,
|
||||
&data->ifd_data[i].cmd_buf_offset);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_set_sb_mem_param_req(
|
||||
struct compat_qseecom_set_sb_mem_param_req __user *data32,
|
||||
struct qseecom_set_sb_mem_param_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_long_t ifd_data_fd;
|
||||
compat_uptr_t virt_sb_base;
|
||||
compat_ulong_t sb_len;
|
||||
|
||||
err = get_user(ifd_data_fd, &data32->ifd_data_fd);
|
||||
err |= put_user(ifd_data_fd, &data->ifd_data_fd);
|
||||
err |= get_user(virt_sb_base, &data32->virt_sb_base);
|
||||
err |= put_user(NULL, &data->virt_sb_base);
|
||||
err |= put_user(virt_sb_base,
|
||||
(compat_uptr_t __user *)&data->virt_sb_base);
|
||||
err |= get_user(sb_len, &data32->sb_len);
|
||||
err |= put_user(sb_len, &data->sb_len);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_qseos_version_req(
|
||||
struct compat_qseecom_qseos_version_req __user *data32,
|
||||
struct qseecom_qseos_version_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_uint_t qseos_version;
|
||||
|
||||
err = get_user(qseos_version, &data32->qseos_version);
|
||||
err |= put_user(qseos_version, &data->qseos_version);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_qseos_app_load_query(
|
||||
struct compat_qseecom_qseos_app_load_query __user *data32,
|
||||
struct qseecom_qseos_app_load_query __user *data)
|
||||
{
|
||||
int err = 0;
|
||||
unsigned int i;
|
||||
compat_uint_t app_id;
|
||||
char app_name;
|
||||
compat_ulong_t app_arch;
|
||||
|
||||
for (i = 0; i < MAX_APP_NAME_SIZE; i++) {
|
||||
err |= get_user(app_name, &(data32->app_name[i]));
|
||||
err |= put_user(app_name, &(data->app_name[i]));
|
||||
}
|
||||
err |= get_user(app_id, &data32->app_id);
|
||||
err |= put_user(app_id, &data->app_id);
|
||||
err |= get_user(app_arch, &data32->app_arch);
|
||||
err |= put_user(app_arch, &data->app_arch);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_send_svc_cmd_req(
|
||||
struct compat_qseecom_send_svc_cmd_req __user *data32,
|
||||
struct qseecom_send_svc_cmd_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_ulong_t cmd_id;
|
||||
compat_uptr_t cmd_req_buf;
|
||||
compat_uint_t cmd_req_len;
|
||||
compat_uptr_t resp_buf;
|
||||
compat_uint_t resp_len;
|
||||
|
||||
err = get_user(cmd_id, &data32->cmd_id);
|
||||
err |= put_user(cmd_id, &data->cmd_id);
|
||||
err |= get_user(cmd_req_buf, &data32->cmd_req_buf);
|
||||
err |= put_user(NULL, &data->cmd_req_buf);
|
||||
err |= put_user(cmd_req_buf,
|
||||
(compat_uptr_t __user *)&data->cmd_req_buf);
|
||||
err |= get_user(cmd_req_len, &data32->cmd_req_len);
|
||||
err |= put_user(cmd_req_len, &data->cmd_req_len);
|
||||
err |= get_user(resp_buf, &data32->resp_buf);
|
||||
err |= put_user(NULL, &data->resp_buf);
|
||||
err |= put_user(resp_buf, (compat_uptr_t __user *)&data->resp_buf);
|
||||
err |= get_user(resp_len, &data32->resp_len);
|
||||
err |= put_user(resp_len, &data->resp_len);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_create_key_req(
|
||||
struct compat_qseecom_create_key_req __user *data32,
|
||||
struct qseecom_create_key_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_uint_t usage;
|
||||
|
||||
err = copy_in_user(data->hash32, data32->hash32, QSEECOM_HASH_SIZE);
|
||||
err |= get_user(usage, &data32->usage);
|
||||
err |= put_user(usage, &data->usage);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_wipe_key_req(
|
||||
struct compat_qseecom_wipe_key_req __user *data32,
|
||||
struct qseecom_wipe_key_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_uint_t usage;
|
||||
compat_int_t wipe_key_flag;
|
||||
|
||||
err = get_user(usage, &data32->usage);
|
||||
err |= put_user(usage, &data->usage);
|
||||
err |= get_user(wipe_key_flag, &data32->wipe_key_flag);
|
||||
err |= put_user(wipe_key_flag, &data->wipe_key_flag);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_update_key_userinfo_req(
|
||||
struct compat_qseecom_update_key_userinfo_req __user *data32,
|
||||
struct qseecom_update_key_userinfo_req __user *data)
|
||||
{
|
||||
int err = 0;
|
||||
compat_uint_t usage;
|
||||
|
||||
err = copy_in_user(data->current_hash32, data32->current_hash32,
|
||||
QSEECOM_HASH_SIZE);
|
||||
err |= copy_in_user(data->new_hash32, data32->new_hash32,
|
||||
QSEECOM_HASH_SIZE);
|
||||
err |= get_user(usage, &data32->usage);
|
||||
err |= put_user(usage, &data->usage);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_save_partition_hash_req(
|
||||
struct compat_qseecom_save_partition_hash_req __user *data32,
|
||||
struct qseecom_save_partition_hash_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_int_t partition_id;
|
||||
|
||||
err = get_user(partition_id, &data32->partition_id);
|
||||
err |= put_user(partition_id, &data->partition_id);
|
||||
err |= copy_in_user(data->digest, data32->digest,
|
||||
SHA256_DIGEST_LENGTH);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_is_es_activated_req(
|
||||
struct compat_qseecom_is_es_activated_req __user *data32,
|
||||
struct qseecom_is_es_activated_req __user *data)
|
||||
{
|
||||
compat_int_t is_activated;
|
||||
int err;
|
||||
|
||||
err = get_user(is_activated, &data32->is_activated);
|
||||
err |= put_user(is_activated, &data->is_activated);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_mdtp_cipher_dip_req(
|
||||
struct compat_qseecom_mdtp_cipher_dip_req __user *data32,
|
||||
struct qseecom_mdtp_cipher_dip_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_int_t in_buf_size;
|
||||
compat_uptr_t in_buf;
|
||||
compat_int_t out_buf_size;
|
||||
compat_uptr_t out_buf;
|
||||
compat_int_t direction;
|
||||
|
||||
err = get_user(in_buf_size, &data32->in_buf_size);
|
||||
err |= put_user(in_buf_size, &data->in_buf_size);
|
||||
err |= get_user(out_buf_size, &data32->out_buf_size);
|
||||
err |= put_user(out_buf_size, &data->out_buf_size);
|
||||
err |= get_user(direction, &data32->direction);
|
||||
err |= put_user(direction, &data->direction);
|
||||
err |= get_user(in_buf, &data32->in_buf);
|
||||
err |= put_user(NULL, &data->in_buf);
|
||||
err |= put_user(in_buf, (compat_uptr_t __user *)&data->in_buf);
|
||||
err |= get_user(out_buf, &data32->out_buf);
|
||||
err |= put_user(NULL, &data->out_buf);
|
||||
err |= put_user(out_buf, (compat_uptr_t __user *)&data->out_buf);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_send_modfd_listener_resp(
|
||||
struct compat_qseecom_send_modfd_listener_resp __user *data32,
|
||||
struct qseecom_send_modfd_listener_resp __user *data)
|
||||
{
|
||||
int err;
|
||||
unsigned int i;
|
||||
compat_uptr_t resp_buf_ptr;
|
||||
compat_uint_t resp_len;
|
||||
compat_long_t fd;
|
||||
compat_ulong_t cmd_buf_offset;
|
||||
|
||||
err = get_user(resp_buf_ptr, &data32->resp_buf_ptr);
|
||||
err |= put_user(NULL, &data->resp_buf_ptr);
|
||||
err |= put_user(resp_buf_ptr,
|
||||
(compat_uptr_t __user *)&data->resp_buf_ptr);
|
||||
err |= get_user(resp_len, &data32->resp_len);
|
||||
err |= put_user(resp_len, &data->resp_len);
|
||||
|
||||
for (i = 0; i < MAX_ION_FD; i++) {
|
||||
err |= get_user(fd, &data32->ifd_data[i].fd);
|
||||
err |= put_user(fd, &data->ifd_data[i].fd);
|
||||
err |= get_user(cmd_buf_offset,
|
||||
&data32->ifd_data[i].cmd_buf_offset);
|
||||
err |= put_user(cmd_buf_offset,
|
||||
&data->ifd_data[i].cmd_buf_offset);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static int compat_get_qseecom_qteec_req(
|
||||
struct compat_qseecom_qteec_req __user *data32,
|
||||
struct qseecom_qteec_req __user *data)
|
||||
{
|
||||
compat_uptr_t req_ptr;
|
||||
compat_ulong_t req_len;
|
||||
compat_uptr_t resp_ptr;
|
||||
compat_ulong_t resp_len;
|
||||
int err;
|
||||
|
||||
err = get_user(req_ptr, &data32->req_ptr);
|
||||
err |= put_user(NULL, &data->req_ptr);
|
||||
err |= put_user(req_ptr, (compat_uptr_t __user *)&data->req_ptr);
|
||||
err |= get_user(req_len, &data32->req_len);
|
||||
err |= put_user(req_len, &data->req_len);
|
||||
|
||||
err |= get_user(resp_ptr, &data32->resp_ptr);
|
||||
err |= put_user(NULL, &data->resp_ptr);
|
||||
err |= put_user(resp_ptr, (compat_uptr_t __user *)&data->resp_ptr);
|
||||
err |= get_user(resp_len, &data32->resp_len);
|
||||
err |= put_user(resp_len, &data->resp_len);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_qseecom_qteec_modfd_req(
|
||||
struct compat_qseecom_qteec_modfd_req __user *data32,
|
||||
struct qseecom_qteec_modfd_req __user *data)
|
||||
{
|
||||
compat_uptr_t req_ptr;
|
||||
compat_ulong_t req_len;
|
||||
compat_uptr_t resp_ptr;
|
||||
compat_ulong_t resp_len;
|
||||
compat_long_t fd;
|
||||
compat_ulong_t cmd_buf_offset;
|
||||
int err, i;
|
||||
|
||||
err = get_user(req_ptr, &data32->req_ptr);
|
||||
err |= put_user(NULL, &data->req_ptr);
|
||||
err |= put_user(req_ptr, (compat_uptr_t __user *)&data->req_ptr);
|
||||
err |= get_user(req_len, &data32->req_len);
|
||||
err |= put_user(req_len, &data->req_len);
|
||||
|
||||
err |= get_user(resp_ptr, &data32->resp_ptr);
|
||||
err |= put_user(NULL, &data->resp_ptr);
|
||||
err |= put_user(resp_ptr, (compat_uptr_t __user *)&data->resp_ptr);
|
||||
err |= get_user(resp_len, &data32->resp_len);
|
||||
err |= put_user(resp_len, &data->resp_len);
|
||||
|
||||
for (i = 0; i < MAX_ION_FD; i++) {
|
||||
err |= get_user(fd, &data32->ifd_data[i].fd);
|
||||
err |= put_user(fd, &data->ifd_data[i].fd);
|
||||
err |= get_user(cmd_buf_offset,
|
||||
&data32->ifd_data[i].cmd_buf_offset);
|
||||
err |= put_user(cmd_buf_offset,
|
||||
&data->ifd_data[i].cmd_buf_offset);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_int(compat_int_t __user *data32,
|
||||
int __user *data)
|
||||
{
|
||||
compat_int_t x;
|
||||
int err;
|
||||
|
||||
err = get_user(x, data32);
|
||||
err |= put_user(x, data);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_put_qseecom_load_img_req(
|
||||
struct compat_qseecom_load_img_req __user *data32,
|
||||
struct qseecom_load_img_req __user *data)
|
||||
{
|
||||
int err;
|
||||
compat_ulong_t mdt_len;
|
||||
compat_ulong_t img_len;
|
||||
compat_long_t ifd_data_fd;
|
||||
compat_ulong_t app_arch;
|
||||
compat_int_t app_id;
|
||||
|
||||
err = get_user(mdt_len, &data->mdt_len);
|
||||
err |= put_user(mdt_len, &data32->mdt_len);
|
||||
err |= get_user(img_len, &data->img_len);
|
||||
err |= put_user(img_len, &data32->img_len);
|
||||
err |= get_user(ifd_data_fd, &data->ifd_data_fd);
|
||||
err |= put_user(ifd_data_fd, &data32->ifd_data_fd);
|
||||
err |= copy_in_user(data32->img_name, data->img_name,
|
||||
MAX_APP_NAME_SIZE);
|
||||
err |= get_user(app_arch, &data->app_arch);
|
||||
err |= put_user(app_arch, &data32->app_arch);
|
||||
err |= get_user(app_id, &data->app_id);
|
||||
err |= put_user(app_id, &data32->app_id);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_put_qseecom_qseos_version_req(
|
||||
struct compat_qseecom_qseos_version_req __user *data32,
|
||||
struct qseecom_qseos_version_req __user *data)
|
||||
{
|
||||
compat_uint_t qseos_version;
|
||||
int err;
|
||||
|
||||
err = get_user(qseos_version, &data->qseos_version);
|
||||
err |= put_user(qseos_version, &data32->qseos_version);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_put_qseecom_qseos_app_load_query(
|
||||
struct compat_qseecom_qseos_app_load_query __user *data32,
|
||||
struct qseecom_qseos_app_load_query __user *data)
|
||||
{
|
||||
int err = 0;
|
||||
unsigned int i;
|
||||
compat_int_t app_id;
|
||||
compat_ulong_t app_arch;
|
||||
char app_name;
|
||||
|
||||
for (i = 0; i < MAX_APP_NAME_SIZE; i++) {
|
||||
err |= get_user(app_name, &(data->app_name[i]));
|
||||
err |= put_user(app_name, &(data32->app_name[i]));
|
||||
}
|
||||
err |= get_user(app_id, &data->app_id);
|
||||
err |= put_user(app_id, &data32->app_id);
|
||||
err |= get_user(app_arch, &data->app_arch);
|
||||
err |= put_user(app_arch, &data32->app_arch);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_put_qseecom_is_es_activated_req(
|
||||
struct compat_qseecom_is_es_activated_req __user *data32,
|
||||
struct qseecom_is_es_activated_req __user *data)
|
||||
{
|
||||
compat_int_t is_activated;
|
||||
int err;
|
||||
|
||||
err = get_user(is_activated, &data->is_activated);
|
||||
err |= put_user(is_activated, &data32->is_activated);
|
||||
return err;
|
||||
}
|
||||
|
||||
static unsigned int convert_cmd(unsigned int cmd)
|
||||
{
|
||||
switch (cmd) {
|
||||
case COMPAT_QSEECOM_IOCTL_REGISTER_LISTENER_REQ:
|
||||
return QSEECOM_IOCTL_REGISTER_LISTENER_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ:
|
||||
return QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_LOAD_APP_REQ:
|
||||
return QSEECOM_IOCTL_LOAD_APP_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_RECEIVE_REQ:
|
||||
return QSEECOM_IOCTL_RECEIVE_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_RESP_REQ:
|
||||
return QSEECOM_IOCTL_SEND_RESP_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_UNLOAD_APP_REQ:
|
||||
return QSEECOM_IOCTL_UNLOAD_APP_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_PERF_ENABLE_REQ:
|
||||
return QSEECOM_IOCTL_PERF_ENABLE_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_PERF_DISABLE_REQ:
|
||||
return QSEECOM_IOCTL_PERF_DISABLE_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ:
|
||||
return QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SET_BUS_SCALING_REQ:
|
||||
return QSEECOM_IOCTL_SET_BUS_SCALING_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_CMD_REQ:
|
||||
return QSEECOM_IOCTL_SEND_CMD_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_REQ:
|
||||
return QSEECOM_IOCTL_SEND_MODFD_CMD_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SET_MEM_PARAM_REQ:
|
||||
return QSEECOM_IOCTL_SET_MEM_PARAM_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ:
|
||||
return QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ:
|
||||
return QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_APP_LOADED_QUERY_REQ:
|
||||
return QSEECOM_IOCTL_APP_LOADED_QUERY_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ:
|
||||
return QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_CREATE_KEY_REQ:
|
||||
return QSEECOM_IOCTL_CREATE_KEY_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_WIPE_KEY_REQ:
|
||||
return QSEECOM_IOCTL_WIPE_KEY_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ:
|
||||
return QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ:
|
||||
return QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ:
|
||||
return QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP:
|
||||
return QSEECOM_IOCTL_SEND_MODFD_RESP;
|
||||
case COMPAT_QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ:
|
||||
return QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ;
|
||||
case COMPAT_QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ:
|
||||
return QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ;
|
||||
case COMPAT_QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ:
|
||||
return QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ;
|
||||
case COMPAT_QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ:
|
||||
return QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ:
|
||||
return QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ:
|
||||
return QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP_64:
|
||||
return QSEECOM_IOCTL_SEND_MODFD_RESP_64;
|
||||
|
||||
default:
|
||||
return cmd;
|
||||
}
|
||||
}
|
||||
|
||||
long compat_qseecom_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
long ret;
|
||||
|
||||
switch (cmd) {
|
||||
|
||||
case COMPAT_QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ:
|
||||
case COMPAT_QSEECOM_IOCTL_RECEIVE_REQ:
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_RESP_REQ:
|
||||
case COMPAT_QSEECOM_IOCTL_UNLOAD_APP_REQ:
|
||||
case COMPAT_QSEECOM_IOCTL_PERF_ENABLE_REQ:
|
||||
case COMPAT_QSEECOM_IOCTL_PERF_DISABLE_REQ:
|
||||
case COMPAT_QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ: {
|
||||
return qseecom_ioctl(file, convert_cmd(cmd), 0);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_REGISTER_LISTENER_REQ: {
|
||||
struct compat_qseecom_register_listener_req __user *data32;
|
||||
struct qseecom_register_listener_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_register_listener_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_LOAD_APP_REQ: {
|
||||
struct compat_qseecom_load_img_req __user *data32;
|
||||
struct qseecom_load_img_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_load_img_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
ret = qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
err = compat_put_qseecom_load_img_req(data32, data);
|
||||
return ret ? ret : err;
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_CMD_REQ: {
|
||||
struct compat_qseecom_send_cmd_req __user *data32;
|
||||
struct qseecom_send_cmd_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_send_cmd_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_REQ:
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ: {
|
||||
struct compat_qseecom_send_modfd_cmd_req __user *data32;
|
||||
struct qseecom_send_modfd_cmd_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_send_modfd_cmd_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_SET_MEM_PARAM_REQ: {
|
||||
struct compat_qseecom_set_sb_mem_param_req __user *data32;
|
||||
struct qseecom_set_sb_mem_param_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_set_sb_mem_param_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ: {
|
||||
struct compat_qseecom_qseos_version_req __user *data32;
|
||||
struct qseecom_qseos_version_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_qseos_version_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
ret = qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
err = compat_put_qseecom_qseos_version_req(data32, data);
|
||||
|
||||
return ret ? ret : err;
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_SET_BUS_SCALING_REQ: {
|
||||
compat_int_t __user *data32;
|
||||
int __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
err = compat_get_int(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ: {
|
||||
struct compat_qseecom_load_img_req __user *data32;
|
||||
struct qseecom_load_img_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_load_img_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_APP_LOADED_QUERY_REQ: {
|
||||
struct compat_qseecom_qseos_app_load_query __user *data32;
|
||||
struct qseecom_qseos_app_load_query __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_qseos_app_load_query(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
ret = qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
err = compat_put_qseecom_qseos_app_load_query(data32, data);
|
||||
return ret ? ret : err;
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ: {
|
||||
struct compat_qseecom_send_svc_cmd_req __user *data32;
|
||||
struct qseecom_send_svc_cmd_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_send_svc_cmd_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_CREATE_KEY_REQ: {
|
||||
struct compat_qseecom_create_key_req __user *data32;
|
||||
struct qseecom_create_key_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_create_key_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_WIPE_KEY_REQ: {
|
||||
struct compat_qseecom_wipe_key_req __user *data32;
|
||||
struct qseecom_wipe_key_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_wipe_key_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ: {
|
||||
struct compat_qseecom_update_key_userinfo_req __user *data32;
|
||||
struct qseecom_update_key_userinfo_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_update_key_userinfo_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ: {
|
||||
struct compat_qseecom_save_partition_hash_req __user *data32;
|
||||
struct qseecom_save_partition_hash_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_save_partition_hash_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ: {
|
||||
struct compat_qseecom_is_es_activated_req __user *data32;
|
||||
struct qseecom_is_es_activated_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_is_es_activated_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
ret = qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
err = compat_put_qseecom_is_es_activated_req(data32, data);
|
||||
return ret ? ret : err;
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ: {
|
||||
struct compat_qseecom_mdtp_cipher_dip_req __user *data32;
|
||||
struct qseecom_mdtp_cipher_dip_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_mdtp_cipher_dip_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP:
|
||||
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP_64: {
|
||||
struct compat_qseecom_send_modfd_listener_resp __user *data32;
|
||||
struct qseecom_send_modfd_listener_resp __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_send_modfd_listener_resp(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ: {
|
||||
struct compat_qseecom_qteec_req __user *data32;
|
||||
struct qseecom_qteec_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_qteec_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
case COMPAT_QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ:
|
||||
case COMPAT_QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ:
|
||||
case COMPAT_QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ: {
|
||||
struct compat_qseecom_qteec_modfd_req __user *data32;
|
||||
struct qseecom_qteec_modfd_req __user *data;
|
||||
int err;
|
||||
|
||||
data32 = compat_ptr(arg);
|
||||
data = compat_alloc_user_space(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
err = compat_get_qseecom_qteec_modfd_req(data32, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return qseecom_ioctl(file, convert_cmd(cmd),
|
||||
(unsigned long)data);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
340
drivers/misc/compat_qseecom.h
Normal file
340
drivers/misc/compat_qseecom.h
Normal file
|
|
@ -0,0 +1,340 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2017, 2019-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
#ifndef _UAPI_COMPAT_QSEECOM_H_
|
||||
#define _UAPI_COMPAT_QSEECOM_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioctl.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_COMPAT)
|
||||
#include <linux/compat.h>
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_register_listener_req -
|
||||
* for register listener ioctl request
|
||||
* @listener_id - service id (shared between userspace and QSE)
|
||||
* @ifd_data_fd - ion handle
|
||||
* @virt_sb_base - shared buffer base in user space
|
||||
* @sb_size - shared buffer size
|
||||
*/
|
||||
struct compat_qseecom_register_listener_req {
|
||||
compat_ulong_t listener_id; /* in */
|
||||
compat_long_t ifd_data_fd; /* in */
|
||||
compat_uptr_t virt_sb_base; /* in */
|
||||
compat_ulong_t sb_size; /* in */
|
||||
};
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_send_cmd_req - for send command ioctl request
|
||||
* @cmd_req_len - command buffer length
|
||||
* @cmd_req_buf - command buffer
|
||||
* @resp_len - response buffer length
|
||||
* @resp_buf - response buffer
|
||||
*/
|
||||
struct compat_qseecom_send_cmd_req {
|
||||
compat_uptr_t cmd_req_buf; /* in */
|
||||
compat_uint_t cmd_req_len; /* in */
|
||||
compat_uptr_t resp_buf; /* in/out */
|
||||
compat_uint_t resp_len; /* in/out */
|
||||
};
|
||||
|
||||
/*
|
||||
* struct qseecom_ion_fd_info - ion fd handle data information
|
||||
* @fd - ion handle to some memory allocated in user space
|
||||
* @cmd_buf_offset - command buffer offset
|
||||
*/
|
||||
struct compat_qseecom_ion_fd_info {
|
||||
compat_long_t fd;
|
||||
compat_ulong_t cmd_buf_offset;
|
||||
};
|
||||
/*
|
||||
* struct qseecom_send_modfd_cmd_req - for send command ioctl request
|
||||
* @cmd_req_len - command buffer length
|
||||
* @cmd_req_buf - command buffer
|
||||
* @resp_len - response buffer length
|
||||
* @resp_buf - response buffer
|
||||
* @ifd_data_fd - ion handle to memory allocated in user space
|
||||
* @cmd_buf_offset - command buffer offset
|
||||
*/
|
||||
struct compat_qseecom_send_modfd_cmd_req {
|
||||
compat_uptr_t cmd_req_buf; /* in */
|
||||
compat_uint_t cmd_req_len; /* in */
|
||||
compat_uptr_t resp_buf; /* in/out */
|
||||
compat_uint_t resp_len; /* in/out */
|
||||
struct compat_qseecom_ion_fd_info ifd_data[MAX_ION_FD];
|
||||
};
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_listener_send_resp_req
|
||||
* signal to continue the send_cmd req.
|
||||
* Used as a trigger from HLOS service to notify QSEECOM that it's done with its
|
||||
* operation and provide the response for QSEECOM can continue the incomplete
|
||||
* command execution
|
||||
* @resp_len - Length of the response
|
||||
* @resp_buf - Response buffer where the response of the cmd should go.
|
||||
*/
|
||||
struct compat_qseecom_send_resp_req {
|
||||
compat_uptr_t resp_buf; /* in */
|
||||
compat_uint_t resp_len; /* in */
|
||||
};
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_load_img_data
|
||||
* for sending image length information and
|
||||
* ion file descriptor to the qseecom driver. ion file descriptor is used
|
||||
* for retrieving the ion file handle and in turn the physical address of
|
||||
* the image location.
|
||||
* @mdt_len - Length of the .mdt file in bytes.
|
||||
* @img_len - Length of the .mdt + .b00 +..+.bxx images files in bytes
|
||||
* @ion_fd - Ion file descriptor used when allocating memory.
|
||||
* @img_name - Name of the image.
|
||||
*/
|
||||
struct compat_qseecom_load_img_req {
|
||||
compat_ulong_t mdt_len; /* in */
|
||||
compat_ulong_t img_len; /* in */
|
||||
compat_long_t ifd_data_fd; /* in */
|
||||
char img_name[MAX_APP_NAME_SIZE]; /* in */
|
||||
compat_ulong_t app_arch; /* in */
|
||||
compat_uint_t app_id; /* out*/
|
||||
};
|
||||
|
||||
struct compat_qseecom_set_sb_mem_param_req {
|
||||
compat_long_t ifd_data_fd; /* in */
|
||||
compat_uptr_t virt_sb_base; /* in */
|
||||
compat_ulong_t sb_len; /* in */
|
||||
};
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_qseos_version_req - get qseos version
|
||||
* @qseos_version - version number
|
||||
*/
|
||||
struct compat_qseecom_qseos_version_req {
|
||||
compat_uint_t qseos_version; /* in */
|
||||
};
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_qseos_app_load_query - verify if app is loaded in qsee
|
||||
* @app_name[MAX_APP_NAME_SIZE]- name of the app.
|
||||
* @app_id - app id.
|
||||
*/
|
||||
struct compat_qseecom_qseos_app_load_query {
|
||||
char app_name[MAX_APP_NAME_SIZE]; /* in */
|
||||
compat_uint_t app_id; /* out */
|
||||
compat_ulong_t app_arch;
|
||||
};
|
||||
|
||||
struct compat_qseecom_send_svc_cmd_req {
|
||||
compat_ulong_t cmd_id;
|
||||
compat_uptr_t cmd_req_buf; /* in */
|
||||
compat_uint_t cmd_req_len; /* in */
|
||||
compat_uptr_t resp_buf; /* in/out */
|
||||
compat_uint_t resp_len; /* in/out */
|
||||
};
|
||||
|
||||
struct compat_qseecom_create_key_req {
|
||||
unsigned char hash32[QSEECOM_HASH_SIZE];
|
||||
enum qseecom_key_management_usage_type usage;
|
||||
};
|
||||
|
||||
struct compat_qseecom_wipe_key_req {
|
||||
enum qseecom_key_management_usage_type usage;
|
||||
compat_int_t wipe_key_flag;
|
||||
};
|
||||
|
||||
struct compat_qseecom_update_key_userinfo_req {
|
||||
unsigned char current_hash32[QSEECOM_HASH_SIZE];
|
||||
unsigned char new_hash32[QSEECOM_HASH_SIZE];
|
||||
enum qseecom_key_management_usage_type usage;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_save_partition_hash_req
|
||||
* @partition_id - partition id.
|
||||
* @hash[SHA256_DIGEST_LENGTH] - sha256 digest.
|
||||
*/
|
||||
struct compat_qseecom_save_partition_hash_req {
|
||||
compat_int_t partition_id; /* in */
|
||||
char digest[SHA256_DIGEST_LENGTH]; /* in */
|
||||
};
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_is_es_activated_req
|
||||
* @is_activated - 1=true , 0=false
|
||||
*/
|
||||
struct compat_qseecom_is_es_activated_req {
|
||||
compat_int_t is_activated; /* out */
|
||||
};
|
||||
|
||||
/*
|
||||
* struct compat_qseecom_mdtp_cipher_dip_req
|
||||
* @in_buf - input buffer
|
||||
* @in_buf_size - input buffer size
|
||||
* @out_buf - output buffer
|
||||
* @out_buf_size - output buffer size
|
||||
* @direction - 0=encrypt, 1=decrypt
|
||||
*/
|
||||
struct compat_qseecom_mdtp_cipher_dip_req {
|
||||
compat_uptr_t in_buf;
|
||||
compat_uint_t in_buf_size;
|
||||
compat_uptr_t out_buf;
|
||||
compat_uint_t out_buf_size;
|
||||
compat_uint_t direction;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct qseecom_send_modfd_resp - for send command ioctl request
|
||||
* @req_len - command buffer length
|
||||
* @req_buf - command buffer
|
||||
* @ifd_data_fd - ion handle to memory allocated in user space
|
||||
* @cmd_buf_offset - command buffer offset
|
||||
*/
|
||||
struct compat_qseecom_send_modfd_listener_resp {
|
||||
compat_uptr_t resp_buf_ptr; /* in */
|
||||
compat_uint_t resp_len; /* in */
|
||||
struct compat_qseecom_ion_fd_info ifd_data[MAX_ION_FD]; /* in */
|
||||
};
|
||||
|
||||
struct compat_qseecom_qteec_req {
|
||||
compat_uptr_t req_ptr;
|
||||
compat_ulong_t req_len;
|
||||
compat_uptr_t resp_ptr;
|
||||
compat_ulong_t resp_len;
|
||||
};
|
||||
|
||||
struct compat_qseecom_qteec_modfd_req {
|
||||
compat_uptr_t req_ptr;
|
||||
compat_ulong_t req_len;
|
||||
compat_uptr_t resp_ptr;
|
||||
compat_ulong_t resp_len;
|
||||
struct compat_qseecom_ion_fd_info ifd_data[MAX_ION_FD];
|
||||
};
|
||||
|
||||
struct compat_qseecom_ce_pipe_entry {
|
||||
compat_int_t valid;
|
||||
compat_uint_t ce_num;
|
||||
compat_uint_t ce_pipe_pair;
|
||||
};
|
||||
|
||||
struct compat_qseecom_ce_info_req {
|
||||
unsigned char handle[MAX_CE_INFO_HANDLE_SIZE];
|
||||
compat_uint_t usage;
|
||||
compat_uint_t unit_num;
|
||||
compat_uint_t num_ce_pipe_entries;
|
||||
struct compat_qseecom_ce_pipe_entry
|
||||
ce_pipe_entry[MAX_CE_PIPE_PAIR_PER_UNIT];
|
||||
};
|
||||
|
||||
struct file;
|
||||
extern long compat_qseecom_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
extern long qseecom_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_REGISTER_LISTENER_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 1, struct compat_qseecom_register_listener_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ \
|
||||
_IO(QSEECOM_IOC_MAGIC, 2)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SEND_CMD_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 3, struct compat_qseecom_send_cmd_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 4, struct compat_qseecom_send_modfd_cmd_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_RECEIVE_REQ \
|
||||
_IO(QSEECOM_IOC_MAGIC, 5)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SEND_RESP_REQ \
|
||||
_IO(QSEECOM_IOC_MAGIC, 6)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_LOAD_APP_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 7, struct compat_qseecom_load_img_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SET_MEM_PARAM_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 8, struct compat_qseecom_set_sb_mem_param_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_UNLOAD_APP_REQ \
|
||||
_IO(QSEECOM_IOC_MAGIC, 9)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 10, struct compat_qseecom_qseos_version_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_PERF_ENABLE_REQ \
|
||||
_IO(QSEECOM_IOC_MAGIC, 11)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_PERF_DISABLE_REQ \
|
||||
_IO(QSEECOM_IOC_MAGIC, 12)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 13, struct compat_qseecom_load_img_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ \
|
||||
_IO(QSEECOM_IOC_MAGIC, 14)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_APP_LOADED_QUERY_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 15, struct compat_qseecom_qseos_app_load_query)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 16, struct compat_qseecom_send_svc_cmd_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_CREATE_KEY_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 17, struct compat_qseecom_create_key_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_WIPE_KEY_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 18, struct compat_qseecom_wipe_key_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 19, \
|
||||
struct compat_qseecom_save_partition_hash_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 20, struct compat_qseecom_is_es_activated_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 21, \
|
||||
struct compat_qseecom_send_modfd_listener_resp)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SET_BUS_SCALING_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 23, int)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 24, \
|
||||
struct compat_qseecom_update_key_userinfo_req)
|
||||
|
||||
#define COMPAT_QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 30, struct compat_qseecom_qteec_modfd_req)
|
||||
|
||||
#define COMPAT_QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 31, struct compat_qseecom_qteec_req)
|
||||
|
||||
#define COMPAT_QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 32, struct compat_qseecom_qteec_modfd_req)
|
||||
|
||||
#define COMPAT_QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 33, struct compat_qseecom_qteec_modfd_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 34, struct qseecom_mdtp_cipher_dip_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 35, struct compat_qseecom_send_modfd_cmd_req)
|
||||
|
||||
#define COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP_64 \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 36, \
|
||||
struct compat_qseecom_send_modfd_listener_resp)
|
||||
#define COMPAT_QSEECOM_IOCTL_GET_CE_PIPE_INFO \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 40, \
|
||||
struct compat_qseecom_ce_info_req)
|
||||
#define COMPAT_QSEECOM_IOCTL_FREE_CE_PIPE_INFO \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 41, \
|
||||
struct compat_qseecom_ce_info_req)
|
||||
#define COMPAT_QSEECOM_IOCTL_QUERY_CE_PIPE_INFO \
|
||||
_IOWR(QSEECOM_IOC_MAGIC, 42, \
|
||||
struct compat_qseecom_ce_info_req)
|
||||
|
||||
#endif
|
||||
#endif /* _UAPI_COMPAT_QSEECOM_H_ */
|
||||
|
|
@ -48,6 +48,7 @@
|
|||
#include <linux/interconnect.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/qtee_shmbridge.h>
|
||||
#include "compat_qseecom.h"
|
||||
|
||||
#define QSEECOM_DEV "qseecom"
|
||||
#define QSEOS_VERSION_14 0x14
|
||||
|
|
@ -7495,7 +7496,7 @@ static void __qseecom_clean_data_sglistinfo(struct qseecom_dev_handle *data)
|
|||
}
|
||||
}
|
||||
|
||||
static long qseecom_ioctl(struct file *file,
|
||||
long qseecom_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int ret = 0;
|
||||
|
|
@ -8331,6 +8332,7 @@ static int qseecom_release(struct inode *inode, struct file *file)
|
|||
static const struct file_operations qseecom_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.unlocked_ioctl = qseecom_ioctl,
|
||||
.compat_ioctl = compat_qseecom_ioctl,
|
||||
.open = qseecom_open,
|
||||
.release = qseecom_release
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue