|
4 | 4 | #include "nr.h" |
5 | 5 | #include "term/klog.h" |
6 | 6 |
|
7 | | -syscall_t syscall_handlers[MAX_SYSCALLS] = { |
8 | | - |
| 7 | +static syscall_t syscall_handlers[MAX_SYSCALLS] = { |
| 8 | + [SYSCALL_READ] = (syscall_t)syscall_read, |
| 9 | + [SYSCALL_WRITE] = (syscall_t)syscall_write, |
| 10 | + [SYSCALL_CLOSE] = (syscall_t)syscall_close, |
| 11 | + [SYSCALL_IOCTL] = (syscall_t)syscall_ioctl, |
| 12 | + [SYSCALL_LSEEK] = (syscall_t)syscall_lseek, |
| 13 | + [SYSCALL_READV] = (syscall_t)syscall_readv, |
| 14 | + [SYSCALL_WRITEV] = (syscall_t)syscall_writev, |
| 15 | + [SYSCALL_PREAD] = (syscall_t)syscall_pread, |
| 16 | + [SYSCALL_PWRITE] = (syscall_t)syscall_pwrite, |
| 17 | + [SYSCALL_OPENAT] = (syscall_t)syscall_open, |
| 18 | + [SYSCALL_EXIT] = (syscall_t)syscall_exit, |
| 19 | + [SYSCALL_EXIT_GROUP] = (syscall_t)syscall_exit_group, |
| 20 | + [SYSCALL_MOUNT] = (syscall_t)syscall_mount, |
| 21 | + [SYSCALL_PIPE2] = (syscall_t)syscall_pipe2, |
| 22 | + [SYSCALL_REBOOT] = (syscall_t)syscall_reboot, |
| 23 | + [SYSCALL_GETPID] = (syscall_t)syscall_getpid, |
| 24 | + [SYSCALL_GETPPID] = (syscall_t)syscall_getppid, |
| 25 | + [SYSCALL_MUNMAP] = (syscall_t)syscall_munmap, |
| 26 | + [SYSCALL_MREMAP] = (syscall_t)syscall_mremap, |
| 27 | + [SYSCALL_MMAP] = (syscall_t)syscall_mmap, |
| 28 | + [SYSCALL_FUTEX] = (syscall_t)syscall_futex, |
| 29 | + [SYSCALL_GETRLIMIT] = (syscall_t)syscall_get_rlimit, |
| 30 | + [SYSCALL_PRLIMIT64] = (syscall_t)syscall_prlimit64, |
| 31 | + [SYSCALL_COPY_FILE_RANGE] = (syscall_t)syscall_copy_file_range, |
| 32 | + [SYSCALL_SYSLOG] = (syscall_t)syscall_sys_log, |
| 33 | + [SYSCALL_SCHED_YIELD] = (syscall_t)syscall_yield, |
| 34 | + [SYSCALL_NANOSLEEP] = (syscall_t)syscall_nano_sleep, |
9 | 35 | }; |
10 | 36 |
|
11 | 37 | void syscall_handler(struct pt_regs *regs) { |
12 | 38 | uint64_t syscall_id = regs->a7 & 0xFFFFFFFF; |
13 | 39 |
|
14 | 40 | if (likely(syscall_id < MAX_SYSCALLS && syscall_handlers[syscall_id] != NULL)) { |
15 | | - csr_set(sstatus, (1UL << 18)); |
16 | | - regs->a0 = (syscall_handlers[syscall_id])( |
| 41 | + csr_set(sstatus, 1UL << 18); |
| 42 | + regs->a0 = syscall_handlers[syscall_id]( |
17 | 43 | regs->a0, regs->a1, regs->a2, regs->a3, regs->a4, regs->a5, regs |
18 | 44 | ); |
19 | | - csr_clear(sstatus, (1UL << 18)); |
| 45 | + csr_clear(sstatus, 1UL << 18); |
20 | 46 | } else { |
21 | | - if (unlikely(syscall_id != 12)) |
| 47 | + if (unlikely(syscall_id != 214)) { |
22 | 48 | logkf("Syscall(%d) cannot implemented.\n", syscall_id); |
| 49 | + } |
23 | 50 | regs->a0 = SYSCALL_FAULT_(ENOSYS); |
24 | 51 | } |
25 | 52 | } |
0 commit comments