diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/include/comus/syscalls.h | 3 | ||||
-rw-r--r-- | kernel/syscall.c | 22 |
2 files changed, 24 insertions, 1 deletions
diff --git a/kernel/include/comus/syscalls.h b/kernel/include/comus/syscalls.h index f27b879..ffc9d1b 100644 --- a/kernel/include/comus/syscalls.h +++ b/kernel/include/comus/syscalls.h @@ -32,9 +32,10 @@ #define SYS_ticks 19 #define SYS_allocshared 20 #define SYS_popsharedmem 21 +#define SYS_keypoll 22 // UPDATE THIS DEFINITION IF MORE SYSCALLS ARE ADDED! -#define N_SYSCALLS 22 +#define N_SYSCALLS 23 // interrupt vector entry for system calls #define VEC_SYSCALL 0x80 diff --git a/kernel/syscall.c b/kernel/syscall.c index 2b98ec1..d98f886 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1,6 +1,7 @@ #include <comus/user.h> #include <comus/cpu.h> #include <comus/syscalls.h> +#include <comus/input.h> #include <comus/drivers/acpi.h> #include <comus/drivers/gpu.h> #include <comus/drivers/pit.h> @@ -397,6 +398,26 @@ static int sys_allocshared(void) return 0; } +// NOTE: observes AND consumes the key event +static int sys_keypoll(void) +{ + ARG1(struct keycode *, keyev); + RET(int, waspressed); + + void *ouraddr = kmapuseraddr(pcb->memctx, keyev, sizeof(struct keycode)); + + if (keycode_pop(ouraddr)) { + kunmapaddr(ouraddr); + *waspressed = false; + return 0; + } + + kunmapaddr(ouraddr); + + *waspressed = true; + return 0; +} + static int (*syscall_tbl[N_SYSCALLS])(void) = { [SYS_exit] = sys_exit, [SYS_waitpid] = sys_waitpid, @@ -420,6 +441,7 @@ static int (*syscall_tbl[N_SYSCALLS])(void) = { [SYS_ticks] = sys_ticks, [SYS_allocshared] = sys_allocshared, [SYS_popsharedmem] = sys_popsharedmem, + [SYS_keypoll] = sys_keypoll, }; void syscall_handler(void) |