pmap - Change pmap_map syntaxis
authorAlex Hornung <ahornung@gmail.com>
Sun, 6 Dec 2009 19:44:26 +0000 (19:44 +0000)
committerAlex Hornung <ahornung@gmail.com>
Sun, 6 Dec 2009 20:06:31 +0000 (20:06 +0000)
* Change pmap_map syntaxis to take a pointer to vm_offset_t, so the vaddr is
  modified when memory is mapped.

* Hence also don't return the modified vaddr, but rather return the mapped
  memory.

* This unifies the syntax for the different platforms, as on amd64, pmap_map
  returned the mapped area, instead of the changed vaddr.

* Modify vm_page.c accordingly, and also set aside some memory that minidumps
  need.

sys/platform/pc32/i386/pmap.c
sys/platform/pc64/x86_64/pmap.c
sys/platform/vkernel/platform/pmap.c
sys/vm/pmap.h
sys/vm/vm_page.c

index fae3014..f1753c3 100644 (file)
@@ -750,14 +750,18 @@ pmap_kmodify_nc(vm_offset_t va)
  *     specified memory.
  */
 vm_offset_t
-pmap_map(vm_offset_t virt, vm_paddr_t start, vm_paddr_t end, int prot)
+pmap_map(vm_offset_t *virtp, vm_paddr_t start, vm_paddr_t end, int prot)
 {
+       vm_offset_t     sva, virt;
+
+       sva = virt = *virtp;
        while (start < end) {
                pmap_kenter(virt, start);
                virt += PAGE_SIZE;
                start += PAGE_SIZE;
        }
-       return (virt);
+       *virtp = virt;
+       return (sva);
 }
 
 
index 246b4a5..6731734 100644 (file)
@@ -983,7 +983,7 @@ pmap_kmodify_nc(vm_offset_t va)
  *     specified memory.
  */
 vm_offset_t
-pmap_map(vm_offset_t virt, vm_paddr_t start, vm_paddr_t end, int prot)
+pmap_map(vm_offset_t *virtp, vm_paddr_t start, vm_paddr_t end, int prot)
 {
        return PHYS_TO_DMAP(start);
 }
index ec0aa9d..8c3950d 100644 (file)
@@ -678,14 +678,18 @@ pmap_kmodify_nc(vm_offset_t va)
  * Map a contiguous range of physical memory to a KVM
  */
 vm_offset_t
-pmap_map(vm_offset_t virt, vm_paddr_t start, vm_paddr_t end, int prot)
+pmap_map(vm_offset_t *virtp, vm_paddr_t start, vm_paddr_t end, int prot)
 {
+       vm_offset_t     sva, virt;
+
+       sva = virt = *virtp;
        while (start < end) {
                pmap_kenter(virt, start);
                virt += PAGE_SIZE;
                start += PAGE_SIZE;
        }
-       return (virt);
+       *virtp = virt;
+       return (sva);
 }
 
 vpte_t *
index 813233e..4f29034 100644 (file)
@@ -153,7 +153,7 @@ void                 pmap_growkernel (vm_offset_t);
 void            pmap_init (void);
 boolean_t       pmap_is_modified (struct vm_page *m);
 boolean_t       pmap_ts_referenced (struct vm_page *m);
-vm_offset_t     pmap_map (vm_offset_t, vm_paddr_t, vm_paddr_t, int);
+vm_offset_t     pmap_map (vm_offset_t *, vm_paddr_t, vm_paddr_t, int);
 void            pmap_object_init_pt (pmap_t pmap, vm_offset_t addr,
                    vm_prot_t prot, vm_object_t object, vm_pindex_t pindex,
                    vm_offset_t size, int pagelimit);
index a10a6ea..f54b105 100644 (file)
@@ -89,6 +89,8 @@
 #include <vm/vm_extern.h>
 #include <vm/vm_page2.h>
 
+#include <machine/md_var.h>
+
 static void vm_page_queue_init(void);
 static void vm_page_free_wakeup(void);
 static vm_page_t vm_page_select_cache(vm_object_t, vm_pindex_t);
@@ -240,6 +242,24 @@ vm_page_startup(vm_offset_t vaddr)
 
        vm_page_queue_init();
 
+       /*
+        * Allocate a bitmap to indicate that a random physical page
+        * needs to be included in a minidump.
+        *
+        * The amd64 port needs this to indicate which direct map pages
+        * need to be dumped, via calls to dump_add_page()/dump_drop_page().
+        *
+        * However, i386 still needs this workspace internally within the
+        * minidump code.  In theory, they are not needed on i386, but are
+        * included should the sf_buf code decide to use them.
+        */
+       page_range = phys_avail[(nblocks - 1) * 2 + 1] / PAGE_SIZE;
+       vm_page_dump_size = round_page(roundup2(page_range, NBBY) / NBBY);
+       end -= vm_page_dump_size;
+       vm_page_dump = (void *)pmap_map(&vaddr, end, end + vm_page_dump_size,
+           VM_PROT_READ | VM_PROT_WRITE);
+       bzero((void *)vm_page_dump, vm_page_dump_size);
+
        /*
         * Compute the number of pages of memory that will be available for
         * use (taking into account the overhead of a page structure per
@@ -253,19 +273,19 @@ vm_page_startup(vm_offset_t vaddr)
         * Initialize the mem entry structures now, and put them in the free
         * queue.
         */
-       vm_page_array = (vm_page_t) vaddr;
-       mapped = vaddr;
-
-       /*
-        * Validate these addresses.
-        */
        new_end = trunc_page(end - page_range * sizeof(struct vm_page));
-       mapped = pmap_map(mapped, new_end, end,
+       mapped = pmap_map(&vaddr, new_end, end,
            VM_PROT_READ | VM_PROT_WRITE);
+       vm_page_array = (vm_page_t)mapped;
+
 #ifdef __x86_64__
-       /* pmap_map() returns an address in the DMAP region */
-       vm_page_array = (vm_page_t) mapped;
-       mapped = vaddr;
+       /*
+        * since pmap_map on amd64 returns stuff out of a direct-map region,
+        * we have to manually add these pages to the minidump tracking so
+        * that they can be dumped, including the vm_page_array.
+        */
+       for (pa = new_end; pa < phys_avail[biggestone + 1]; pa += PAGE_SIZE)
+               dump_add_page(pa);
 #endif
 
        /*
@@ -293,7 +313,7 @@ vm_page_startup(vm_offset_t vaddr)
                        pa += PAGE_SIZE;
                }
        }
-       return (mapped);
+       return (vaddr);
 }
 
 /*