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

syscall.c -> syscall.cc

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