From 1ea7d9dec1b460ab76dfd6270596c8138c9c2b40 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Thu, 12 May 2022 15:52:25 +0300 Subject: 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. --- common/uapi/mem.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'common/uapi') 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}; } -- cgit v1.3