Mercurial > hg > CbC > CbC_xv6
view src/impl/SyscallDispatchImpl.cbc @ 381:874577d7505f
fix parse for interface
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 20 Jul 2020 15:00:11 +0900 (2020-07-20) |
parents | 6fc38a3f38f9 |
children |
line wrap: on
line source
#include "types.h" #include "defs.h" #include "param.h" #include "memlayout.h" #include "mmu.h" #include "proc.h" #include "arm.h" #include "syscall.h" #include "../../kernel.h" #interface "SyscallDispatch.h" #interface "KernelRet.h" extern int sys_chdir(void); extern int sys_close(void); extern int sys_dup(void); extern int sys_exec(void); extern int sys_exit(void); extern int sys_fork(void); extern int sys_fstat(void); extern int sys_getpid(void); extern int sys_kill(void); extern int sys_link(void); extern int sys_mkdir(void); extern int sys_mknod(void); extern int sys_open(void); extern int sys_pipe(void); extern int sys_read(void); extern int sys_sbrk(void); extern int sys_sleep(void); extern int sys_unlink(void); extern int sys_wait(void); extern int sys_write(void); extern int sys_uptime(void); extern __code cbc_read(__code(*)(int)); static int (*syscalls[])(void) = { [SYS_fork] =sys_fork, [SYS_exit] =sys_exit, [SYS_wait] =sys_wait, [SYS_pipe] =sys_pipe, [SYS_read] =sys_read, [SYS_kill] =sys_kill, [SYS_exec] =sys_exec, [SYS_fstat] =sys_fstat, [SYS_chdir] =sys_chdir, [SYS_dup] =sys_dup, [SYS_getpid] =sys_getpid, [SYS_sbrk] =sys_sbrk, [SYS_sleep] =sys_sleep, [SYS_uptime] =sys_uptime, [SYS_open] =sys_open, [SYS_write] =sys_write, [SYS_mknod] =sys_mknod, [SYS_unlink] =sys_unlink, [SYS_link] =sys_link, [SYS_mkdir] =sys_mkdir, [SYS_close] =sys_close, }; static __code (*cbccodes[])(__code (*)(int)) = { [SYS_cbc_read] = cbc_read, }; // ---- // typedef struct SyscallDispatchImpl <Type, Isa> impl SyscallDispatch { // __code next(....); // } SyscallDispatchImpl; // ---- SyscallDispatch* createSyscallDispatchImpl(struct Context* cbc_context) { struct SyscallDispatch* syscall_dispatch = new SyscallDispatch(); struct SyscallDispatchImpl* syscall_dispatch_impl = new SyscallDispatchImpl(); syscall_dispatch->syscall_dispatch = (union Data*)syscall_dispatch_impl; syscall_dispatch->dispatch = C_dispatchSyscallDispatchImpl; return syscall_dispatch; } __code dispatchSyscallDispatchImpl(struct SyscallDispatchImpl* syscall_dispatch, __code next(...)) { KernelContext* kcontext = kernel_context; kcontext->now_proc = proc; proc->cbc_context.proc = proc; int num = proc->tf->r0; if (num == 5) num = 22; struct KernelRet* kernelRet = createKernelRetImpl(cbc_context); if((num >= NELEM(syscalls)) && (num <= NELEM(cbccodes)) && cbccodes[num]) { proc->cbc_arg.cbc_console_arg.num = num; __code *syscalls = kcontext->syscalls; goto (cbccodes[num])(cbc_ret); //goto meta(&proc->cbc_context, cbccodes[num]); } if((num > 0) && (num < NELEM(syscalls)) && syscalls[num]) { int ret = syscalls[num](); // in ARM, parameters to main (argc, argv) are passed in r0 and r1 // do not set the return value if it is SYS_exec (the user program // anyway does not expect us to return anything). goto kernelRet->cbc_return(ret); } cprintf("%d %s: unknown sys call %d\n", proc->pid, proc->name, num); goto kernelRet->cbc_return(-1); }