aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-06-11 15:37:39 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-06-11 15:37:39 +0300
commitde99380f12f8e2fe4acf7734db0e1e37a356c45f (patch)
tree086f4456c71f740d1198602a958aca1e79b3d672 /common
parent45b51617a0e3513a453c20229e02fd8fc9fbbfe1 (diff)
downloadkmi-de99380f12f8e2fe4acf7734db0e1e37a356c45f.tar.gz
kmi-de99380f12f8e2fe4acf7734db0e1e37a356c45f.zip
continue documentation
Diffstat (limited to 'common')
-rw-r--r--common/uapi/proc.c2
-rw-r--r--common/vmem.c38
2 files changed, 25 insertions, 15 deletions
diff --git a/common/uapi/proc.c b/common/uapi/proc.c
index 2c1fe77..b2fc4f0 100644
--- a/common/uapi/proc.c
+++ b/common/uapi/proc.c
@@ -47,7 +47,7 @@ SYSCALL_DEFINE2(exec)(sys_arg_t bin, sys_arg_t interp){
}
/* free everything except regions to be kept */
- clear_uvmem(r, false);
+ clear_uvmem(r);
/* restore to normal */
clear_bit(b->flags, MR_KEEP);
diff --git a/common/vmem.c b/common/vmem.c
index f446b65..9761e3e 100644
--- a/common/vmem.c
+++ b/common/vmem.c
@@ -25,17 +25,27 @@ static stat_t __free_mapped_region(struct tcb *t, struct mem_region *m)
return status;
}
-stat_t clear_uvmem(struct tcb *t, bool force)
+stat_t clear_uvmem(struct tcb *t)
{
struct mem_region *m = find_first_region(&t->sp_r);
while (m) {
- /* if force is not set, free only regions that are not marked to
- * be kept and are owned.
- *
- * if force is set, free all owned regions.
- */
- if (is_region_owned(m) && (force || !is_region_kept(m)))
+ if (is_region_owned(m) && !is_region_kept(m))
__free_mapped_region(t, m);
+
+ m = m->next;
+ }
+
+ return OK;
+}
+
+stat_t purge_uvmem(struct tcb *t)
+{
+ struct mem_region *m = find_first_region(&t->sp_r);
+ while (m) {
+ if (is_region_owned(m))
+ __free_mapped_region(t, m);
+
+ m = m->next;
}
return OK;
@@ -44,7 +54,7 @@ stat_t clear_uvmem(struct tcb *t, bool force)
stat_t destroy_uvmem(struct tcb *t)
{
/* force clear all regions */
- clear_uvmem(t, true);
+ purge_uvmem(t);
/* destroy region tree itself */
return destroy_region(&t->sp_r);
}
@@ -123,17 +133,17 @@ vm_t ref_shared_uvmem(struct tcb *t1, struct tcb *t2, vm_t va, vmflags_t flags)
}
/** \todo assume tcb is root tcb? */
-stat_t free_uvmem(struct tcb *t, vm_t va)
+stat_t free_uvmem(struct tcb *r, vm_t va)
{
- struct mem_region *m = find_used_region(&t->sp_r, va);
+ struct mem_region *m = find_used_region(&r->sp_r, va);
if (!m)
return -1;
- free_region(&t->sp_r, va);
+ free_region(&r->sp_r, va);
- stat_t status = __free_mapped_region(t, m);
- if (is_rpc(t) && status == INFO_SEFF)
- return clone_rpc_maps(t);
+ stat_t status = __free_mapped_region(r, m);
+ if (is_rpc(r) && status == INFO_SEFF)
+ return clone_rpc_maps(r);
return status;
}