summaryrefslogtreecommitdiffstats
path: root/sys/syscall_vtt.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/syscall_vtt.c')
-rw-r--r--sys/syscall_vtt.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/sys/syscall_vtt.c b/sys/syscall_vtt.c
new file mode 100644
index 0000000..4b58b2c
--- /dev/null
+++ b/sys/syscall_vtt.c
@@ -0,0 +1,42 @@
+#include "jove.h"
+#include "lib/printf.h"
+#include "lib/virtterm.h"
+#include "syscall.h"
+
+static int
+s_syscall_vtt_write(
+ jove_owned_obj_t *vtt,
+ size_t payload_bytes,
+ void *payload_data)
+{
+ if(payload_bytes < sizeof(struct syscall_vtt_write)) {
+ kprintf("syscall_vtt_write: message is too small for this syscall!\n");
+ return EOOB;
+ }
+ struct syscall_vtt_write *payload = payload_data;
+ if(payload_bytes < sizeof(struct syscall_vtt_write) + payload->len) {
+ kprintf("syscall_vtt_write: message is to small for payload! (%i vs %i)\n",
+ payload->len, payload_bytes);
+ return EOOB;
+ }
+ return vt_write(vtt, payload->data, payload->len);
+}
+
+int
+_syscall_handle_vtt(
+ jove_owned_obj_t *pcb_obj,
+ jove_owned_obj_t *objdir,
+ jove_owned_obj_t *message_obj,
+ jove_owned_obj_t *target_obj,
+ struct syscall_header *header,
+ size_t bytes_left,
+ void *payload_data)
+{
+ switch(header->callid) {
+ case 0:
+ return s_syscall_vtt_write(target_obj, bytes_left, payload_data);
+ default:
+ kprintf("syscall_vtt: vtt object does not support syscall %i\n", header->callid);
+ return EOOB;
+ }
+}