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