1419b0af8Sopenharmony_ci/* 2419b0af8Sopenharmony_ci * teek_ns_client.h 3419b0af8Sopenharmony_ci * 4419b0af8Sopenharmony_ci * define structures and IOCTLs. 5419b0af8Sopenharmony_ci * 6419b0af8Sopenharmony_ci * Copyright (C) 2022 Huawei Technologies Co., Ltd. 7419b0af8Sopenharmony_ci * 8419b0af8Sopenharmony_ci * This software is licensed under the terms of the GNU General Public 9419b0af8Sopenharmony_ci * License version 2, as published by the Free Software Foundation, and 10419b0af8Sopenharmony_ci * may be copied, distributed, and modified under those terms. 11419b0af8Sopenharmony_ci * 12419b0af8Sopenharmony_ci * This program is distributed in the hope that it will be useful, 13419b0af8Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14419b0af8Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15419b0af8Sopenharmony_ci * GNU General Public License for more details. 16419b0af8Sopenharmony_ci */ 17419b0af8Sopenharmony_ci#ifndef TEEK_NS_CLIENT_H 18419b0af8Sopenharmony_ci#define TEEK_NS_CLIENT_H 19419b0af8Sopenharmony_ci 20419b0af8Sopenharmony_ci#include <linux/mutex.h> 21419b0af8Sopenharmony_ci#include <linux/list.h> 22419b0af8Sopenharmony_ci#include <linux/slab.h> 23419b0af8Sopenharmony_ci#include <linux/completion.h> 24419b0af8Sopenharmony_ci#include "tc_ns_client.h" 25419b0af8Sopenharmony_ci#include "tc_ns_log.h" 26419b0af8Sopenharmony_ci 27419b0af8Sopenharmony_ci#define TC_NS_CLIENT_IOC_MAGIC 't' 28419b0af8Sopenharmony_ci#define TC_NS_CLIENT_DEV "tc_ns_client" 29419b0af8Sopenharmony_ci#define TC_PRIV_DEV "tc_private" 30419b0af8Sopenharmony_ci#define TC_NS_CLIENT_DEV_NAME "/dev/tc_ns_client" 31419b0af8Sopenharmony_ci 32419b0af8Sopenharmony_ci#define EXCEPTION_MEM_SIZE (8*1024) /* mem for exception handling */ 33419b0af8Sopenharmony_ci#ifdef CONFIG_THIRDPARTY_COMPATIBLE 34419b0af8Sopenharmony_ci#define TSP_REQUEST 0x32000008 35419b0af8Sopenharmony_ci#define TSP_RESPONSE 0xBE000005 36419b0af8Sopenharmony_ci#else 37419b0af8Sopenharmony_ci#define TSP_REQUEST 0xB2000008 38419b0af8Sopenharmony_ci#define TSP_RESPONSE 0xB2000009 39419b0af8Sopenharmony_ci#endif 40419b0af8Sopenharmony_ci#define TSP_REE_SIQ 0xB200000A 41419b0af8Sopenharmony_ci#define TSP_CRASH 0xB200000B 42419b0af8Sopenharmony_ci#define TSP_REBOOT 0xB200000E 43419b0af8Sopenharmony_ci#define TSP_CPU_ON 0xB200000F 44419b0af8Sopenharmony_ci#define TSP_REBOOT_DONE 0xB2000010 45419b0af8Sopenharmony_ci#define TSP_PREEMPTED 0xB2000005 46419b0af8Sopenharmony_ci#define TC_CALL_GLOBAL 0x01 47419b0af8Sopenharmony_ci#define TC_CALL_SYNC 0x02 48419b0af8Sopenharmony_ci#define TC_CALL_LOGIN 0x04 49419b0af8Sopenharmony_ci#define TEE_REQ_FROM_USER_MODE 0U 50419b0af8Sopenharmony_ci#define TEE_REQ_FROM_KERNEL_MODE 1U 51419b0af8Sopenharmony_ci#define TEE_PARAM_NUM 4 52419b0af8Sopenharmony_ci#define VMALLOC_TYPE 0 53419b0af8Sopenharmony_ci#define RESERVED_TYPE 1 54419b0af8Sopenharmony_ci 55419b0af8Sopenharmony_ci/* Max sizes for login info buffer comming from teecd */ 56419b0af8Sopenharmony_ci#define MAX_PACKAGE_NAME_LEN 255 57419b0af8Sopenharmony_ci/* 58419b0af8Sopenharmony_ci * The apk certificate format is as follows: 59419b0af8Sopenharmony_ci * modulus_size(4 bytes) + modulus buffer(512 bytes) 60419b0af8Sopenharmony_ci * + exponent size(4 bytes) + exponent buffer(1 bytes) 61419b0af8Sopenharmony_ci */ 62419b0af8Sopenharmony_ci#define MAX_PUBKEY_LEN 1024 63419b0af8Sopenharmony_ci 64419b0af8Sopenharmony_cistruct tc_ns_dev_list { 65419b0af8Sopenharmony_ci struct mutex dev_lock; /* for dev_file_list */ 66419b0af8Sopenharmony_ci struct list_head dev_file_list; 67419b0af8Sopenharmony_ci}; 68419b0af8Sopenharmony_ci 69419b0af8Sopenharmony_cistruct tc_uuid { 70419b0af8Sopenharmony_ci uint32_t time_low; 71419b0af8Sopenharmony_ci uint16_t time_mid; 72419b0af8Sopenharmony_ci uint16_t timehi_and_version; 73419b0af8Sopenharmony_ci uint8_t clockseq_and_node[8]; /* clock len is 8 */ 74419b0af8Sopenharmony_ci}; 75419b0af8Sopenharmony_ci 76419b0af8Sopenharmony_ci#define INVALID_MAP_ADDR ((void*)-1) 77419b0af8Sopenharmony_cistruct tc_ns_shared_mem { 78419b0af8Sopenharmony_ci void *kernel_addr; 79419b0af8Sopenharmony_ci void *user_addr; 80419b0af8Sopenharmony_ci void *user_addr_ca; /* for ca alloc share mem */ 81419b0af8Sopenharmony_ci unsigned int len; 82419b0af8Sopenharmony_ci int mem_type; 83419b0af8Sopenharmony_ci struct list_head head; 84419b0af8Sopenharmony_ci atomic_t usage; 85419b0af8Sopenharmony_ci atomic_t offset; 86419b0af8Sopenharmony_ci}; 87419b0af8Sopenharmony_ci 88419b0af8Sopenharmony_cistruct tc_ns_service { 89419b0af8Sopenharmony_ci unsigned char uuid[UUID_LEN]; 90419b0af8Sopenharmony_ci struct mutex session_lock; /* for session_list */ 91419b0af8Sopenharmony_ci struct list_head session_list; 92419b0af8Sopenharmony_ci struct list_head head; 93419b0af8Sopenharmony_ci struct mutex operation_lock; /* for session's open/close */ 94419b0af8Sopenharmony_ci atomic_t usage; 95419b0af8Sopenharmony_ci}; 96419b0af8Sopenharmony_ci 97419b0af8Sopenharmony_ci#define SERVICES_MAX_COUNT 32 /* service limit can opened on 1 fd */ 98419b0af8Sopenharmony_cistruct tc_ns_dev_file { 99419b0af8Sopenharmony_ci unsigned int dev_file_id; 100419b0af8Sopenharmony_ci struct mutex service_lock; /* for service_ref[], services[] */ 101419b0af8Sopenharmony_ci uint8_t service_ref[SERVICES_MAX_COUNT]; /* a judge if set services[i]=NULL */ 102419b0af8Sopenharmony_ci struct tc_ns_service *services[SERVICES_MAX_COUNT]; 103419b0af8Sopenharmony_ci struct mutex shared_mem_lock; /* for shared_mem_list */ 104419b0af8Sopenharmony_ci struct list_head shared_mem_list; 105419b0af8Sopenharmony_ci struct list_head head; 106419b0af8Sopenharmony_ci /* Device is linked to call from kernel */ 107419b0af8Sopenharmony_ci uint8_t kernel_api; 108419b0af8Sopenharmony_ci /* client login info provided by teecd, can be either package name and public 109419b0af8Sopenharmony_ci * key or uid(for non android services/daemons) 110419b0af8Sopenharmony_ci * login information can only be set once, dont' allow subsequent calls 111419b0af8Sopenharmony_ci */ 112419b0af8Sopenharmony_ci bool login_setup; 113419b0af8Sopenharmony_ci struct mutex login_setup_lock; /* for login_setup */ 114419b0af8Sopenharmony_ci#ifdef CONFIG_AUTH_HASH 115419b0af8Sopenharmony_ci bool cainfo_hash_setup; 116419b0af8Sopenharmony_ci struct mutex cainfo_hash_setup_lock; 117419b0af8Sopenharmony_ci#endif 118419b0af8Sopenharmony_ci uint32_t pkg_name_len; 119419b0af8Sopenharmony_ci uint8_t pkg_name[MAX_PACKAGE_NAME_LEN]; 120419b0af8Sopenharmony_ci uint32_t pub_key_len; 121419b0af8Sopenharmony_ci uint8_t pub_key[MAX_PUBKEY_LEN]; 122419b0af8Sopenharmony_ci int load_app_flag; 123419b0af8Sopenharmony_ci struct completion close_comp; /* for kthread close unclosed session */ 124419b0af8Sopenharmony_ci}; 125419b0af8Sopenharmony_ci 126419b0af8Sopenharmony_ciunion tc_ns_parameter { 127419b0af8Sopenharmony_ci struct { 128419b0af8Sopenharmony_ci unsigned int buffer; 129419b0af8Sopenharmony_ci unsigned int size; 130419b0af8Sopenharmony_ci } memref; 131419b0af8Sopenharmony_ci struct { 132419b0af8Sopenharmony_ci unsigned int a; 133419b0af8Sopenharmony_ci unsigned int b; 134419b0af8Sopenharmony_ci } value; 135419b0af8Sopenharmony_ci}; 136419b0af8Sopenharmony_ci 137419b0af8Sopenharmony_cistruct tc_ns_login { 138419b0af8Sopenharmony_ci unsigned int method; 139419b0af8Sopenharmony_ci unsigned int mdata; 140419b0af8Sopenharmony_ci}; 141419b0af8Sopenharmony_ci 142419b0af8Sopenharmony_cistruct tc_ns_operation { 143419b0af8Sopenharmony_ci unsigned int paramtypes; 144419b0af8Sopenharmony_ci union tc_ns_parameter params[TEE_PARAM_NUM]; 145419b0af8Sopenharmony_ci unsigned int buffer_h_addr[TEE_PARAM_NUM]; 146419b0af8Sopenharmony_ci struct tc_ns_shared_mem *sharemem[TEE_PARAM_NUM]; 147419b0af8Sopenharmony_ci void *mb_buffer[TEE_PARAM_NUM]; 148419b0af8Sopenharmony_ci}; 149419b0af8Sopenharmony_ci 150419b0af8Sopenharmony_cistruct tc_ns_temp_buf { 151419b0af8Sopenharmony_ci void *temp_buffer; 152419b0af8Sopenharmony_ci unsigned int size; 153419b0af8Sopenharmony_ci}; 154419b0af8Sopenharmony_ci 155419b0af8Sopenharmony_cienum smc_cmd_type { 156419b0af8Sopenharmony_ci CMD_TYPE_GLOBAL, 157419b0af8Sopenharmony_ci CMD_TYPE_TA, 158419b0af8Sopenharmony_ci CMD_TYPE_TA_AGENT, 159419b0af8Sopenharmony_ci CMD_TYPE_TA2TA_AGENT, /* compatible with TA2TA2TA->AGENT etc. */ 160419b0af8Sopenharmony_ci CMD_TYPE_BUILDIN_AGENT, 161419b0af8Sopenharmony_ci}; 162419b0af8Sopenharmony_ci 163419b0af8Sopenharmony_cistruct tc_ns_smc_cmd { 164419b0af8Sopenharmony_ci uint8_t uuid[sizeof(struct tc_uuid)]; 165419b0af8Sopenharmony_ci unsigned int cmd_type; 166419b0af8Sopenharmony_ci unsigned int cmd_id; 167419b0af8Sopenharmony_ci unsigned int dev_file_id; 168419b0af8Sopenharmony_ci unsigned int context_id; 169419b0af8Sopenharmony_ci unsigned int agent_id; 170419b0af8Sopenharmony_ci unsigned int operation_phys; 171419b0af8Sopenharmony_ci unsigned int operation_h_phys; 172419b0af8Sopenharmony_ci unsigned int login_method; 173419b0af8Sopenharmony_ci unsigned int login_data_phy; 174419b0af8Sopenharmony_ci unsigned int login_data_h_addr; 175419b0af8Sopenharmony_ci unsigned int login_data_len; 176419b0af8Sopenharmony_ci unsigned int err_origin; 177419b0af8Sopenharmony_ci int ret_val; 178419b0af8Sopenharmony_ci unsigned int event_nr; 179419b0af8Sopenharmony_ci unsigned int uid; 180419b0af8Sopenharmony_ci unsigned int ca_pid; /* pid */ 181419b0af8Sopenharmony_ci unsigned int pid; /* tgid */ 182419b0af8Sopenharmony_ci unsigned int eventindex; /* tee audit event index for upload */ 183419b0af8Sopenharmony_ci bool started; 184419b0af8Sopenharmony_ci} __attribute__((__packed__)); 185419b0af8Sopenharmony_ci 186419b0af8Sopenharmony_ci/* 187419b0af8Sopenharmony_ci * @brief 188419b0af8Sopenharmony_ci */ 189419b0af8Sopenharmony_cistruct tc_wait_data { 190419b0af8Sopenharmony_ci wait_queue_head_t send_cmd_wq; 191419b0af8Sopenharmony_ci int send_wait_flag; 192419b0af8Sopenharmony_ci}; 193419b0af8Sopenharmony_ci 194419b0af8Sopenharmony_ci#define NUM_OF_SO 1 195419b0af8Sopenharmony_ci#ifdef CONFIG_CMS_CAHASH_AUTH 196419b0af8Sopenharmony_ci#define KIND_OF_SO 1 /* the number of libteecxxx.so library on MDC\DC\TI */ 197419b0af8Sopenharmony_ci#else 198419b0af8Sopenharmony_ci#define KIND_OF_SO 2 /* the number of libteecxxx.so library on OH\HO */ 199419b0af8Sopenharmony_ci#endif 200419b0af8Sopenharmony_cistruct tc_ns_session { 201419b0af8Sopenharmony_ci unsigned int session_id; 202419b0af8Sopenharmony_ci struct list_head head; 203419b0af8Sopenharmony_ci struct tc_wait_data wait_data; 204419b0af8Sopenharmony_ci struct mutex ta_session_lock; /* for open/close/invoke on 1 session */ 205419b0af8Sopenharmony_ci struct tc_ns_dev_file *owner; 206419b0af8Sopenharmony_ci uint8_t auth_hash_buf[MAX_SHA_256_SZ * NUM_OF_SO + MAX_SHA_256_SZ]; 207419b0af8Sopenharmony_ci atomic_t usage; 208419b0af8Sopenharmony_ci}; 209419b0af8Sopenharmony_ci 210419b0af8Sopenharmony_cistruct mb_cmd_pack { 211419b0af8Sopenharmony_ci struct tc_ns_operation operation; 212419b0af8Sopenharmony_ci unsigned char login_data[MAX_SHA_256_SZ * NUM_OF_SO + MAX_SHA_256_SZ]; 213419b0af8Sopenharmony_ci}; 214419b0af8Sopenharmony_ci 215419b0af8Sopenharmony_cistruct load_img_params { 216419b0af8Sopenharmony_ci struct tc_ns_dev_file *dev_file; 217419b0af8Sopenharmony_ci const char *file_buffer; 218419b0af8Sopenharmony_ci unsigned int file_size; 219419b0af8Sopenharmony_ci struct mb_cmd_pack *mb_pack; 220419b0af8Sopenharmony_ci char *mb_load_mem; 221419b0af8Sopenharmony_ci struct tc_uuid *uuid_return; 222419b0af8Sopenharmony_ci unsigned int mb_load_size; 223419b0af8Sopenharmony_ci}; 224419b0af8Sopenharmony_ci 225419b0af8Sopenharmony_cistruct tc_call_params { 226419b0af8Sopenharmony_ci struct tc_ns_dev_file *dev; 227419b0af8Sopenharmony_ci struct tc_ns_client_context *context; 228419b0af8Sopenharmony_ci struct tc_ns_session *sess; 229419b0af8Sopenharmony_ci uint8_t flags; 230419b0af8Sopenharmony_ci}; 231419b0af8Sopenharmony_ci 232419b0af8Sopenharmony_cistruct tc_op_params { 233419b0af8Sopenharmony_ci struct mb_cmd_pack *mb_pack; 234419b0af8Sopenharmony_ci struct tc_ns_smc_cmd *smc_cmd; 235419b0af8Sopenharmony_ci struct tc_ns_temp_buf local_tmpbuf[TEE_PARAM_NUM]; 236419b0af8Sopenharmony_ci uint32_t trans_paramtype[TEE_PARAM_NUM]; 237419b0af8Sopenharmony_ci bool op_inited; 238419b0af8Sopenharmony_ci}; 239419b0af8Sopenharmony_ci 240419b0af8Sopenharmony_ci#endif 241