1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "napi/native_api.h"
17 #include <cerrno>
18 #include <cstdio>
19 #include <js_native_api_types.h>
20 
21 #define RETURN_0 0
22 #define PARAM_0 0
23 #define PARAM_1 1
24 #define PARAM_2 2
25 #define PARAM_UNNORMAL (-1)
26 #define RETURN_0 0
27 #define FAILD (-1)
28 #define ERRON_0 0
29 #define SIZE_16 16
30 #define SIZE_7 7
31 
32 extern "C" int __aeabi_atexit(void *obj, void (*func)(void *), void *d);
33 extern "C" int __aeabi_memclr(void *dest, size_t n);
34 extern "C" int __aeabi_memclr4(void *dest, size_t n);
35 extern "C" int __aeabi_memclr8(void *dest, size_t n);
36 extern "C" void *__aeabi_memcpy(void *__restrict, const void *__restrict, size_t);
37 extern "C" void *__aeabi_memcpy4(void *__restrict, const void *__restrict, size_t);
38 extern "C" void *__aeabi_memcpy8(void *__restrict, const void *__restrict, size_t);
39 extern "C" void *__aeabi_memmove(void *, const void *, size_t);
40 extern "C" void *__aeabi_memmove4(void *, const void *, size_t);
41 extern "C" void *__aeabi_memmove8(void *, const void *, size_t);
42 extern "C" void *__aeabi_memset(void *, int, size_t);
43 extern "C" void *__aeabi_memset4(void *, int, size_t);
44 extern "C" void *__aeabi_memset8(void *, int, size_t);
45 extern "C" void *__aeabi_read_tp();
46 extern "C" char *__progname;
47 extern "C" uintptr_t __stack_chk_guard;
48 
AeabiMemclr(napi_env env, napi_callback_info info)49 static napi_value AeabiMemclr(napi_env env, napi_callback_info info)
50 {
51     char dest[] = "__aeabi_memclr";
52     napi_value result = nullptr;
53     if (__aeabi_memclr(dest, sizeof(dest)) != PARAM_0) {
54         napi_create_int32(env, RETURN_0, &result);
55     } else {
56         napi_create_int32(env, FAILD, &result);
57     }
58 
59     return result;
60 }
61 
AeabiMemclr4(napi_env env, napi_callback_info info)62 static napi_value AeabiMemclr4(napi_env env, napi_callback_info info)
63 {
64     char dest[] = "__aeabi_memclr";
65     napi_value result = nullptr;
66     if (__aeabi_memclr4(dest, sizeof(dest)) != PARAM_0) {
67         napi_create_int32(env, RETURN_0, &result);
68     } else {
69         napi_create_int32(env, FAILD, &result);
70     }
71 
72     return result;
73 }
74 
AeabiMemclr8(napi_env env, napi_callback_info info)75 static napi_value AeabiMemclr8(napi_env env, napi_callback_info info)
76 {
77     char dest[] = "__aeabi_memclr";
78     napi_value result = nullptr;
79     if (__aeabi_memclr8(dest, sizeof(dest)) != PARAM_0) {
80         napi_create_int32(env, RETURN_0, &result);
81     } else {
82         napi_create_int32(env, FAILD, &result);
83     }
84 
85     return result;
86 }
87 
AeabiMemcpy(napi_env env, napi_callback_info info)88 static napi_value AeabiMemcpy(napi_env env, napi_callback_info info)
89 {
90     int dest[] = {1, 2, 3, 4, 5, 6, 7};
91     int src[] = {4, 5, 6, 7};
92     void *ret = __aeabi_memcpy(dest, src, SIZE_16);
93     napi_value result = nullptr;
94     if (ret != nullptr) {
95         napi_create_int32(env, RETURN_0, &result);
96     } else {
97         napi_create_int32(env, FAILD, &result);
98     }
99 
100     return result;
101 }
102 
AeabiMemcpy4(napi_env env, napi_callback_info info)103 static napi_value AeabiMemcpy4(napi_env env, napi_callback_info info)
104 {
105     int dest[] = {1, 2, 3, 4, 5, 6, 7};
106     int src[] = {4, 5, 6, 7};
107     void *ret = __aeabi_memcpy4(dest, src, SIZE_16);
108     napi_value result = nullptr;
109     if (ret != nullptr) {
110         napi_create_int32(env, RETURN_0, &result);
111     } else {
112         napi_create_int32(env, FAILD, &result);
113     }
114 
115     return result;
116 }
117 
AeabiMemcpy8(napi_env env, napi_callback_info info)118 static napi_value AeabiMemcpy8(napi_env env, napi_callback_info info)
119 {
120     int dest[] = {1, 2, 3, 4, 5, 6, 7};
121     int src[] = {4, 5, 6, 7};
122     void *ret = __aeabi_memcpy8(dest, src, SIZE_16);
123     napi_value result = nullptr;
124     if (ret != nullptr) {
125         napi_create_int32(env, RETURN_0, &result);
126     } else {
127         napi_create_int32(env, FAILD, &result);
128     }
129 
130     return result;
131 }
132 
AeabiMemmove(napi_env env, napi_callback_info info)133 static napi_value AeabiMemmove(napi_env env, napi_callback_info info)
134 {
135     int dest[] = {1, 2, 3, 4, 5, 6, 7};
136     int src[] = {4, 5, 6, 7};
137     void *ret = __aeabi_memmove(dest, src, SIZE_16);
138     napi_value result = nullptr;
139     if (ret != nullptr) {
140         napi_create_int32(env, RETURN_0, &result);
141     } else {
142         napi_create_int32(env, FAILD, &result);
143     }
144 
145     return result;
146 }
147 
AeabiMemmove4(napi_env env, napi_callback_info info)148 static napi_value AeabiMemmove4(napi_env env, napi_callback_info info)
149 {
150     int dest[] = {1, 2, 3, 4, 5, 6, 7};
151     int src[] = {4, 5, 6, 7};
152     void *ret = __aeabi_memmove4(dest, src, SIZE_16);
153     napi_value result = nullptr;
154     if (ret != nullptr) {
155         napi_create_int32(env, RETURN_0, &result);
156     } else {
157         napi_create_int32(env, FAILD, &result);
158     }
159 
160     return result;
161 }
162 
AeabiMemmove8(napi_env env, napi_callback_info info)163 static napi_value AeabiMemmove8(napi_env env, napi_callback_info info)
164 {
165     int dest[] = {1, 2, 3, 4, 5, 6, 7};
166     int src[] = {4, 5, 6, 7};
167     void *ret = __aeabi_memmove8(dest, src, SIZE_16);
168     napi_value result = nullptr;
169     if (ret != nullptr) {
170         napi_create_int32(env, RETURN_0, &result);
171     } else {
172         napi_create_int32(env, FAILD, &result);
173     }
174 
175     return result;
176 }
177 
AeabiMemset(napi_env env, napi_callback_info info)178 static napi_value AeabiMemset(napi_env env, napi_callback_info info)
179 {
180     int dest[] = {1, 2, 3, 4, 5, 6, 7};
181     int src = SIZE_7;
182     void *ret = __aeabi_memset(dest, src, SIZE_16);
183     napi_value result = nullptr;
184     if (ret != nullptr) {
185         napi_create_int32(env, RETURN_0, &result);
186     } else {
187         napi_create_int32(env, FAILD, &result);
188     }
189 
190     return result;
191 }
192 
AeabiMemset4(napi_env env, napi_callback_info info)193 static napi_value AeabiMemset4(napi_env env, napi_callback_info info)
194 {
195     int dest[] = {1, 2, 3, 4, 5, 6, 7};
196     int src = SIZE_7;
197     void *ret = __aeabi_memset4(dest, src, SIZE_16);
198     napi_value result = nullptr;
199     if (ret != nullptr) {
200         napi_create_int32(env, RETURN_0, &result);
201     } else {
202         napi_create_int32(env, FAILD, &result);
203     }
204 
205     return result;
206 }
207 
AeabiMemset8(napi_env env, napi_callback_info info)208 static napi_value AeabiMemset8(napi_env env, napi_callback_info info)
209 {
210     int dest[] = {1, 2, 3, 4, 5, 6, 7};
211     int src = SIZE_7;
212     void *ret = __aeabi_memset4(dest, src, SIZE_16);
213     napi_value result = nullptr;
214     if (ret != nullptr) {
215         napi_create_int32(env, RETURN_0, &result);
216     } else {
217         napi_create_int32(env, FAILD, &result);
218     }
219 
220     return result;
221 }
222 
AeabiReadTp(napi_env env, napi_callback_info info)223 static napi_value AeabiReadTp(napi_env env, napi_callback_info info)
224 {
225     void *ret = __aeabi_read_tp();
226     napi_value result = nullptr;
227     if (ret != nullptr) {
228         napi_create_int32(env, RETURN_0, &result);
229     } else {
230         napi_create_int32(env, FAILD, &result);
231     }
232 
233     return result;
234 }
235 
Progname(napi_env env, napi_callback_info info)236 static napi_value Progname(napi_env env, napi_callback_info info)
237 {
238     __progname = PARAM_0;
239     errno = ERRON_0;
240     printf("%s", __progname);
241     napi_value result = nullptr;
242     if (errno == ERRON_0) {
243         napi_create_int32(env, RETURN_0, &result);
244     } else {
245         napi_create_int32(env, FAILD, &result);
246     }
247 
248     return result;
249 }
250 
StackChkGuard(napi_env env, napi_callback_info info)251 static napi_value StackChkGuard(napi_env env, napi_callback_info info)
252 {
253     napi_value result = nullptr;
254 
255     if (__stack_chk_guard) {
256         napi_create_int32(env, RETURN_0, &result);
257     } else {
258         napi_create_int32(env, FAILD, &result);
259     }
260 
261     return result;
262 }
263 
264 EXTERN_C_START
Init(napi_env env, napi_value exports)265 static napi_value Init(napi_env env, napi_value exports)
266 {
267     napi_property_descriptor desc[] = {
268         {"aeabiMemclr", nullptr, AeabiMemclr, nullptr, nullptr, nullptr, napi_default, nullptr},
269         {"aeabiMemclr4", nullptr, AeabiMemclr4, nullptr, nullptr, nullptr, napi_default, nullptr},
270         {"aeabiMemclr8", nullptr, AeabiMemclr8, nullptr, nullptr, nullptr, napi_default, nullptr},
271         {"aeabiMemcpy", nullptr, AeabiMemcpy, nullptr, nullptr, nullptr, napi_default, nullptr},
272         {"aeabiMemcpy4", nullptr, AeabiMemcpy4, nullptr, nullptr, nullptr, napi_default, nullptr},
273         {"aeabiMemcpy8", nullptr, AeabiMemcpy8, nullptr, nullptr, nullptr, napi_default, nullptr},
274         {"aeabiMemmove", nullptr, AeabiMemmove, nullptr, nullptr, nullptr, napi_default, nullptr},
275         {"aeabiMemmove4", nullptr, AeabiMemmove4, nullptr, nullptr, nullptr, napi_default, nullptr},
276         {"aeabiMemmove8", nullptr, AeabiMemmove8, nullptr, nullptr, nullptr, napi_default, nullptr},
277         {"aeabiMemset", nullptr, AeabiMemset, nullptr, nullptr, nullptr, napi_default, nullptr},
278         {"aeabiMemset4", nullptr, AeabiMemset4, nullptr, nullptr, nullptr, napi_default, nullptr},
279         {"aeabiMemset8", nullptr, AeabiMemset8, nullptr, nullptr, nullptr, napi_default, nullptr},
280         {"aeabiReadTp", nullptr, AeabiReadTp, nullptr, nullptr, nullptr, napi_default, nullptr},
281         {"progname", nullptr, Progname, nullptr, nullptr, nullptr, napi_default, nullptr},
282         {"stackChkGuard", nullptr, StackChkGuard, nullptr, nullptr, nullptr, napi_default, nullptr},
283     };
284     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
285     return exports;
286 }
287 EXTERN_C_END
288 
289 static napi_module demoModule = {
290     .nm_version = 1,
291     .nm_flags = 0,
292     .nm_filename = nullptr,
293     .nm_register_func = Init,
294     .nm_modname = "aeabindk",
295     .nm_priv = ((void *)0),
296     .reserved = {0},
297 };
298 
RegisterModule(void)299 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
300