From 131af4eec38752a27e6e56579fbf76178e022ec1 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Thu, 1 Dec 2022 02:05:19 +0200 Subject: start looking into memory handling + Now 10M alloc/frees succeed, which totals more memory than the virtual machine has, so no too obvious leaks are occuring. For future debugging speed, changed 10M to 1M. + Also quick fix to rpcs, stacks are now assigned. Not entirely sure why they worked before this, but good that I found it. --- common/uapi/ipc.c | 5 ++--- common/uapi/mem.c | 47 +++++++++++++++-------------------------------- 2 files changed, 17 insertions(+), 35 deletions(-) (limited to 'common/uapi') diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c index 93717e4..70f5fe7 100644 --- a/common/uapi/ipc.c +++ b/common/uapi/ipc.c @@ -60,8 +60,7 @@ static void do_ipc(struct tcb *t, return_args(t, SYS_RET1(ERR_NOINIT)); clone_uvmem(r->proc.vmem, t->rpc.vmem); - use_vmem(t->rpc.vmem); - save_context(t); + enter_rpc(t); set_return(t, r->callback); attach_rpc(r, t); @@ -122,7 +121,7 @@ SYSCALL_DEFINE4(ipc_resp)(struct tcb *t, sys_arg_t d0, sys_arg_t d1, sys_arg_t d3) { struct tcb *r = get_cproc(t); - load_context(t); + leave_rpc(t); detach_rpc(r, t); if (is_rpc(t)) diff --git a/common/uapi/mem.c b/common/uapi/mem.c index 1de63f1..374bcbe 100644 --- a/common/uapi/mem.c +++ b/common/uapi/mem.c @@ -25,7 +25,8 @@ SYSCALL_DEFINE2(req_mem)(struct tcb *t, sys_arg_t size, sys_arg_t flags) { struct tcb *r = get_cproc(t); vm_t start = 0; - if ((start = alloc_uvmem(r, size, flags))) + /** @todo expose flags to users */ + if (!(start = alloc_uvmem(r, size, flags))) return_args(t, SYS_RET1(ERR_OOMEM)); return_args(t, SYS_RET2(OK, start)); @@ -46,7 +47,7 @@ SYSCALL_DEFINE3(req_fixmem)(struct tcb *t, sys_arg_t fixed, sys_arg_t size, { struct tcb *r = get_cproc(t); vm_t start = 0; - if ((start = alloc_fixed_uvmem(r, fixed, size, flags))) + if (!(start = alloc_fixed_uvmem(r, fixed, size, flags))) return_args(t, SYS_RET1(ERR_OOMEM)); return_args(t, SYS_RET2(OK, start)); @@ -65,15 +66,15 @@ SYSCALL_DEFINE1(free_mem)(struct tcb *t, sys_arg_t start) vm_t vm_start = (vm_t)start; stat_t status = OK; - if (vm_start > __pre_top && vm_start < __post_base) - status = free_uvmem(r, vm_start); - else - status = free_devmem(r, vm_start); + /* try freeing normal user memory first, if that fails, try device + * memory, otherwise just assume the address is borked. */ + if (!(status = free_uvmem(r, vm_start))) + return_args(t, SYS_RET1(OK)); - if (status) - return_args(t, SYS_RET1(ERR_NF)); + if (!(status = free_devmem(r, vm_start))) + return_args(t, SYS_RET1(OK)); - return_args(t, SYS_RET1(OK)); + return_args(t, SYS_RET1(status)); } /** @@ -96,7 +97,7 @@ SYSCALL_DEFINE3(req_pmem)(struct tcb *t, sys_arg_t paddr, sys_arg_t size, */ struct tcb *r = get_cproc(t); vm_t start = 0; - if ((start = alloc_devmem(r, paddr, size, flags))) + if (!(start = alloc_devmem(r, paddr, size, flags))) return_args(t, SYS_RET1(ERR_OOMEM)); return_args(t, SYS_RET2(OK, start)); @@ -110,34 +111,16 @@ SYSCALL_DEFINE3(req_pmem)(struct tcb *t, sys_arg_t paddr, sys_arg_t size, * @param flags Flags of allocation. * @return \ref OK and start of allocation when succesful, * \ref ERR_OOMEM and \c NULL otherwise. + * + * @todo should we also take the thread who should get the other end of the + * memory? */ SYSCALL_DEFINE2(req_sharedmem)(struct tcb *t, sys_arg_t size, sys_arg_t flags) { /** \todo check that requester is server */ struct tcb *r = get_cproc(t); vm_t start = 0; - if ((start = alloc_shared_uvmem(r, size, flags))) - return_args(t, SYS_RET1(ERR_OOMEM)); - - return_args(t, SYS_RET2(OK, start)); -} - -/** - * Reference shared memory syscall handler. - * - * @param t Current tcb. - * @param tid Thread ID of shared memory owner. - * @param va Start of shared memory in \c tid. - * @param flags Flags of reference. - * @return \ref OK and start of reference when succesful, - * \ref ERR_OOMEM and \c NULL otherwise. - */ -SYSCALL_DEFINE3(ref_sharedmem)(struct tcb *t, sys_arg_t tid, sys_arg_t va, - sys_arg_t flags) -{ - struct tcb *t2 = get_tcb(tid); - vm_t start = 0; - if ((start = ref_shared_uvmem(t, t2, va, flags))) + if (!(start = alloc_shared_uvmem(r, size, flags))) return_args(t, SYS_RET1(ERR_OOMEM)); return_args(t, SYS_RET2(OK, start)); -- cgit v1.3