summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/syscall.h11
-rw-r--r--doc/syscall.md11
-rw-r--r--sys/syscall.h1
-rw-r--r--sys/syscall_message.c16
4 files changed, 39 insertions, 0 deletions
diff --git a/api/syscall.h b/api/syscall.h
index 9f8ec13..5658ac2 100644
--- a/api/syscall.h
+++ b/api/syscall.h
@@ -150,6 +150,17 @@ struct syscall_initrd_file_read
size_t read_size;
};
+/**JOVE_OBJ_MESSAGE syscalls.
+ * */
+
+enum
+{
+ _SYSCALL_MESSAGE_NONE = 0,
+ SYSCALL_MESSAGE_SIZE
+};
+
+#define SYSCALL_PERM_MESSAGE_SIZE (JOVE_PERM_READ)
+
/**JOVE_OBJ_VIRTTERM syscalls.*/
enum
diff --git a/doc/syscall.md b/doc/syscall.md
index 3bfa00b..5a3d1e7 100644
--- a/doc/syscall.md
+++ b/doc/syscall.md
@@ -314,3 +314,14 @@ If the read size + starting index > file size, the kernel will return `-EOOB`.
If the message is too small for the read bytes, the kernel will return `-ETOOBIG`.
Successful reading returns `0`.
+
+
+### JOVE_OBJ_MESSAGE
+
+| Syscall | Target Permissions |
+|----------------------|--------------------|
+| SYSCALL_MESSAGE_SIZE | JOVE_PERM_READ |
+
+#### SYSCALL_MESSAGE_SIZE
+
+Returns the size of the message object in bytes.
diff --git a/sys/syscall.h b/sys/syscall.h
index ab13118..461b104 100644
--- a/sys/syscall.h
+++ b/sys/syscall.h
@@ -58,5 +58,6 @@ int _syscall_handle_objdir(syscall_context_t *ctx);
int _syscall_handle_untyped(syscall_context_t *ctx);
int _syscall_handle_pagedir(syscall_context_t *ctx);
int _syscall_handle_initrd_file(syscall_context_t *ctx);
+int _syscall_handle_message(syscall_context_t *ctx);
#endif
diff --git a/sys/syscall_message.c b/sys/syscall_message.c
new file mode 100644
index 0000000..5edf33f
--- /dev/null
+++ b/sys/syscall_message.c
@@ -0,0 +1,16 @@
+#include "api/error.h"
+#include "sys/message.h"
+#include "sys/syscall.h"
+
+int
+_syscall_handle_message(syscall_context_t *ctx)
+{
+ switch(ctx->header->callid) {
+ case SYSCALL_OBJDIR_OBJTYPE:
+ if(ctx->target.permissions & SYSCALL_PERM_OBJDIR_OBJTYPE)
+ return message_len(ctx->message.obj);
+ return -EPERM;
+ default:
+ return -EBADCALL;
+ }
+}