Skip to content

Commit f44612b

Browse files
committed
增加部分 riscv64 系统调用.
1 parent ba578f7 commit f44612b

File tree

2 files changed

+62
-7
lines changed

2 files changed

+62
-7
lines changed

src/arch/riscv64/include/nr.h

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,32 @@ typedef uint64_t (*syscall_t)(
1212
struct pt_regs *regs
1313
);
1414

15-
15+
#define SYSCALL_IOCTL 29
16+
#define SYSCALL_MOUNT 40
17+
#define SYSCALL_OPENAT 56
18+
#define SYSCALL_CLOSE 57
19+
#define SYSCALL_PIPE2 59
20+
#define SYSCALL_LSEEK 62
21+
#define SYSCALL_READ 63
22+
#define SYSCALL_WRITE 64
23+
#define SYSCALL_READV 65
24+
#define SYSCALL_WRITEV 66
25+
#define SYSCALL_PREAD 67
26+
#define SYSCALL_PWRITE 68
27+
#define SYSCALL_PREADV 69
28+
#define SYSCALL_PWRITEV 70
29+
#define SYSCALL_EXIT 93
30+
#define SYSCALL_EXIT_GROUP 94
31+
#define SYSCALL_NANOSLEEP 101
32+
#define SYSCALL_SYSLOG 116
33+
#define SYSCALL_SCHED_YIELD 124
34+
#define SYSCALL_REBOOT 142
35+
#define SYSCALL_GETRLIMIT 163
36+
#define SYSCALL_GETPID 172
37+
#define SYSCALL_GETPPID 173
38+
#define SYSCALL_MUNMAP 215
39+
#define SYSCALL_MREMAP 216
40+
#define SYSCALL_MMAP 222
41+
#define SYSCALL_PRLIMIT64 261
42+
#define SYSCALL_COPY_FILE_RANGE 295
43+
#define SYSCALL_FUTEX 422

src/arch/riscv64/syscall.c

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,49 @@
44
#include "nr.h"
55
#include "term/klog.h"
66

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,
935
};
1036

1137
void syscall_handler(struct pt_regs *regs) {
1238
uint64_t syscall_id = regs->a7 & 0xFFFFFFFF;
1339

1440
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](
1743
regs->a0, regs->a1, regs->a2, regs->a3, regs->a4, regs->a5, regs
1844
);
19-
csr_clear(sstatus, (1UL << 18));
45+
csr_clear(sstatus, 1UL << 18);
2046
} else {
21-
if (unlikely(syscall_id != 12))
47+
if (unlikely(syscall_id != 214)) {
2248
logkf("Syscall(%d) cannot implemented.\n", syscall_id);
49+
}
2350
regs->a0 = SYSCALL_FAULT_(ENOSYS);
2451
}
2552
}

0 commit comments

Comments
 (0)