diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-07-07 21:47:14 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-07-07 21:47:14 +0300 |
| commit | 219c27d420fe0abe5515cefc2513c6fe60aafdf9 (patch) | |
| tree | 5cd0c38a971245c91fd7bc3539b4a37c8a08a7f1 /src/vmem.c | |
| parent | fe4c623cb9320226866829317cea8ba0c49e7dbc (diff) | |
| download | kmi-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.c | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -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) { |
