aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/mem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-05-12 15:52:25 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-05-12 15:52:25 +0300
commit1ea7d9dec1b460ab76dfd6270596c8138c9c2b40 (patch)
tree0e8799fe0d7a653e864bd90c65a29e4012026f71 /common/uapi/mem.c
parent42a1e087ce99f07b48aaea5552f8e1ce5219d228 (diff)
downloadkmi-1ea7d9dec1b460ab76dfd6270596c8138c9c2b40.tar.gz
kmi-1ea7d9dec1b460ab76dfd6270596c8138c9c2b40.zip
initial workings of shared memory
+ Should document this better but essentially a server requests a shared buffer, and chan then share this buffer to a thread. Freeing the buffer is done through normal means. MR_SHARED is used for buffers that are shared, and MR_OWNED tells whoever is freeing that region that it is allowed to free the physical memory behind the shared buffer.
Diffstat (limited to 'common/uapi/mem.c')
-rw-r--r--common/uapi/mem.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/common/uapi/mem.c b/common/uapi/mem.c
index bc3c7fa..ace40b9 100644
--- a/common/uapi/mem.c
+++ b/common/uapi/mem.c
@@ -41,10 +41,27 @@ SYSCALL_DEFINE3(req_pmem)(sys_arg_t paddr, sys_arg_t size, sys_arg_t flags)
return (struct sys_ret){ OK, alloc_devmem(r, paddr, size, flags) };
}
-SYSCALL_DEFINE4(req_sharedmem)
-(sys_arg_t tid, sys_arg_t start, sys_arg_t size, sys_arg_t flags)
+SYSCALL_DEFINE2(req_sharedmem)
+(sys_arg_t size, sys_arg_t flags)
{
- /* called by server, take memory allocation at start and map it into
- * tid's address space? */
- return (struct sys_ret){ OK, 0 };
+ /* TODO: check that requester is server */
+ struct tcb *t = cur_tcb();
+ vm_t start = 0;
+ if ((start = alloc_shared_uvmem(t, size, flags)))
+ return (struct sys_ret){ ERR_OOMEM, 0 };
+
+ return (struct sys_ret){ OK, start};
+}
+
+/* add a syscall like ref_sharedmem that adds a reference to an existing shared
+ * memory region to a new tid? */
+SYSCALL_DEFINE3(ref_sharedmem)(sys_arg_t tid, sys_arg_t va, sys_arg_t flags)
+{
+ struct tcb *t1 = cur_tcb();
+ struct tcb *t2 = get_tcb(tid);
+ vm_t start = 0;
+ if ((start = ref_shared_uvmem(t1, t2, va, flags)))
+ return (struct sys_ret){ERR_OOMEM, 0};
+
+ return (struct sys_ret) {OK, start};
}