diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-05-12 15:52:25 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-05-12 15:52:25 +0300 |
| commit | 1ea7d9dec1b460ab76dfd6270596c8138c9c2b40 (patch) | |
| tree | 0e8799fe0d7a653e864bd90c65a29e4012026f71 /common/uapi | |
| parent | 42a1e087ce99f07b48aaea5552f8e1ce5219d228 (diff) | |
| download | kmi-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')
| -rw-r--r-- | common/uapi/mem.c | 27 |
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}; } |
