Mercurial > hg > CbC > CbC_xv6
changeset 370:8e1d4f238dc8
rename
author | anatofuz |
---|---|
date | Sun, 05 Jul 2020 15:00:22 +0900 |
parents | d67449aae7cd |
children | 96655612f48c |
files | src/impl/SyscallDispatchImpl.cbc src/impl/SyscallDispatchImpl.h src/impl/SyscallImpl.cbc src/impl/SyscallImpl.h src/interface/Syscall.h src/interface/SyscallDispatch.h |
diffstat | 6 files changed, 125 insertions(+), 128 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/impl/SyscallDispatchImpl.cbc Sun Jul 05 15:00:22 2020 +0900 @@ -0,0 +1,118 @@ +#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_dispatchSyscallImpl; + return syscall; +} + +__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])(kernelRet->cbc_return); + //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); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/impl/SyscallDispatchImpl.h Sun Jul 05 15:00:22 2020 +0900 @@ -0,0 +1,3 @@ +typedef struct SyscallDispatchImpl <Type, Isa> impl SyscallDispatch { + __code next(....); +} SyscallDispatchImpl;
--- a/src/impl/SyscallImpl.cbc Sun Jul 05 14:37:50 2020 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -#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 "Syscall.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 SyscallImpl <Type, Isa> impl Syscall { -// __code next(....); -// } SyscallImpl; -// ---- - -Syscall* createSyscallImpl(struct Context* cbc_context) { - struct Syscall* syscall = new Syscall(); - struct SyscallImpl* syscall_impl = new SyscallImpl(); - syscall->syscall = (union Data*)syscall_impl; - syscall->dispatch = C_dispatchSyscallImpl; - return syscall; -} - -__code dispatchSyscallImpl(struct SyscallImpl* syscall, __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; - - - 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]); - } - - struct KernelRet* kernelRet = createKernelRetImpl(cbc_context); - - 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); -} -
--- a/src/impl/SyscallImpl.h Sun Jul 05 14:37:50 2020 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -typedef struct SyscallImpl <Type, Isa> impl Syscall { - __code next(....); -} SyscallImpl;