source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/syssvc/musl_adapter.c@ 387

Last change on this file since 387 was 387, checked in by coas-nagasima, 5 years ago

ファイルディスクリプタ処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.9 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2019 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38#include <kernel.h>
39#include <string.h>
40#include <errno.h>
41#include <signal.h>
42#include <target_kernel_impl.h>
43#include "syssvc/musl_adapter.h"
44#include "kernel_cfg.h"
45
46#ifndef _MSC_VER
47void _start_c(const char * const*args);
48
49void
50_sta_ker()
51{
52 static const char *const args[] = {
53 (char *)1,
54 "asp3",
55 0,
56 // envp
57 "TZ=JST-9",
58 0,
59 // auxv
60 0
61 };
62 _start_c(args);
63}
64
65void *tid_address;
66
67__attribute__((weak))
68long SYS_set_tid_address(long a) {
69 tid_address = (void *)a;
70 return 0;
71}
72
73__attribute__((weak))
74int SYS_gettid()
75{
76 ID tskid;
77 ER ret;
78
79 ret = get_tid(&tskid);
80 if (ret != E_OK)
81 return -ENOSYS;
82
83 return tskid;
84}
85
86__attribute__((weak))
87int SYS_getpid()
88{
89 return 1;
90}
91
92__attribute__((weak))
93int SYS_tkill(int tid, int sig)
94{
95 ER ret;
96
97 ret = ter_tsk(tid);
98 if (ret != E_OK)
99 return -ENOSYS;
100
101 return 0;
102}
103
104sigset_t g_sigmask;
105
106__attribute__((weak))
107long SYS_rt_sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict old)
108{
109 if (old != NULL)
110 memcpy(old, &g_sigmask, sizeof(sigset_t));
111
112 switch (how) {
113 case SIG_BLOCK:
114 for (int i = 0; i < sizeof(g_sigmask.__bits) / sizeof(g_sigmask.__bits[0]); i++) {
115 g_sigmask.__bits[i] |= set->__bits[i];
116 }
117 break;
118 case SIG_UNBLOCK:
119 for (int i = 0; i < sizeof(g_sigmask.__bits) / sizeof(g_sigmask.__bits[0]); i++) {
120 g_sigmask.__bits[i] &= ~set->__bits[i];
121 }
122 break;
123 case SIG_SETMASK:
124 memcpy(&g_sigmask, set, sizeof(sigset_t));
125 break;
126 default:
127 return -EINVAL;
128 }
129
130 return 0;
131}
132
133__attribute__((weak))
134void SYS_exit_group()
135{
136 ext_ker();
137}
138
139__attribute__((weak))
140void SYS_exit()
141{
142 ext_ker();
143}
144
145__attribute__((weak))
146int SYS_open(const char *path, int flags, void *arg)
147{
148 return -ENOSYS;
149}
150
151__attribute__((weak))
152long SYS_poll()
153{
154 return -ENOSYS;
155}
156
157__attribute__((weak))
158long SYS_brk(long a) {
159 return (long)shell_brk((void *)a);
160}
161
162__attribute__((weak))
163long SYS_mmap2(long a, long b, long c, long d, long e, long f, long g) {
164 return (int)shell_mmap2((void *)a, (size_t)b, (int)c, (int)d, (int)e, ((off_t)f << 32) | (off_t)g);
165}
166
167__attribute__((weak))
168long SYS_mprotect(long a, long b, long c) {
169 return shell_mprotect((void *)a, (size_t)b, (int)c);
170}
171
172uint32_t __sync_add_and_fetch_4(uint32_t *count, uint32_t value)
173{
174 uint32_t result;
175 bool_t lock = sense_lock();
176
177 if (!lock)
178 loc_cpu();
179
180 result = *count;
181 result += value;
182 *count = result;
183
184 if (!lock)
185 unl_cpu();
186
187 return result;
188}
189
190uint32_t __sync_sub_and_fetch_4(uint32_t *count, uint32_t value)
191{
192 uint32_t result;
193 bool_t lock = sense_lock();
194
195 if (!lock)
196 loc_cpu();
197
198 result = *count;
199 result -= value;
200 *count = result;
201
202 if (!lock)
203 unl_cpu();
204
205 return result;
206}
207
208#endif
209
210#ifndef _MSC_VER
211extern uint32_t _HeapBase;
212extern uint32_t _HeapLimit;
213#else
214uint8_t _HeapBase[16 * 4096];
215#define _HeapLimit _HeapBase[sizeof(_HeapBase)]
216#endif
217
218void *shell_brk(void *addr)
219{
220 if (addr == 0) {
221 return (void *)(&_HeapBase);
222 }
223 if ((addr >= (void *)&_HeapBase) && (addr < (void *)&_HeapLimit)) {
224 return addr;
225 }
226 return (void *)-1;
227}
228
229void *shell_mmap2(void *start, size_t length, int prot, int flags, int fd, off_t pgoffset)
230{
231 if (fd != -1)
232 return (void *)-EINVAL;
233
234 if ((length >= 0) && (length <= sizeof(&_HeapBase))) {
235 return &_HeapBase;
236 }
237 return (void *)-1;
238}
239
240int shell_mprotect(void *addr, size_t len, int prot)
241{
242 //if ((addr >= (void *)&_HeapBase) && (addr + len < (void *)&_HeapLimit)) {
243 return 0;
244//}
245//return -1;
246}
247
248#include "syssvc/tlsf/tlsf.h"
249
250static tlsf_t sys_tlsf;
251static pool_t sys_pool;
252
253void sys_malloc_init(intptr_t exinf)
254{
255 sys_tlsf = tlsf_create(&_HeapBase);
256 if (sys_tlsf == NULL)
257 return;
258
259 sys_pool = tlsf_add_pool(sys_tlsf, ((uint8_t *)&_HeapBase) + tlsf_size(), ((intptr_t)&_HeapLimit - (intptr_t)&_HeapBase) - tlsf_size());
260}
261
262void sys_malloc_fini(intptr_t exinf)
263{
264 tlsf_destroy(sys_tlsf);
265}
266
267void *malloc(size_t size)
268{
269 void *result;
270 wai_sem(SEM_MALLOC);
271 result = tlsf_malloc(sys_tlsf, size);
272 sig_sem(SEM_MALLOC);
273 if (result == NULL)
274 tlsf_check_pool(sys_pool);
275 return result;
276}
277
278void *calloc(size_t size, size_t count)
279{
280 void *result;
281 wai_sem(SEM_MALLOC);
282 result = tlsf_malloc(sys_tlsf, count * size);
283 sig_sem(SEM_MALLOC);
284 if (result != NULL)
285 memset(result, 0, count * size);
286 else
287 tlsf_check_pool(sys_pool);
288 return result;
289}
290
291void *realloc(void *ptr, size_t size)
292{
293 void *result;
294 wai_sem(SEM_MALLOC);
295 result = tlsf_realloc(sys_tlsf, ptr, size);
296 sig_sem(SEM_MALLOC);
297 if (result == NULL)
298 tlsf_check_pool(sys_pool);
299 return result;
300}
301
302void free(void *ptr)
303{
304 wai_sem(SEM_MALLOC);
305 tlsf_free(sys_tlsf, ptr);
306 sig_sem(SEM_MALLOC);
307}
308
Note: See TracBrowser for help on using the repository browser.