1 /*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #include "mem.h"
33 #include <securec.h>
34 #include "agent.h"
35 #include "mailbox_mempool.h"
36 #include "tc_ns_client.h"
37 #include "tc_ns_log.h"
38 #include "teek_ns_client.h"
39 #include "tzdriver_compat.h"
40
TcMemFree(TcNsSharedMem * sharedMem)41 void TcMemFree(TcNsSharedMem *sharedMem)
42 {
43 if (sharedMem == NULL) {
44 return;
45 }
46
47 if (sharedMem->kernelAddr != NULL) {
48 LOS_VFree(sharedMem->kernelAddr);
49 sharedMem->kernelAddr = NULL;
50 }
51 free(sharedMem);
52 }
53
TcMemAllocate(size_t len)54 TcNsSharedMem *TcMemAllocate(size_t len)
55 {
56 TcNsSharedMem *sharedMem = NULL;
57 void *addr = NULL;
58
59 sharedMem = calloc(1, sizeof(*sharedMem));
60 if (ZERO_OR_NULL_PTR((unsigned long)(uintptr_t)sharedMem)) {
61 tloge("sharedMem malloc failed\n");
62 return ERR_PTR(-ENOMEM);
63 }
64
65 len = ALIGN(len, SZ_4K);
66 if (len > MAILBOX_POOL_SIZE) {
67 tloge("alloc sharemem size(%zu) is too large\n", len);
68 free(sharedMem);
69 return ERR_PTR(-EINVAL);
70 }
71
72 addr = LOS_VMalloc(len);
73 if (addr == NULL) {
74 tloge("alloc mailbox failed\n");
75 free(sharedMem);
76 return ERR_PTR(-ENOMEM);
77 }
78 sharedMem->kernelAddr = addr;
79 sharedMem->len = len;
80 sharedMem->userAddr = NULL;
81 sharedMem->userAddrCa = NULL;
82 atomic_set(&sharedMem->usage, 0);
83 return sharedMem;
84 }
85
TcMemInit(void)86 int TcMemInit(void)
87 {
88 int ret;
89
90 tlogi("TcMemInit\n");
91
92 ret = MailboxMempoolInit();
93 if (ret) {
94 tloge("tz mailbox init failed\n");
95 return -ENOMEM;
96 }
97
98 return 0;
99 }
100
TcMemDestroy(void)101 void TcMemDestroy(void)
102 {
103 tlogi("tc_client exit\n");
104
105 MailboxMempoolDestroy();
106 }
107