nuclear@51: #include nuclear@51: #include "syscall.h" nuclear@51: #include "intr.h" nuclear@51: #include "proc.h" nuclear@51: #include "sched.h" nuclear@51: #include "timer.h" nuclear@51: nuclear@51: static int (*sys_func[NUM_SYSCALLS])(); nuclear@51: nuclear@52: static void syscall(int inum); nuclear@51: nuclear@51: static int sys_exit(int status); nuclear@51: static int sys_hello(void); nuclear@51: static int sys_sleep(int sec); nuclear@51: nuclear@51: void init_syscall(void) nuclear@51: { nuclear@51: sys_func[SYS_EXIT] = sys_exit; nuclear@51: sys_func[SYS_HELLO] = sys_hello; nuclear@51: sys_func[SYS_SLEEP] = sys_sleep; nuclear@51: nuclear@51: interrupt(SYSCALL_INT, syscall); nuclear@51: } nuclear@51: nuclear@52: static void syscall(int inum) nuclear@51: { nuclear@52: struct intr_frame *frm; nuclear@52: int idx; nuclear@52: nuclear@52: frm = get_intr_frame(); nuclear@52: idx = frm->regs.eax; nuclear@51: nuclear@51: if(idx < 0 || idx >= NUM_SYSCALLS) { nuclear@51: printf("invalid syscall: %d\n", idx); nuclear@51: return; nuclear@51: } nuclear@51: nuclear@51: frm->regs.eax = sys_func[idx](frm->regs.ebx, frm->regs.ecx, frm->regs.edx, frm->regs.esi, frm->regs.edi); nuclear@51: schedule(); nuclear@51: } nuclear@51: nuclear@51: static int sys_exit(int status) nuclear@51: { nuclear@51: return -1; /* not implemented yet */ nuclear@51: } nuclear@51: nuclear@51: static int sys_hello(void) nuclear@51: { nuclear@51: /*printf("process %d says hello!\n", get_current_pid());*/ nuclear@51: return 0; nuclear@51: } nuclear@51: nuclear@51: static int sys_sleep(int sec) nuclear@51: { nuclear@51: int pid = get_current_pid(); nuclear@51: /*printf("process %d will sleep for %d sec\n", pid, sec);*/ nuclear@51: start_timer(sec * 1000, (timer_func_t)unblock_proc, (void*)pid); nuclear@51: block_proc(pid); nuclear@51: return 0; nuclear@51: }