diff options
Diffstat (limited to 'kernel/features/syscall.c')
-rw-r--r-- | kernel/features/syscall.c | 36 |
1 files changed, 12 insertions, 24 deletions
diff --git a/kernel/features/syscall.c b/kernel/features/syscall.c index e2df79a..d980317 100644 --- a/kernel/features/syscall.c +++ b/kernel/features/syscall.c @@ -1,7 +1,6 @@ // MIT License, Copyright (c) 2020 Marvin Borner #include <cpu.h> -#include <event.h> #include <fs.h> #include <interrupts.h> #include <load.h> @@ -38,7 +37,18 @@ void syscall_handler(struct regs *r) break; } case SYS_READ: { - r->eax = (u32)vfs_read((char *)r->ebx, (void *)r->ecx, r->edx, r->esi); + if (vfs_ready((char *)r->ebx)) { + r->eax = (u32)vfs_read((char *)r->ebx, (void *)r->ecx, r->edx, r->esi); + } else { + struct proc *p = proc_current(); + p->state = PROC_SLEEPING; + p->wait.id = vfs_find_dev((char *)r->ebx)->id; + p->wait.func = vfs_read; + proc_yield(r); + sti(); + while (1) + hlt(); + } break; } case SYS_WRITE: { @@ -74,28 +84,6 @@ void syscall_handler(struct regs *r) r->eax = timer_get(); break; } - case SYS_REGISTER: { - event_register(r->ebx, proc_current()); - break; - } - case SYS_UNREGISTER: { - event_unregister(r->ebx, proc_current()); - break; - } - case SYS_SEND: { - proc_send(proc_current(), proc_from_pid(r->ebx), r->ecx, (void *)r->edx); - proc_yield(r); - break; - } - case SYS_RECEIVE: { - struct proc_message *msg = proc_receive(proc_current()); - r->eax = (u32)(msg ? msg->msg : NULL); - break; - } - case SYS_GETPID: { - r->eax = proc_current()->pid; - break; - } case SYS_NET_OPEN: { r->eax = (int)net_open(r->ebx); break; |