source: azure_iot_hub/trunk/asp3_dcre/syssvc/musl_adapter.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

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