|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH 2/2] lib/ukmmap: Add page-alignment support to mmap/munmap
The D runtime library is dependent on this property
---
lib/ukmmap/mmap.c | 29 +++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/lib/ukmmap/mmap.c b/lib/ukmmap/mmap.c
index 7cee8dc..3422411 100644
--- a/lib/ukmmap/mmap.c
+++ b/lib/ukmmap/mmap.c
@@ -38,6 +38,13 @@
#include <uk/alloc.h>
#include <string.h>
+#ifdef DRUNTIME
+#include <uk/essentials.h>
+
+#define size_to_num_pages(size) \
+ (ALIGN_UP((unsigned long)(size), __PAGE_SIZE) / __PAGE_SIZE)
+#endif
+
struct mmap_addr {
void *begin;
void *end;
@@ -94,8 +101,12 @@ void *mmap(void *addr, size_t len, int prot,
last = tmp;
tmp = tmp->next;
}
- void *mem = uk_malloc(uk_alloc_get_default(), len);
-
+#ifdef DRUNTIME
+ int num_pages = size_to_num_pages(len);
+ void *mem = uk_palloc(uk_alloc_get_default(), num_pages);
+#else
+ void *mem = uk_malloc(uk_alloc_get_default(), len);
+#endif
if (!mem) {
errno = ENOMEM;
return (void *) -1;
@@ -131,6 +142,7 @@ int munmap(void *addr, size_t len)
if (!addr)
return 0;
while (tmp) {
+#ifndef DRUNTIME
if (addr != tmp->begin) {
if (tmp->end > addr + len) {
errno = EINVAL;
@@ -158,6 +170,19 @@ int munmap(void *addr, size_t len)
uk_free(uk_alloc_get_default(), addr);
return 0;
}
+#else
+ if (addr == tmp->begin) {
+ int num_pages = size_to_num_pages(len);
+
+ if (!prev)
+ mmap_addr = tmp->next;
+ else
+ prev->next = tmp->next;
+ uk_free(uk_alloc_get_default(), tmp);
+ uk_pfree(uk_alloc_get_default(), addr, num_pages);
+ break;
+ }
+#endif
prev = tmp;
tmp = tmp->next;
}
--
2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |