aboutsummaryrefslogtreecommitdiff
path: root/src/vmem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2024-07-07 21:47:14 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2024-07-07 21:47:14 +0300
commit219c27d420fe0abe5515cefc2513c6fe60aafdf9 (patch)
tree5cd0c38a971245c91fd7bc3539b4a37c8a08a7f1 /src/vmem.c
parentfe4c623cb9320226866829317cea8ba0c49e7dbc (diff)
downloadkmi-219c27d420fe0abe5515cefc2513c6fe60aafdf9.tar.gz
kmi-219c27d420fe0abe5515cefc2513c6fe60aafdf9.zip
add req_page back in as I realized it's useful
+ Can be used to pass contiguous memory regions to things like virtio block devices for implementing disk drivers etc.
Diffstat (limited to 'src/vmem.c')
-rw-r--r--src/vmem.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/vmem.c b/src/vmem.c
index 27e1b2f..261ef42 100644
--- a/src/vmem.c
+++ b/src/vmem.c
@@ -279,6 +279,34 @@ vm_t map_fixed_uvmem(struct tcb *t, pm_t start, size_t size, vmflags_t flags)
return v + (start % BASE_PAGE_SIZE);
}
+vm_t alloc_uvpage(struct tcb *t, size_t size, vmflags_t flags, pm_t *startp,
+ size_t *sizep)
+{
+ enum mm_order order = nearest_order(size);
+ size = order_size(order);
+
+ const vm_t v = alloc_region(&t->uvmem.region, size, &size, flags);
+ if (!v)
+ return 0;
+
+ pm_t start = alloc_page(order);
+ if (!start) {
+ free_region(&t->uvmem.region, size);
+ return 0;
+ }
+
+ if (map_fixed_region(t->proc.vmem, v, start, size, flags)) {
+ unmap_region(t->proc.vmem, v, size);
+ free_region(&t->uvmem.region, v);
+ return NULL;
+ }
+
+ *startp = (pm_t)__pa(start);
+ *sizep = size;
+ return v;
+}
+
+
/* free_shared_uvmem shouldn't be needed, likely to work with free_uvmem */
vm_t alloc_shared_uvmem(struct tcb *s, size_t size, vmflags_t flags)
{