summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_page.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_page.c')
-rw-r--r--sys/vm/vm_page.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 2f14d12..ab3bd5e 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -307,9 +307,23 @@ vm_page_startup(vm_offset_t vaddr)
phys_avail[i + 1] = trunc_page(phys_avail[i + 1]);
}
+#ifdef XEN
+ /*
+ * There is no obvious reason why i386 PV Xen needs vm_page structs
+ * created for these pseudo-physical addresses. XXX
+ */
+ vm_phys_add_seg(0, phys_avail[0]);
+#endif
+
low_water = phys_avail[0];
high_water = phys_avail[1];
+ for (i = 0; i < vm_phys_nsegs; i++) {
+ if (vm_phys_segs[i].start < low_water)
+ low_water = vm_phys_segs[i].start;
+ if (vm_phys_segs[i].end > high_water)
+ high_water = vm_phys_segs[i].end;
+ }
for (i = 0; phys_avail[i + 1]; i += 2) {
vm_paddr_t size = phys_avail[i + 1] - phys_avail[i];
@@ -323,10 +337,6 @@ vm_page_startup(vm_offset_t vaddr)
high_water = phys_avail[i + 1];
}
-#ifdef XEN
- low_water = 0;
-#endif
-
end = phys_avail[biggestone+1];
/*
@@ -394,6 +404,10 @@ vm_page_startup(vm_offset_t vaddr)
first_page = low_water / PAGE_SIZE;
#ifdef VM_PHYSSEG_SPARSE
page_range = 0;
+ for (i = 0; i < vm_phys_nsegs; i++) {
+ page_range += atop(vm_phys_segs[i].end -
+ vm_phys_segs[i].start);
+ }
for (i = 0; phys_avail[i + 1] != 0; i += 2)
page_range += atop(phys_avail[i + 1] - phys_avail[i]);
#elif defined(VM_PHYSSEG_DENSE)
@@ -436,6 +450,13 @@ vm_page_startup(vm_offset_t vaddr)
phys_avail[biggestone + 1] = new_end;
/*
+ * Add physical memory segments corresponding to the available
+ * physical pages.
+ */
+ for (i = 0; phys_avail[i + 1] != 0; i += 2)
+ vm_phys_add_seg(phys_avail[i], phys_avail[i + 1]);
+
+ /*
* Clear all of the page structures
*/
bzero((caddr_t) vm_page_array, page_range * sizeof(struct vm_page));
OpenPOWER on IntegriCloud