summaryrefslogtreecommitdiff
path: root/src/sys/vm/vm_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/vm/vm_map.c')
-rw-r--r--src/sys/vm/vm_map.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/sys/vm/vm_map.c b/src/sys/vm/vm_map.c
index 1b27a21..d8cb4b7 100644
--- a/src/sys/vm/vm_map.c
+++ b/src/sys/vm/vm_map.c
@@ -31,6 +31,7 @@
#include <sys/param.h>
#include <sys/errno.h>
#include <sys/syslog.h>
+#include <vm/physseg.h>
#include <vm/mmu.h>
#include <vm/map.h>
#include <vm/vm.h>
@@ -57,6 +58,22 @@ __vm_map(struct vm_vas *vas, struct mmu_map *spec, size_t len, int prot)
/* Must be 4K aligned */
len = ALIGN_UP(len, PSIZE);
+
+ /*
+ * If we encounter any address that is zero, we
+ * must assign our own.
+ */
+ if (spec->pa == 0 || spec->va == 0) {
+ spec->pa = vm_alloc_frame(len / PSIZE);
+ if (spec->va == 0)
+ spec->va = spec->pa;
+ }
+
+ if (spec->pa == 0) {
+ return -ENOMEM;
+ }
+
+ /* Must be on a 4K boundary */
spec->va = ALIGN_DOWN(spec->va, PSIZE);
spec->pa = ALIGN_DOWN(spec->pa, PSIZE);