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

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

NTShellタスクを更新

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