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

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

ntshellアプリはnewlibを使うよう変更し、syscallの実装部分と区別がつくよう更新。

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