source: EcnlProtoTool/trunk/ntshell/src/syscall.c@ 331

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

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 22.3 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2017 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$
51 */
52#define _CRT_NO_TIME_T
53#include "../../musl-1.1.18/include/bits/syscall.h"
54#include "shellif.h"
55#include <t_syslog.h>
56#include "MBRZA1H.h"
57
58void *thread_area;
59void *tid_address;
60
61// https://os.mbed.com/users/dkato/code/FlashAccess/#652a093cf264
62void flash_access_cache_control(void) {
63 unsigned int assoc;
64
65 /* ==== Cleaning and invalidation of the L1 data cache ==== */
66 __v7_all_cache(2);
67 __DSB();
68
69 /* ==== Cleaning and invalidation of the L2 cache ==== */
70 if (PL310->AUX_CNT & (1<<16)) {
71 assoc = 16;
72 } else {
73 assoc = 8;
74 }
75 PL310->INV_WAY = (1 << assoc) - 1;
76 while(PL310->INV_WAY & ((1 << assoc) - 1)); // poll invalidate
77 PL310->CACHE_SYNC = 0x0;
78
79 /* ==== Invalidate all TLB entries ==== */
80 __ca9u_inv_tlb_all();
81
82 /* ==== Invalidate the L1 instruction cache ==== */
83 __v7_inv_icache_all();
84 __DSB();
85 __ISB();
86}
87
88void no_implement(const char *text)
89{
90 syslog(LOG_ERROR, text);
91 asm("bkpt #0");
92}
93
94static long __syscall(struct regs_t *r)
95{
96 long ret = -ENOSYS;
97
98 shellif_into();
99
100 switch (r->n) {
101 case SYS__llseek:
102 return shell_llseek(r->a, (((off_t)r->b) << 32) + (off_t)r->c, (off_t *)r->d, r->e);
103 case SYS__newselect:
104 ret = shell_select(r->a, (fd_set *)r->b, (fd_set *)r->c, (fd_set *)r->d, (struct timeval *)r->e);
105 break;
106 case SYS_accept:
107 ret = shell_accept(r->a, (struct sockaddr *)r->b, (socklen_t *)r->c);
108 break;
109 case SYS_access:
110 ret = shell_access((const char *)r->a, r->b);
111 break;
112 case SYS_acct:
113 no_implement("acct\n");
114 break;
115 case SYS_adjtimex:
116 no_implement("adjtimex\n");
117 break;
118#ifdef SYS_arch_prctl
119 case SYS_arch_prctl:
120 no_implement("arch_prctl\n");
121 break;
122#endif
123 case SYS_bind:
124 ret = shell_bind(r->a, (const struct sockaddr *)r->b, (socklen_t)r->c);
125 break;
126 case SYS_brk:
127 ret = (long)shell_brk((void *)r->a);
128 break;
129#ifdef SYS_cachectl
130 case SYS_cachectl:
131 no_implement("cachectl\n");
132 break;
133#endif
134#ifdef SYS_cacheflush
135 case SYS_cacheflush:
136 no_implement("cacheflush\n");
137 break;
138#endif
139 case SYS_capget:
140 no_implement("capget\n");
141 break;
142 case SYS_capset:
143 no_implement("capset\n");
144 break;
145 case SYS_chdir:
146 ret = shell_chdir((const char *)r->a);
147 break;
148 case SYS_chmod:
149 ret = shell_chmod((const char *)r->a, (mode_t)r->b);
150 break;
151 case SYS_chown32:
152 no_implement("chown\n");
153 break;
154 case SYS_chroot:
155 ret = shell_chroot((const char *)r->a);
156 break;
157 case SYS_clock_adjtime:
158 no_implement("clock_adjtime\n");
159 break;
160 case SYS_clock_getres:
161 ret = shell_clock_getres((clockid_t)r->a, (struct timespec *)r->b);
162 break;
163 case SYS_clock_gettime:
164 ret = shell_clock_gettime((clockid_t)r->a, (struct timespec *)r->b);
165 break;
166 case SYS_clock_nanosleep:
167 no_implement("clock_nanosleep\n");
168 break;
169 case SYS_clock_settime:
170 ret = shell_clock_settime((clockid_t)r->a, (const struct timespec *)r->b);
171 break;
172 case SYS_clone:
173 no_implement("clone\n");
174 break;
175 case SYS_close:
176 ret = shell_close(r->a);
177 break;
178 case SYS_connect:
179 ret = shell_connect(r->a, (const struct sockaddr *)r->b, (socklen_t)r->c);
180 break;
181 case SYS_delete_module:
182 no_implement("delete_module\n");
183 break;
184 case SYS_dup:
185 no_implement("dup\n");
186 break;
187 case SYS_dup2:
188 no_implement("dup2\n");
189 break;
190 case SYS_dup3:
191 no_implement("dup3\n");
192 break;
193 case SYS_epoll_create:
194 no_implement("epoll_create\n");
195 break;
196 case SYS_epoll_create1:
197 no_implement("epoll_create1\n");
198 break;
199 case SYS_epoll_ctl:
200 no_implement("epoll_ctl\n");
201 break;
202 case SYS_epoll_pwait:
203 no_implement("epoll_pwait\n");
204 break;
205 case SYS_epoll_wait:
206 no_implement("epoll_wait\n");
207 break;
208 case SYS_eventfd:
209 no_implement("eventfd\n");
210 break;
211 case SYS_eventfd2:
212 no_implement("eventfd2\n");
213 break;
214 case SYS_execve:
215 no_implement("execve\n");
216 break;
217 case SYS_exit:
218 shell_exit(r->a);
219 ret = 0;
220 break;
221 case SYS_exit_group:
222 shell_exit_group(r->a);
223 ret = 0;
224 break;
225 case SYS_faccessat:
226 no_implement("faccessat\n");
227 break;
228 case SYS_fadvise64_64:
229 no_implement("fadvise64_64\n");
230 break;
231 case SYS_fallocate:
232 no_implement("fallocate\n");
233 break;
234 case SYS_fanotify_init:
235 no_implement("fanotify_init\n");
236 break;
237 case SYS_fanotify_mark:
238 no_implement("fanotify_mark\n");
239 break;
240 case SYS_fchdir:
241 no_implement("fchdir\n");
242 break;
243 case SYS_fchmod:
244 no_implement("fchmod\n");
245 break;
246 case SYS_fchmodat:
247 no_implement("fchmodat\n");
248 break;
249 case SYS_fchown32:
250 no_implement("fchown\n");
251 break;
252 case SYS_fchownat:
253 no_implement("fchownat\n");
254 break;
255 case SYS_fcntl64:
256 ret = shell_fcntl((int)r->a, (int)r->b, (void *)r->c);
257 break;
258 case SYS_fdatasync:
259 no_implement("fdatasync\n");
260 break;
261 case SYS_fgetxattr:
262 no_implement("fgetxattr\n");
263 break;
264 case SYS_flistxattr:
265 no_implement("flistxattr\n");
266 break;
267 case SYS_flock:
268 no_implement("flock\n");
269 break;
270 case SYS_fork:
271 no_implement("fork\n");
272 break;
273 case SYS_fremovexattr:
274 no_implement("fremovexattr\n");
275 break;
276 case SYS_fsetxattr:
277 no_implement("fsetxattr\n");
278 break;
279 case SYS_fstat64:
280 ret = shell_fstat((int)r->a, (struct stat *)r->b);
281 break;
282 case SYS_fstatat64:
283 no_implement("fstatat64\n");
284 break;
285 case SYS_fstatfs:
286 no_implement("fstatfs\n");
287 break;
288 case SYS_fstatfs64:
289 no_implement("fstatfs64\n");
290 break;
291 case SYS_fsync:
292 ret = shell_fsync(r->a);
293 break;
294 case SYS_ftruncate64:
295 ret = shell_ftruncate((int)r->a, (((off_t)r->b) << 32) + (off_t)r->c);
296 break;
297 case SYS_futex:
298 no_implement("futex\n");
299 break;
300 case SYS_futimesat:
301 no_implement("futimesat\n");
302 break;
303 case SYS_getcpu:
304 no_implement("getcpu\n");
305 break;
306 case SYS_getcwd:
307 ret = (long)shell_getcwd((char *)r->a, (size_t)r->b);
308 break;
309 case SYS_getdents64:
310 ret = shell_getdents((int)r->a, (struct dirent *)r->b, (size_t)r->c); // TODO
311 break;
312 case SYS_getegid32:
313 no_implement("getegid\n");
314 break;
315 case SYS_geteuid32:
316 no_implement("geteuid\n");
317 break;
318 case SYS_getgid32:
319 no_implement("getgid\n");
320 break;
321 case SYS_getgroups32:
322 no_implement("getgroups\n");
323 break;
324 case SYS_getitimer:
325 no_implement("getitimer\n");
326 break;
327 case SYS_getpgid:
328 no_implement("getpgid\n");
329 break;
330 case SYS_getpid:
331 ret = shell_getpid();
332 break;
333 case SYS_getppid:
334 no_implement("getppid\n");
335 break;
336 case SYS_getpriority:
337 no_implement("getpriority\n");
338 break;
339 case SYS_getresgid32:
340 no_implement("getresgid\n");
341 break;
342 case SYS_getresuid32:
343 no_implement("getresuid\n");
344 break;
345#ifdef SYS_getrlimit
346 case SYS_getrlimit:
347 no_implement("getrlimit\n");
348 break;
349#endif
350 case SYS_getrusage:
351 no_implement("getrusage\n");
352 break;
353 case SYS_getsid:
354 no_implement("getsid\n");
355 break;
356 case SYS_getsockopt:
357 ret = shell_getsockopt(r->a, r->b, r->c, (void *)r->d, (socklen_t *)r->e);
358 break;
359 case SYS_gettid:
360 no_implement("gettid\n");
361 break;
362 case SYS_gettimeofday:
363 ret = shell_gettimeofday((struct timeval *)r->a, (void *)r->b);
364 break;
365 case SYS_getuid32:
366 no_implement("getuid\n");
367 break;
368 case SYS_getxattr:
369 no_implement("getxattr\n");
370 break;
371 case SYS_init_module:
372 no_implement("init_module\n");
373 break;
374 case SYS_inotify_add_watch:
375 no_implement("inotify_add_watch\n");
376 break;
377 case SYS_inotify_init:
378 no_implement("inotify_init\n");
379 break;
380 case SYS_inotify_init1:
381 no_implement("inotify_init1\n");
382 break;
383 case SYS_inotify_rm_watch:
384 no_implement("inotify_rm_watch\n");
385 break;
386 case SYS_ioctl:
387 ret = shell_ioctl((int)r->a, (int)r->b, (void *)r->c);
388 break;
389#ifdef SYS_ioperm
390 case SYS_ioperm:
391 no_implement("ioperm\n");
392 break;
393#endif
394#ifdef SYS_iopl
395 case SYS_iopl:
396 no_implement("iopl\n");
397 break;
398#endif
399#ifdef SYS_ipc
400 case SYS_ipc:
401 no_implement("ipc\n");
402 break;
403#endif
404#ifdef SYS_ipc
405 case SYS_ipc:
406 no_implement("ipc\n");
407 break;
408#endif
409 case SYS_kill:
410 ret = shell_kill(r->a, r->b);
411 break;
412 case SYS_lchown32:
413 no_implement("lchown\n");
414 break;
415 case SYS_lgetxattr:
416 no_implement("lgetxattr\n");
417 break;
418 case SYS_link:
419 ret = shell_link((const char *)r->a, (const char *)r->b);
420 break;
421 case SYS_linkat:
422 no_implement("linkat\n");
423 break;
424 case SYS_listen:
425 ret = shell_listen(r->a, r->b);
426 break;
427 case SYS_listxattr:
428 no_implement("listxattr\n");
429 break;
430 case SYS_llistxattr:
431 no_implement("llistxattr\n");
432 break;
433 case SYS_lremovexattr:
434 no_implement("lremovexattr\n");
435 break;
436 case SYS_lsetxattr:
437 no_implement("lsetxattr\n");
438 break;
439 case SYS_lstat64:
440 ret = shell_lstat((const char *__restrict)r->a, (struct stat *__restrict)r->b);
441 break;
442 case SYS_madvise:
443 ret = shell_madvise((void *)r->a, (size_t)r->b, (int)r->c); // TODO
444 break;
445 case SYS_mincore:
446 no_implement("mincore\n");
447 break;
448 case SYS_mkdir:
449 ret = shell_mkdir((const char *)r->a, (mode_t)r->b);
450 break;
451 case SYS_mkdirat:
452 no_implement("mkdirat\n");
453 break;
454 case SYS_mknod:
455 no_implement("mknod\n");
456 break;
457 case SYS_mknodat:
458 no_implement("mknodat\n");
459 break;
460 case SYS_mlock:
461 no_implement("mlock\n");
462 break;
463 case SYS_mlockall:
464 no_implement("mlockall\n");
465 break;
466 case SYS_mmap2:
467 ret = (int)shell_mmap2((void *)r->a, (size_t)r->b, r->c, r->d, r->e, (off_t)r->f);
468 break;
469 case SYS_mount:
470 no_implement("mount\n");
471 break;
472 case SYS_mprotect:
473 return shell_mprotect((void *)r->a, (size_t)r->b, r->c);
474 break;
475 case SYS_mq_getsetattr:
476 no_implement("mq_getsetattr\n");
477 break;
478 case SYS_mq_notify:
479 no_implement("mq_notify\n");
480 break;
481 case SYS_mq_open:
482 no_implement("mq_open\n");
483 break;
484 case SYS_mq_timedreceive:
485 no_implement("mq_timedreceive\n");
486 break;
487 case SYS_mq_timedsend:
488 no_implement("mq_timedsend\n");
489 break;
490 case SYS_mq_unlink:
491 no_implement("mq_unlink\n");
492 break;
493 case SYS_mremap:
494 no_implement("mremap\n");
495 break;
496 case SYS_msgctl:
497 no_implement("msgctl\n");
498 break;
499 case SYS_msgget:
500 no_implement("msgget\n");
501 break;
502 case SYS_msgrcv:
503 no_implement("msgrcv\n");
504 break;
505 case SYS_msgsnd:
506 no_implement("msgsnd\n");
507 break;
508 case SYS_msync:
509 no_implement("msync\n");
510 break;
511 case SYS_munlock:
512 no_implement("munlock\n");
513 break;
514 case SYS_munlockall:
515 no_implement("munlockall\n");
516 break;
517 case SYS_munmap:
518 no_implement("munmap\n");
519 break;
520 case SYS_nanosleep:
521 no_implement("nanosleep\n");
522 break;
523 case SYS_nice:
524 no_implement("nice\n");
525 break;
526 case SYS_open:
527 ret = shell_open((const char *)r->a, (int)r->b, (void *)r->c);
528 break;
529 case SYS_openat:
530 no_implement("openat\n");
531 break;
532 case SYS_pause:
533 no_implement("pause\n");
534 break;
535 case SYS_personality:
536 no_implement("personality\n");
537 break;
538 case SYS_pipe:
539 no_implement("pipe\n");
540 break;
541 case SYS_pipe2:
542 no_implement("pipe2\n");
543 break;
544 case SYS_pivot_root:
545 no_implement("pivot_root\n");
546 break;
547 case SYS_poll:
548 ret = shell_poll((struct pollfd *)r->a, (nfds_t)r->b, (int)r->c);
549 break;
550 case SYS_ppoll:
551 no_implement("ppoll\n");
552 break;
553 case SYS_prctl:
554 no_implement("prctl\n");
555 break;
556 case SYS_pread64:
557 no_implement("pread64\n");
558 break;
559 case SYS_preadv:
560 no_implement("preadv\n");
561 break;
562 case SYS_prlimit64:
563 no_implement("prlimit64\n");
564 break;
565 case SYS_process_vm_readv:
566 no_implement("process_vm_readv\n");
567 break;
568 case SYS_process_vm_writev:
569 no_implement("process_vm_writev\n");
570 break;
571 case SYS_pselect6:
572 no_implement("pselect6\n");
573 break;
574 case SYS_ptrace:
575 no_implement("ptrace\n");
576 break;
577 case SYS_pwrite64:
578 no_implement("pwrite64\n");
579 break;
580 case SYS_pwritev:
581 no_implement("pwritev\n");
582 break;
583 case SYS_quotactl:
584 no_implement("quotactl\n");
585 break;
586 case SYS_read:
587 ret = shell_read((int)r->a, (void *)r->b, (size_t)r->c);
588 break;
589 case SYS_readahead:
590 no_implement("readahead\n");
591 break;
592 case SYS_readlink:
593 no_implement("readlink\n");
594 break;
595 case SYS_readlinkat:
596 no_implement("readlinkat\n");
597 break;
598 case SYS_readv:
599 ret = shell_readv((int)r->a, (const struct iovec *)r->b, (int)r->c);
600 break;
601 case SYS_recv:
602 ret = shell_recv(r->a, (void *)r->b, (size_t)r->c, r->d);
603 break;
604 case SYS_recvfrom:
605 if (r->e == 0)
606 ret = shell_recv(r->a, (void *)r->b, (size_t)r->c, r->d);
607 else
608 ret = shell_recvfrom(r->a, (void *)r->b, (size_t)r->c, r->d, (struct sockaddr *)r->e, (socklen_t *)r->f);
609 break;
610 case SYS_recvmsg:
611 ret = shell_recvmsg(r->a, (struct msghdr *)r->b, (size_t)r->c);
612 break;
613 case SYS_reboot:
614 no_implement("reboot\n");
615 break;
616 case SYS_recvmmsg:
617 no_implement("recvmmsg\n");
618 break;
619 case SYS_remap_file_pages:
620 no_implement("remap_file_pages\n");
621 break;
622 case SYS_removexattr:
623 no_implement("removexattr\n");
624 break;
625 case SYS_rename:
626 ret = shell_rename((const char *)r->a, (const char *)r->b);
627 break;
628 case SYS_renameat:
629 no_implement("renameat\n");
630 break;
631 case SYS_rmdir:
632 ret = shell_rmdir((const char *)r->a);
633 break;
634 case SYS_rt_sigaction:
635 ret = shell_sigaction(r->a, (const struct sigaction *)r->b, (struct sigaction *)r->c);
636 break;
637 case SYS_rt_sigpending:
638 no_implement("rt_sigpending\n");
639 break;
640 case SYS_rt_sigprocmask:
641 ret = shell_sigprocmask(r->a, (const sigset_t *)r->b, (sigset_t *)r->c);
642 break;
643 case SYS_rt_sigqueueinfo:
644 no_implement("rt_sigqueueinfo\n");
645 break;
646 case SYS_rt_sigsuspend:
647 no_implement("rt_sigsuspend\n");
648 break;
649 case SYS_rt_sigtimedwait:
650 no_implement("rt_sigtimedwait\n");
651 break;
652 case SYS_send:
653 ret = shell_send(r->a, (const void *)r->b, (size_t)r->c, r->d);
654 break;
655 case SYS_sendmsg:
656 ret = shell_sendmsg(r->a, (const struct msghdr *)r->b, (size_t)r->c);
657 break;
658 case SYS_sendto:
659 if (r->e == 0)
660 ret = shell_send(r->a, (const void *)r->b, (size_t)r->c, r->d);
661 else
662 ret = shell_sendto(r->a, (const void *)r->b, (size_t)r->c, r->d, (const struct sockaddr *)r->e, (socklen_t)r->f);
663 break;
664 case SYS_setsockopt:
665 ret = shell_setsockopt(r->a, r->b, r->c, (const void *)r->d, (socklen_t)r->e);
666 break;
667 case SYS_shutdown:
668 ret = shell_shutdown(r->a, r->b);
669 break;
670 case SYS_sched_get_priority_max:
671 no_implement("sched_get_priority_max\n");
672 break;
673 case SYS_sched_get_priority_min:
674 no_implement("sched_get_priority_min\n");
675 break;
676 case SYS_sched_getaffinity:
677 no_implement("sched_getaffinity\n");
678 break;
679 case SYS_sched_getparam:
680 no_implement("sched_getparam\n");
681 break;
682 case SYS_sched_getscheduler:
683 no_implement("sched_getscheduler\n");
684 break;
685 case SYS_sched_rr_get_interval:
686 no_implement("sched_rr_get_interval\n");
687 break;
688 case SYS_sched_setaffinity:
689 no_implement("sched_setaffinity\n");
690 break;
691 case SYS_sched_setparam:
692 no_implement("sched_setparam\n");
693 break;
694 case SYS_sched_setscheduler:
695 no_implement("sched_setscheduler\n");
696 break;
697 case SYS_sched_yield:
698 no_implement("sched_yield\n");
699 break;
700 case SYS_semctl:
701 no_implement("semctl\n");
702 break;
703 case SYS_semget:
704 no_implement("semget\n");
705 break;
706 case SYS_semop:
707 no_implement("semop\n");
708 break;
709 case SYS_semtimedop:
710 no_implement("semtimedop\n");
711 break;
712 case SYS_sendfile64:
713 no_implement("sendfile\n");
714 break;
715 case SYS_sendmmsg:
716 no_implement("sendmmsg\n");
717 break;
718 case SYS_set_robust_list:
719 no_implement("set_robust_list\n");
720 break;
721#ifdef SYS_set_thread_area
722 case SYS_set_thread_area:
723 thread_area = (void *)r->a;
724 __asm__ __volatile__ ( "mcr p15,0,%0,c13,c0,3" :: "r"(thread_area) );
725 ret = 0;
726 break;
727#endif
728 case SYS_set_tid_address:
729 tid_address = (void *)r->a;
730 ret = 0;
731 break;
732 case SYS_setdomainname:
733 no_implement("setdomainname\n");
734 break;
735 case SYS_setfsgid32:
736 no_implement("setfsgid\n");
737 break;
738 case SYS_setfsuid32:
739 no_implement("setfsuid\n");
740 break;
741 case SYS_setgroups32:
742 no_implement("setgroups\n");
743 break;
744 case SYS_sethostname:
745 no_implement("sethostname\n");
746 break;
747 case SYS_setitimer:
748 no_implement("setitimer\n");
749 break;
750 case SYS_setns:
751 no_implement("setns\n");
752 break;
753 case SYS_setpgid:
754 no_implement("setpgid\n");
755 break;
756 case SYS_setpriority:
757 no_implement("setpriority\n");
758 break;
759 case SYS_setrlimit:
760 no_implement("setrlimit\n");
761 break;
762 case SYS_setsid:
763 no_implement("setsid\n");
764 break;
765 case SYS_settimeofday:
766 no_implement("settimeofday\n");
767 break;
768 case SYS_setxattr:
769 no_implement("setxattr\n");
770 break;
771 case SYS_shmat:
772 no_implement("shmat\n");
773 break;
774 case SYS_shmctl:
775 no_implement("shmctl\n");
776 break;
777 case SYS_shmdt:
778 no_implement("shmdt\n");
779 break;
780 case SYS_shmget:
781 no_implement("shmget\n");
782 break;
783 case SYS_sigaltstack:
784 no_implement("sigaltstack\n");
785 break;
786 case SYS_signalfd:
787 no_implement("signalfd\n");
788 break;
789 case SYS_signalfd4:
790 no_implement("signalfd4\n");
791 break;
792 case SYS_socket:
793 ret = shell_socket(r->a, r->b, r->c);
794 break;
795 case SYS_splice:
796 no_implement("splice\n");
797 break;
798 case SYS_stat64:
799 ret = shell_stat((const char *)r->a, (struct stat *)r->b);
800 break;
801 case SYS_statfs64:
802 no_implement("statfs64\n");
803 break;
804 case SYS_swapoff:
805 no_implement("swapoff\n");
806 break;
807 case SYS_swapon:
808 no_implement("swapon\n");
809 break;
810 case SYS_symlink:
811 no_implement("symlink\n");
812 break;
813 case SYS_symlinkat:
814 no_implement("symlinkat\n");
815 break;
816 case SYS_sync:
817 no_implement("sync\n");
818 break;
819#ifdef SYS_sync_file_range
820 case SYS_sync_file_range:
821 no_implement("sync_file_range\n");
822 break;
823#endif
824 case SYS_sync_file_range2:
825 no_implement("sync_file_range2\n");
826 break;
827 case SYS_syncfs:
828 no_implement("syncfs\n");
829 break;
830 case SYS_sysinfo:
831 no_implement("sysinfo\n");
832 break;
833 case SYS_syslog:
834 no_implement("syslog\n");
835 break;
836 case SYS_tee:
837 no_implement("tee\n");
838 break;
839 case SYS_tgkill:
840 no_implement("tgkill\n");
841 break;
842 case SYS_timer_create:
843 no_implement("timer_create\n");
844 break;
845 case SYS_timer_delete:
846 no_implement("timer_delete\n");
847 break;
848 case SYS_timer_getoverrun:
849 no_implement("timer_getoverrun\n");
850 break;
851 case SYS_timer_gettime:
852 no_implement("timer_gettime\n");
853 break;
854 case SYS_timer_settime:
855 no_implement("timer_settime\n");
856 break;
857 case SYS_timerfd_create:
858 no_implement("timerfd_create\n");
859 break;
860 case SYS_timerfd_gettime:
861 no_implement("timerfd_gettime\n");
862 break;
863 case SYS_timerfd_settime:
864 no_implement("timerfd_settime\n");
865 break;
866 case SYS_times:
867 no_implement("times\n");
868 break;
869 case SYS_tkill:
870 no_implement("tkill\n");
871 break;
872 case SYS_truncate64:
873 no_implement("truncate\n");
874 break;
875 case SYS_ugetrlimit:
876 no_implement("ugetrlimit\n");
877 break;
878 case SYS_umask:
879 no_implement("umask\n");
880 break;
881 case SYS_umount2:
882 no_implement("umount2\n");
883 break;
884 case SYS_uname:
885 ret = shell_uname((struct utsname *)r->a);
886 break;
887 case SYS_unlink:
888 ret = shell_unlink((const char *)r->a);
889 break;
890 case SYS_unlinkat:
891 no_implement("unlinkat\n");
892 break;
893 case SYS_unshare:
894 no_implement("unshare\n");
895 break;
896 case SYS_utimensat:
897 no_implement("utimensat\n");
898 break;
899 case SYS_utimes:
900 no_implement("utimes\n");
901 break;
902 case SYS_vhangup:
903 no_implement("vhangup\n");
904 break;
905 case SYS_vmsplice:
906 no_implement("vmsplice\n");
907 break;
908 case SYS_wait4:
909 no_implement("wait4\n");
910 break;
911 case SYS_waitid:
912 no_implement("waitid\n");
913 break;
914 case SYS_write:
915 ret = shell_write((int)r->a, (const void *)r->b, (size_t)r->c);
916 break;
917 case SYS_writev:
918 ret = shell_writev((int)r->a, (const struct iovec *)r->b, (size_t)r->c);
919 break;
920 default:
921 switch (r->n) {
922 case 0xf0002:
923 flash_access_cache_control();
924 ret = 0;
925 break;
926 case 0xf0005:
927 // __set_thread_area
928 thread_area = (void *)r->a;
929 __asm__ __volatile__ ( "mcr p15,0,%0,c13,c0,3" :: "r"(thread_area) );
930 ret = 0;
931 break;
932 default:
933 asm("bkpt #0");
934 break;
935 }
936 break;
937 }
938
939 shellif_outof();
940
941 return ret;
942}
943
944void __attribute__((naked)) __syscall_cp_asm()
945{
946 register long sp asm("sp");
947 asm("push {r0, r1, r2, r3, r4, r5, r7, r12, lr}");
948 __syscall((struct regs_t *)sp);
949 asm("add sp, sp, #4");
950 asm("pop {r1, r2, r3, r4, r5, r7, r12, pc}");
951}
952
953/*
954 * スーパバイザコール
955 */
956void __attribute__((naked)) _kernel_svc_handler(void)
957{
958 register long r0 asm("r0");
959 asm("srsfd #0x13!");
960 asm("stmfd sp!, {r0-r3,r12,lr}");
961 asm("mrs r0, spsr");
962 asm("tst r0, #0x20");
963 asm("ldrneh r0, [lr,#-2]");
964 asm("bicne r0, r0, #0xFF00");
965 asm("ldreq r0, [lr,#-4]");
966 asm("biceq r0, r0, #0xFF000000");
967 switch (r0){
968 case 0:
969 asm("str %0, [sp,#0x18]" :: "r"(__syscall_cp_asm));
970 break;
971 case 1:
972 asm("str %0, [sp,#0x18]" :: "r"(__mbedcall_cp_asm));
973 break;
974 }
975 asm("ldmfd sp!, {r0-r3,r12,lr}");
976 asm("rfefd sp!");
977}
Note: See TracBrowser for help on using the repository browser.