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