提交 a30a97a0 创建 作者: Austin Clements's avatar Austin Clements

Move syscall entry list to syscall.cc

This requires them to be in order, since we can't use C99 initializers, but we're going to autogenerate this list shortly anyway. The main advantage is that this lets us use C++ types for arguments.
上级 e3a2f2ae
...@@ -55,7 +55,6 @@ int sys_setfs(u64 base); ...@@ -55,7 +55,6 @@ int sys_setfs(u64 base);
int sys_wqwait(void); int sys_wqwait(void);
int sys_setaffinity(int cpu); int sys_setaffinity(int cpu);
long sys_futex(const u64* addr, int op, u64 val, u64 timer); long sys_futex(const u64* addr, int op, u64 val, u64 timer);
extern long (*syscalls[])(u64, u64, u64, u64, u64);
// other exported/imported functions // other exported/imported functions
void cmain(u64 mbmagic, u64 mbaddr); void cmain(u64 mbmagic, u64 mbaddr);
......
#include "types.h" #include "types.h"
#include "mmu.h" #include "mmu.h"
#include "spinlock.h"
#include "syscall.h"
#include "kern_c.h"
/* /*
* Data structures that use C99 designated initializers, * Data structures that use C99 designated initializers,
...@@ -25,43 +22,3 @@ struct segdesc __attribute__((aligned(16))) bootgdt[NSEGS] = { ...@@ -25,43 +22,3 @@ struct segdesc __attribute__((aligned(16))) bootgdt[NSEGS] = {
// 64-bit user code // 64-bit user code
[7]=SEGDESC(0, 0, SEG_R|SEG_CODE|SEG_S|SEG_DPL(3)|SEG_P|SEG_L|SEG_G), [7]=SEGDESC(0, 0, SEG_R|SEG_CODE|SEG_S|SEG_DPL(3)|SEG_P|SEG_L|SEG_G),
}; };
#define SYSCALL(name) [SYS_##name] = (void*)sys_##name
long (*syscalls[])(u64, u64, u64, u64, u64) = {
SYSCALL(chdir),
SYSCALL(close),
SYSCALL(dup),
SYSCALL(exec),
SYSCALL(exit),
SYSCALL(fork),
SYSCALL(fstat),
SYSCALL(getpid),
SYSCALL(kill),
SYSCALL(link),
SYSCALL(mkdirat),
SYSCALL(mknod),
SYSCALL(openat),
SYSCALL(pipe),
SYSCALL(read),
SYSCALL(sbrk),
SYSCALL(nsleep),
SYSCALL(unlink),
SYSCALL(wait),
SYSCALL(write),
SYSCALL(uptime),
SYSCALL(map),
SYSCALL(unmap),
SYSCALL(halt),
SYSCALL(socket),
SYSCALL(bind),
SYSCALL(listen),
SYSCALL(accept),
SYSCALL(pread),
SYSCALL(async),
SYSCALL(script),
SYSCALL(setfs),
SYSCALL(wqwait),
SYSCALL(setaffinity),
SYSCALL(futex),
};
...@@ -77,6 +77,47 @@ argcheckptr(const void *p, int size) ...@@ -77,6 +77,47 @@ argcheckptr(const void *p, int size)
return 0; return 0;
} }
#define SYSCALL(name) (long(*)(u64,u64,u64,u64,u64))sys_##name
static long (*syscalls[])(u64, u64, u64, u64, u64) = {
nullptr,
SYSCALL(fork),
SYSCALL(exit),
SYSCALL(wait),
SYSCALL(pipe),
SYSCALL(write),
SYSCALL(read),
SYSCALL(close),
SYSCALL(kill),
SYSCALL(exec),
SYSCALL(openat),
SYSCALL(mknod),
SYSCALL(unlink),
SYSCALL(fstat),
SYSCALL(link),
SYSCALL(mkdirat),
SYSCALL(chdir),
SYSCALL(dup),
SYSCALL(getpid),
SYSCALL(sbrk),
SYSCALL(nsleep),
SYSCALL(uptime),
SYSCALL(map),
SYSCALL(unmap),
SYSCALL(halt),
SYSCALL(socket),
SYSCALL(bind),
SYSCALL(listen),
SYSCALL(accept),
SYSCALL(pread),
SYSCALL(async),
SYSCALL(script),
SYSCALL(setfs),
SYSCALL(wqwait),
SYSCALL(setaffinity),
SYSCALL(futex),
};
u64 u64
syscall(u64 a0, u64 a1, u64 a2, u64 a3, u64 a4, u64 num) syscall(u64 a0, u64 a1, u64 a2, u64 a3, u64 a4, u64 num)
{ {
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论