diff --git a/Makefile b/Makefile index 941788097c8d92fa87a3c272f918ea653d583e0c..f9f1e165eac9b9fd0a96e4b0a3559a086a2c8eb7 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ EXTRA_CFLAGS += -DTEECD_PATH_UID_AUTH_CTX=\"/usr/bin/teecd:0\" EXTRA_CFLAGS += -DCONFIG_AUTH_SUPPORT_UNAME -DCONFIG_AUTH_HASH -std=gnu99 EXTRA_CFLAGS += -DCONFIG_TEE_UPGRADE -DCONFIG_TEE_REBOOT -DCONFIG_CONFIDENTIAL_TEE EXTRA_CFLAGS += -I$(PWD)/tzdriver_internal/tee_reboot -EXTRA_CFLAGS += -DMAILBOX_POOL_COUNT=8 +EXTRA_CFLAGS += -DMAILBOX_POOL_COUNT=32 all: make -C $(KDIR) M=$(PWD) modules clean: diff --git a/core/agent.c b/core/agent.c index cae297bc134869f39045db43ef9ff42195f0385b..5918a8d82939630b5b154ce885fc56eca2838ef0 100644 --- a/core/agent.c +++ b/core/agent.c @@ -53,6 +53,7 @@ #include "ko_adapt.h" #include "internal_functions.h" #include "auth_base_impl.h" +#include "tee_compat_check.h" #ifdef CONFIG_CMS_CAHASH_AUTH #define HASH_FILE_MAX_SIZE CONFIG_HASH_FILE_SIZE @@ -808,8 +809,9 @@ err_out: static bool is_valid_agent(unsigned int agent_id, unsigned int buffer_size, bool user_agent) { + unsigned int agent_buffer_threshold = is_ccos() ? SZ_512K : SZ_4K; (void)agent_id; - if (user_agent && (buffer_size > SZ_4K)) { + if (user_agent && (buffer_size > agent_buffer_threshold)) { tloge("size: %u of user agent's shared mem is invalid\n", buffer_size); return false; diff --git a/core/smc_smp.c b/core/smc_smp.c index 53139bc898dc3d74c56d9eade30d00336e194b17..8284d3f3948e49c911643a3ae9adb4d8181efd8f 100644 --- a/core/smc_smp.c +++ b/core/smc_smp.c @@ -1809,6 +1809,8 @@ static int smc_svc_thread_fn(void *arg) smc_cmd.cmd_id = GLOBAL_CMD_ID_SET_SERVE_CMD; ret = smp_smc_send_func(&smc_cmd, false); tlogd("smc svc return 0x%x\n", ret); + /* add schedule to avoid upgrading or rebooting soft lockup */ + cond_resched(); } tloge("smc svc thread stop\n"); return 0; diff --git a/core/tc_client_driver.c b/core/tc_client_driver.c index efe4906cd4b1254adc5c09564b654a1b065c4f1d..9cb052c09e60d09b389b728a7cd59aa381d9d0aa 100644 --- a/core/tc_client_driver.c +++ b/core/tc_client_driver.c @@ -92,7 +92,7 @@ #endif #include "tee_info.h" - +#include "tee_compat_check.h" static struct class *g_driver_class; static struct device_node *g_dev_node; @@ -700,6 +700,19 @@ static int ioctl_check_agent_owner(const struct tc_ns_dev_file *dev_file, return 0; } +static int ioctl_check_is_ccos(void __user *argp) +{ + int ret = 0; + unsigned int check_ccos = is_ccos() ? 1 : 0; + if (!argp) { + tloge("error input parameter\n"); + return -EINVAL; + } + if (copy_to_user(argp, &check_ccos, sizeof(unsigned int)) != 0) + ret = -EFAULT; + return ret; +} + /* ioctls for the secure storage daemon */ int public_ioctl(const struct file *file, unsigned int cmd, unsigned long arg, bool is_from_client_node) { @@ -738,8 +751,11 @@ int public_ioctl(const struct file *file, unsigned int cmd, unsigned long arg, b case TC_NS_CLIENT_IOCTL_LOAD_APP_REQ: ret = tc_ns_load_secfile(file->private_data, argp, NULL, is_from_client_node); break; + case TC_NS_CLIENT_IOCTL_CHECK_CCOS: + ret = ioctl_check_is_ccos(argp); + break; default: - tloge("invalid cmd!"); + tloge("invalid cmd! 0x%x\n", cmd); return ret; } tlogd("client ioctl ret = 0x%x\n", ret); diff --git a/tc_ns_client.h b/tc_ns_client.h index bb6614649020b81d00d1c8712cc84b27176b4252..1152a3285f3b5a7eac0a8191ff95d843e221ea4d 100644 --- a/tc_ns_client.h +++ b/tc_ns_client.h @@ -209,4 +209,8 @@ struct tc_ns_log_pool { #endif #define TC_NS_CLIENT_IOCTL_GET_TEE_INFO \ _IOWR(TC_NS_CLIENT_IOC_MAGIC, 26, struct tc_ns_tee_info) + +#define TC_NS_CLIENT_IOCTL_CHECK_CCOS \ + _IOWR(TC_NS_CLIENT_IOC_MAGIC, 32, unsigned int) + #endif