提交 b2705655 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

syscall.c -> syscall.cc

上级 19f389d9
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
#include "mmu.h" #include "mmu.h"
#include "spinlock.h" #include "spinlock.h"
#include "kalloc.h" #include "kalloc.h"
#include "syscall.h"
#include "kernel.h"
/* /*
* Data structures that use C99 designated initializers, * Data structures that use C99 designated initializers,
...@@ -43,3 +45,38 @@ struct kmem slabmem[slab_type_max][NCPU] = { ...@@ -43,3 +45,38 @@ struct kmem slabmem[slab_type_max][NCPU] = {
}, },
}; };
#define SYSCALL(name) [SYS_##name] = (void*)sys_##name
long (*syscalls[])(u64, 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(mkdir),
SYSCALL(mknod),
SYSCALL(open),
SYSCALL(pipe),
SYSCALL(read),
SYSCALL(sbrk),
SYSCALL(sleep),
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(kernlet),
};
...@@ -333,6 +333,7 @@ long sys_listen(int, int); ...@@ -333,6 +333,7 @@ long sys_listen(int, int);
long sys_accept(int, void*, void*); long sys_accept(int, void*, void*);
long sys_pread(int fd, void *ubuf, size_t count, off_t offset); long sys_pread(int fd, void *ubuf, size_t count, off_t offset);
long sys_kernlet(int, size_t, off_t); long sys_kernlet(int, size_t, off_t);
extern long (*syscalls[])(u64, 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);
......
extern "C" {
#include "types.h" #include "types.h"
#include "mmu.h" #include "mmu.h"
#include "kernel.h" #include "kernel.h"
...@@ -9,6 +10,7 @@ ...@@ -9,6 +10,7 @@
#include "syscall.h" #include "syscall.h"
#include "cpu.h" #include "cpu.h"
#include "kmtrace.h" #include "kmtrace.h"
}
// User code makes a system call with INT T_SYSCALL. // User code makes a system call with INT T_SYSCALL.
// System call number in %eax. // System call number in %eax.
...@@ -146,41 +148,6 @@ kmemcpy(void *umem, void *src, u64 size) ...@@ -146,41 +148,6 @@ kmemcpy(void *umem, void *src, u64 size)
return 0; return 0;
} }
#define SYSCALL(name) [SYS_##name] = (void*)sys_##name
static long (*syscalls[])(u64, 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(mkdir),
SYSCALL(mknod),
SYSCALL(open),
SYSCALL(pipe),
SYSCALL(read),
SYSCALL(sbrk),
SYSCALL(sleep),
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(kernlet),
};
void void
syscall(void) syscall(void)
{ {
...@@ -189,7 +156,7 @@ syscall(void) ...@@ -189,7 +156,7 @@ syscall(void)
tf = myproc()->tf; tf = myproc()->tf;
num = tf->rax; num = tf->rax;
if(num >= 0 && num < NELEM(syscalls) && syscalls[num]) { if(num >= 0 && num < SYS_ncount && syscalls[num]) {
mtstart(syscalls[num], myproc()); mtstart(syscalls[num], myproc());
mtrec(); mtrec();
tf->rax = syscalls[num](tf->rdi, tf->rsi, tf->rdx, tf->rax = syscalls[num](tf->rdi, tf->rsi, tf->rdx,
......
...@@ -29,3 +29,4 @@ ...@@ -29,3 +29,4 @@
#define SYS_accept 28 #define SYS_accept 28
#define SYS_pread 29 #define SYS_pread 29
#define SYS_kernlet 30 #define SYS_kernlet 30
#define SYS_ncount 31 /* total number of system calls */
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论