1 /*
2  * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3  * Licensed under the Mulan PSL v2.
4  * You can use this software according to the terms and conditions of the Mulan PSL v2.
5  * You may obtain a copy of Mulan PSL v2 at:
6  *     http://license.coscl.org.cn/MulanPSL2
7  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8  * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9  * PURPOSE.
10  * See the Mulan PSL v2 for more details.
11  */
12 
13 #ifndef _TEE_CLIENT_INNER_H_
14 #define _TEE_CLIENT_INNER_H_
15 
16 #include <pthread.h>
17 #include <unistd.h>
18 #include "tee_client_constants.h"
19 #include "tee_client_list.h"
20 #include "tee_client_type.h"
21 #include "tee_log.h"
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #define IS_TEMP_MEM(paramType)                                                              \
28     (((paramType) == TEEC_MEMREF_TEMP_INPUT) || ((paramType) == TEEC_MEMREF_TEMP_OUTPUT) || \
29      ((paramType) == TEEC_MEMREF_TEMP_INOUT))
30 
31 #define IS_PARTIAL_MEM(paramType)                                                        \
32     (((paramType) == TEEC_MEMREF_WHOLE) || ((paramType) == TEEC_MEMREF_PARTIAL_INPUT) || \
33      ((paramType) == TEEC_MEMREF_PARTIAL_OUTPUT) || ((paramType) == TEEC_MEMREF_PARTIAL_INOUT))
34 
35 #define IS_VALUE_MEM(paramType) \
36     (((paramType) == TEEC_VALUE_INPUT) || ((paramType) == TEEC_VALUE_OUTPUT) || ((paramType) == TEEC_VALUE_INOUT))
37 
38 #define CHECK_ERR_RETURN(val, ref, ret)                                                        \
39     do {                                                                                       \
40         if ((val) != (ref)) {                                                                  \
41             tloge("%{public}d: error: %{public}d\n", __LINE__, (int)val); \
42             return ret;                                                                        \
43         }                                                                                      \
44     } while (0)
45 
46 #define CHECK_ERR_NO_RETURN(val, ref)                                                          \
47     do {                                                                                       \
48         if ((val) != (ref)) {                                                                  \
49             tloge("%{public}d: error: %{public}d\n", __LINE__, (int)val); \
50             return;                                                                            \
51         }                                                                                      \
52     } while (0)
53 
54 #define CHECK_ERR_GOTO(val, ref, label)                                                        \
55     do {                                                                                       \
56         if ((val) != (ref)) {                                                                  \
57             tloge("%{public}d: error: %{public}d\n", __LINE__, (int)val); \
58             goto label;                                                                        \
59         }                                                                                      \
60     } while (0)
61 
62 
63 #define MAX_CXTCNT_ONECA 16                 /* one ca only can get 16 contexts */
64 #define MAX_TA_PATH_LEN 256
65 #define PARAM_SIZE_LIMIT (0x400000 + 0x100) /* 0x100 is for share mem flag etc */
66 #define NUM_OF_SHAREMEM_BITMAP 8
67 
68 #ifndef ZERO_SIZE_PTR
69 #define ZERO_SIZE_PTR   ((void *)16)
70 #endif
71 
72 #define BUFF_LEN_MAX 4096
73 
74 #ifndef PAGE_SIZE
75 #define PAGE_SIZE getpagesize()
76 #endif
77 
78 typedef struct {
79     int32_t fd;                    /* file descriptor */
80     struct ListNode session_list;  /* session list  */
81     struct ListNode shrd_mem_list; /* share memory list */
82     struct {
83         void *buffer;
84         sem_t buffer_barrier;
85     } share_buffer;
86     uint8_t shm_bitmap[NUM_OF_SHAREMEM_BITMAP];
87     struct ListNode c_node; /* context list node  */
88     uint32_t ops_cnt;
89     pthread_mutex_t sessionLock;
90     pthread_mutex_t shrMemLock;
91     pthread_mutex_t shrMemBitMapLock;
92     bool callFromService; /* true:from Service, false:from native */
93 } TEEC_ContextInner;
94 
95 typedef struct {
96     void *buffer;              /* memory pointer */
97     uint32_t size;             /* memory size */
98     uint32_t flags;            /* memory flag, distinguish between input and output, range in #TEEC_SharedMemCtl */
99     uint32_t ops_cnt;          /* memoty operation cnt */
100     bool is_allocated;         /* memory allocated flag, distinguish between registered or distributed */
101     struct ListNode head;      /* head of shared memory list */
102     TEEC_ContextInner *context; /* point to its own TEE environment */
103     uint32_t offset;
104 } TEEC_SharedMemoryInner;
105 
106 typedef struct {
107     const uint8_t *taPath;
108     FILE *taFp;
109 } TaFileInfo;
110 
111 #ifdef __cplusplus
112 }
113 #endif
114 #endif
115