aboutsummaryrefslogtreecommitdiff
path: root/kernel/features/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/features/syscall.c')
-rw-r--r--kernel/features/syscall.c36
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;