summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/vm/vm_map.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 7e67ebd..2d7638e 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -328,16 +328,6 @@ mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off)
return MAP_FAILED;
/*
- * Handle address being NULL.
- *
- * FIXME: XXX: We currently identity map physmem which
- * is probably not ideal.
- */
- if (addr == NULL) {
- addr = (void *)physmem;
- }
-
- /*
* Now we check what type of map request
* this is.
*/
@@ -347,6 +337,13 @@ mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off)
return 0;
/*
+ * If 'addr' is NULL, we'll just allocate physical
+ * memory right away.
+ */
+ if (addr == NULL)
+ physmem = vm_alloc_pageframe(len / GRANULE);
+
+ /*
* Enable demand paging for this object if
* `addr` is not NULL.
*/
@@ -356,8 +353,14 @@ mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off)
mapping->vmobj = vmobj;
mapping->physmem_base = 0;
- } else {
- physmem = vm_map(addr, 0, prot, len);
+ } else if (physmem != 0) {
+ vm_map((void *)physmem, physmem, prot, len);
+ addr = (void *)physmem;
+
+ vmobj->is_anon = 1;
+ vmobj->demand = 0;
+ mapping->vmobj = vmobj;
+ mapping->physmem_base = physmem;
}
/* Did this work? */