aboutsummaryrefslogtreecommitdiff
path: root/common/dmem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-05-21 21:02:17 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-05-21 21:02:17 +0300
commit8da0171e5ca3492cdb34422184a1c96acd0b5165 (patch)
treec125b7286f929c8ff7f8a2b938cec84328e99de4 /common/dmem.c
parent836026dbba64793afc0d2591ffdb6fb39b696977 (diff)
downloadkmi-8da0171e5ca3492cdb34422184a1c96acd0b5165.tar.gz
kmi-8da0171e5ca3492cdb34422184a1c96acd0b5165.zip
add status info to memory mappings
+ next up would probably be to start working on process/thread relationships, largely as documented. Still not entirely sure about how I want to handle fork, but I suppose I might figure it out at some point.
Diffstat (limited to 'common/dmem.c')
-rw-r--r--common/dmem.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/common/dmem.c b/common/dmem.c
index 59ea666..6c207c1 100644
--- a/common/dmem.c
+++ b/common/dmem.c
@@ -27,15 +27,17 @@ stat_t init_devmem(pm_t ram_base, pm_t ram_top)
}
stat_t dev_alloc_wrapper(struct vm_branch *b, pm_t *offset, vm_t vaddr,
- vmflags_t flags, enum mm_order order)
+ vmflags_t flags, enum mm_order order, void *data)
{
- map_vpage(b, *offset, vaddr, flags, order);
+ stat_t *status = (stat_t *)data;
+ /* TODO: remember to do something with this status info */
+ *status = map_vpage(b, *offset, vaddr, flags, order);
*offset += __o_size(order);
return OK;
}
stat_t dev_free_wrapper(struct vm_branch *b, pm_t *offset, vm_t vaddr,
- vmflags_t flags, enum mm_order order)
+ vmflags_t flags, enum mm_order order, void *data)
{
UNUSED(offset);
UNUSED(flags);
@@ -43,9 +45,10 @@ stat_t dev_free_wrapper(struct vm_branch *b, pm_t *offset, vm_t vaddr,
enum mm_order v_order = 0;
stat_vpage(b, vaddr, &paddr, &v_order, 0);
if (order != v_order)
- return REGION_TRY_AGAIN;
+ return INFO_TRGN;
- unmap_vpage(b, vaddr);
+ stat_t *status = (stat_t *)data;
+ *status = unmap_vpage(b, vaddr);
return OK;
}
@@ -62,7 +65,7 @@ vm_t alloc_devmem(struct tcb *t, pm_t dev_start, size_t bytes, vmflags_t flags)
return 0;
return map_fill_region(t->b_r, &dev_alloc_wrapper, dev_start, region,
- bytes, flags);
+ bytes, flags, 0);
}
stat_t free_devmem(struct tcb *t, vm_t dev_start)
@@ -85,7 +88,7 @@ stat_t free_devmem(struct tcb *t, vm_t dev_start)
size_t region_size = __addr(m->end - m->start);
map_fill_region(t->b_r, &dev_free_wrapper, dev_paddr, dev_start,
- region_size, 0);
+ region_size, 0, 0);
if (dev_paddr < __pre_top)
free_region(&pre_ram, dev_paddr);