From 1d37792fb7a47135f0e7b7fc245e83bb1d8fc496 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Fri, 11 Nov 2022 19:46:22 +0200 Subject: less buggy fork + Not strictly done yet, but we can swap between two processes :D --- common/vmem.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'common/vmem.c') diff --git a/common/vmem.c b/common/vmem.c index 42b4adf..458624c 100644 --- a/common/vmem.c +++ b/common/vmem.c @@ -19,15 +19,29 @@ stat_t init_uvmem(struct tcb *t, vm_t base, vm_t top) return init_region(&t->sp_r, base, top); } -static stat_t __clone_mapped_region(struct tcb *d, struct tcb *s, struct mem_region *m) +/** + * Clone process memory region. + * + * @param d Destination tcb. + * @param s Source tcb. + * @param m Memory region to clone. + * @return \ref ERR_MISC if clone failed, otherwise \ref OK. + * + * @todo check shared memory regions. + */ +static stat_t __clone_mapped_region(struct tcb *d, struct tcb *s, + struct mem_region *m) { - size_t size = 0; - vm_t va = alloc_fixed_region(&d->sp_r, m->start, m->end - m->start, - &size, m->flags); + vm_t start = m->start * order_size(BASE_PAGE); + vm_t end = m->end * order_size(BASE_PAGE); + + size_t size = end - start, actual_size = 0; + vm_t va = alloc_fixed_region(&d->sp_r, start, size, + &actual_size, m->flags); - catastrophic_assert(va == m->start); + catastrophic_assert(va == start); - if (copy_allocd_region(d->proc.vmem, va, size, m->flags, s)) + if (!copy_allocd_region(d->proc.vmem, va, size, m->flags, s->proc.vmem)) return ERR_MISC; return OK; @@ -220,7 +234,7 @@ stat_t alloc_shared_wrapper(struct vmem *b, pm_t *offset, vm_t vaddr, } stat_t copy_allocd_wrapper(struct vmem *b, pm_t *offset, vm_t vaddr, - vmflags_t flags, enum mm_order order, void *data) + vmflags_t flags, enum mm_order order, void *data) { struct vmem *s = (struct vmem *)data; -- cgit v1.3