summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/comus/syscalls.h3
-rw-r--r--kernel/syscall.c22
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)