vkernel64 - Cleanup, unbreak 32 bit
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 23 Mar 2010 18:42:42 +0000 (11:42 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Tue, 23 Mar 2010 18:42:42 +0000 (11:42 -0700)
* Remove stdio cruft from init_main.c

* Change vpte_t from 64-bits to u_long, so it will be 32 bits
  on 32 bit machines and 64 bits on 64 bit machines.  32 bit
  machines can't handle the address space breakdown or issue
  atomic ops on 64 bit quantities.

  Adjust various defines in sys/vkernel.h to accomodate both
  cases.

* Adjust atomic ops used by vm/vm_fault.c for virtual page
  table access (int -> long).

* Adjust atomic ops and types used by the 32 bit
  platform/vkernel code, primarily (int -> long) and
  also some vm_offset_t's which are really vm_paddr_t's
  or vpte_t's.

* Adjust src/test/vkernel/Makefile to run properly on
  a 32 or 64 bit system.

sys/kern/init_main.c
sys/platform/vkernel/include/pmap.h
sys/platform/vkernel/platform/pmap.c
sys/platform/vkernel/platform/pmap_inval.c
sys/platform/vkernel64/platform/pmap.c
sys/sys/vkernel.h
sys/vm/vm_fault.c
test/vkernel/Makefile

index d44aaad..3db8165 100644 (file)
 #include <sys/user.h>
 #include <sys/copyright.h>
 
-#if defined(__amd64__) && defined(_KERNEL_VIRTUAL)
-#include <stdio.h>
-#endif
-
 int vfs_mountroot_devfs(void);
 
 /* Components of the first process -- never freed. */
@@ -211,7 +207,7 @@ mi_startup(void)
                 * linker set is wrong.
                 */
                if ((long)sysinit % 8 != 0) {
-                       fprintf(stderr, "Fixing sysinit value...\n");
+                       kprintf("Fixing sysinit value...\n");
                        sysinit = (long)sysinit + 4;
                }
 #endif
index 40e3487..d6d9aa3 100644 (file)
@@ -120,7 +120,7 @@ struct pmap_statistics {
 typedef struct pmap_statistics *pmap_statistics_t;
 
 struct pmap {
-       pd_entry_t              *pm_pdir;       /* KVA of page directory */
+       vpte_t                  *pm_pdir;       /* KVA of page directory */
        vpte_t                  pm_pdirpte;     /* pte mapping phys page */
        struct vm_object        *pm_pteobj;     /* Container for pte's */
        cpumask_t               pm_cpucachemask;/* Invalidate cpu mappings */
index 1ef6682..2f6c8a7 100644 (file)
@@ -192,7 +192,7 @@ pmap_pinit(struct pmap *pmap)
         */
        if (pmap->pm_pdir == NULL) {
                pmap->pm_pdir =
-                   (pd_entry_t *)kmem_alloc_pageable(&kernel_map, PAGE_SIZE);
+                   (vpte_t *)kmem_alloc_pageable(&kernel_map, PAGE_SIZE);
        }
 
        /*
@@ -1706,7 +1706,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
                                if (pbits & VPTE_A) {
                                        m = PHYS_TO_VM_PAGE(pbits);
                                        vm_page_flag_set(m, PG_REFERENCED);
-                                       atomic_clear_int(ptep, VPTE_A);
+                                       atomic_clear_long(ptep, VPTE_A);
                                }
                                if (pbits & VPTE_M) {
                                        if (pmap_track_modified(pmap, i386_ptob(sindex))) {
@@ -1743,7 +1743,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
        vm_paddr_t pa;
        vpte_t *pte;
        vm_paddr_t opa;
-       vm_offset_t origpte, newpte;
+       vpte_t origpte, newpte;
        vm_page_t mpte;
 
        if (pmap == NULL)
@@ -2153,9 +2153,9 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
         * wiring changes.
         */
        if (wired)
-               atomic_set_int(pte, VPTE_WIRED);
+               atomic_set_long(pte, VPTE_WIRED);
        else
-               atomic_clear_int(pte, VPTE_WIRED);
+               atomic_clear_long(pte, VPTE_WIRED);
 }
 
 /*
@@ -2229,7 +2229,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr,
                        
                if (srcptepaddr & VPTE_PS) {
                        if (dst_pmap->pm_pdir[ptepindex] == 0) {
-                               dst_pmap->pm_pdir[ptepindex] = (pd_entry_t) srcptepaddr;
+                               dst_pmap->pm_pdir[ptepindex] = (vpte_t)srcptepaddr;
                                dst_pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE;
                        }
                        continue;
@@ -2517,7 +2517,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
                m = PHYS_TO_VM_PAGE(tpte);
 
                KASSERT(m < &vm_page_array[vm_page_array_size],
-                       ("pmap_remove_pages: bad tpte %x", tpte));
+                       ("pmap_remove_pages: bad tpte %lx", tpte));
 
                KKASSERT(pmap->pm_stats.resident_count > 0);
                --pmap->pm_stats.resident_count;
@@ -2668,7 +2668,7 @@ pmap_clearbit(vm_page_t m, int bit)
                                 * handle the write fault without forwarding
                                 * the fault to us.
                                 */
-                               atomic_clear_int(pte, VPTE_M);
+                               atomic_clear_long(pte, VPTE_M);
                        } else if ((bit & (VPTE_W|VPTE_M)) == (VPTE_W|VPTE_M)) {
                                /*
                                 * We've been asked to clear W & M, I guess
@@ -2681,7 +2681,7 @@ pmap_clearbit(vm_page_t m, int bit)
                                 * We've been asked to clear bits that do
                                 * not interact with hardware.
                                 */
-                               atomic_clear_int(pte, bit);
+                               atomic_clear_long(pte, bit);
                        }
                }
        }
@@ -2754,9 +2754,9 @@ pmap_ts_referenced(vm_page_t m)
 
                        if (pte && (*pte & VPTE_A)) {
 #ifdef SMP
-                               atomic_clear_int(pte, VPTE_A);
+                               atomic_clear_long(pte, VPTE_A);
 #else
-                               atomic_clear_int_nonlocked(pte, VPTE_A);
+                               atomic_clear_long_nonlocked(pte, VPTE_A);
 #endif
                                rtval++;
                                if (rtval > 4) {
@@ -2891,7 +2891,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
        }
 
        if ((pte = *ptep) != 0) {
-               vm_offset_t pa;
+               vm_paddr_t pa;
 
                val = MINCORE_INCORE;
                if ((pte & VPTE_MANAGED) == 0)
@@ -3010,8 +3010,8 @@ pads(pmap_t pm)
 
        if (pm == &kernel_pmap)
                return;
-       for (i = 0; i < 1024; i++)
-               if (pm->pm_pdir[i])
+       for (i = 0; i < 1024; i++) {
+               if (pm->pm_pdir[i]) {
                        for (j = 0; j < 1024; j++) {
                                va = (i << PDRSHIFT) + (j << PAGE_SHIFT);
                                if (pm == &kernel_pmap && va < KERNBASE)
@@ -3024,7 +3024,8 @@ pads(pmap_t pm)
                                                (void *)va, (unsigned)*ptep);
                                }
                        };
-
+               }
+       }
 }
 
 void
index b054e07..02634f4 100644 (file)
@@ -154,10 +154,10 @@ pmap_clean_pte(volatile vpte_t *ptep, struct pmap *pmap, vm_offset_t va)
 
        pte = *ptep;
        if (pte & VPTE_V) {
-               atomic_clear_int(ptep, VPTE_W);
+               atomic_clear_long(ptep, VPTE_W);
                pmap_inval_cpu(pmap, va, PAGE_SIZE);
                pte = *ptep;
-               atomic_clear_int(ptep, VPTE_W|VPTE_M);
+               atomic_clear_long(ptep, VPTE_W|VPTE_M);
        }
        return(pte);
 }
@@ -169,10 +169,10 @@ pmap_clean_pde(volatile vpte_t *ptep, struct pmap *pmap, vm_offset_t va)
 
        pte = *ptep;
        if (pte & VPTE_V) {
-               atomic_clear_int(ptep, VPTE_W);
+               atomic_clear_long(ptep, VPTE_W);
                pmap_inval_cpu(pmap, va, SEG_SIZE);
                pte = *ptep;
-               atomic_clear_int(ptep, VPTE_W|VPTE_M);
+               atomic_clear_long(ptep, VPTE_W|VPTE_M);
                pmap->pm_cpucachemask = 0;
        }
        return(pte);
@@ -192,7 +192,7 @@ pmap_setro_pte(volatile vpte_t *ptep, struct pmap *pmap, vm_offset_t va)
        pte = *ptep;
        if (pte & VPTE_V) {
                pte = *ptep;
-               atomic_clear_int(ptep, VPTE_W);
+               atomic_clear_long(ptep, VPTE_W);
                pmap_inval_cpu(pmap, va, PAGE_SIZE);
                pte |= *ptep & VPTE_M;
        }
@@ -214,7 +214,7 @@ pmap_inval_loadandclear(volatile vpte_t *ptep, struct pmap *pmap,
        pte = *ptep;
        if (pte & VPTE_V) {
                pte = *ptep;
-               atomic_clear_int(ptep, VPTE_R|VPTE_W);
+               atomic_clear_long(ptep, VPTE_R|VPTE_W);
                pmap_inval_cpu(pmap, va, PAGE_SIZE);
                pte |= *ptep & (VPTE_A | VPTE_M);
        }
index b688e7a..c656218 100644 (file)
@@ -3111,7 +3111,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
        }
 
        if ((pte = *ptep) != 0) {
-               vm_offset_t pa;
+               vm_paddr_t pa;
 
                val = MINCORE_INCORE;
                if ((pte & VPTE_MANAGED) == 0)
index 1b1d919..98c26d6 100644 (file)
@@ -60,6 +60,9 @@
 #ifndef _MACHINE_VFRAME_H_
 #include <machine/vframe.h>
 #endif
+#ifndef _MACHINE_LIMITS_H_
+#include <machine/limits.h>
+#endif
 
 struct vmspace_rb_tree;
 struct vmspace_entry;
@@ -114,12 +117,26 @@ void vkernel_trap(struct lwp *lp, struct trapframe *frame);
 
 /*
  * KERNEL AND USER DEFINITIONS
+ *
+ * WARNING: vpte_t is 64 bits on a 64-bit box and 32 bits on a 32 bit box.
+ *         A 2-layer page table is used on 32 bit boxes and a 4-layer
+ *         page table is used on 64 bit boxes.
  */
-
-typedef u_int64_t      vpte_t;
+typedef u_long vpte_t;
+
+#if LONG_BIT == 32
+#define VPTE_FRAME_END         32
+#define VPTE_PAGE_BITS         10
+#define VPTE_FRAME             0xFFFFF000L
+#elif LONG_BIT == 64
+#define VPTE_FRAME_END         48
+#define VPTE_PAGE_BITS         9
+#define VPTE_FRAME             0x000FFFFFFFFFF000L
+#else
+#error "LONG_BIT not defined"
+#endif
 
 #define VPTE_PAGE_ENTRIES      (PAGE_SIZE / sizeof(vpte_t))
-#define VPTE_PAGE_BITS         9
 #define VPTE_PAGE_MASK         ((1 << VPTE_PAGE_BITS) - 1)
 #define VPTE_PAGETABLE_SIZE    PAGE_SIZE
 
@@ -135,7 +152,5 @@ typedef u_int64_t   vpte_t;
 #define VPTE_G         0x00000200      /* global bit ?? */
 #define VPTE_WIRED     0x00000400      /* wired */
 
-#define VPTE_FRAME     0x000FFFFFFFFFF000L
-
 #endif
 
index 4e280e0..cf8789f 100644 (file)
@@ -794,7 +794,7 @@ vm_fault_vpagetable(struct faultstate *fs, vm_pindex_t *pindex,
                    vpte_t vpte, int fault_type)
 {
        struct lwbuf *lwb;
-       int vshift = 48 - PAGE_SHIFT;   /* page index bits remaining */
+       int vshift = VPTE_FRAME_END - PAGE_SHIFT; /* index bits remaining */
        int result = KERN_SUCCESS;
        vpte_t *ptep;
 
@@ -852,7 +852,7 @@ vm_fault_vpagetable(struct faultstate *fs, vm_pindex_t *pindex,
                if ((fault_type & VM_PROT_WRITE) && (vpte & VPTE_V) &&
                    (vpte & VPTE_W)) {
                        if ((vpte & (VPTE_M|VPTE_A)) != (VPTE_M|VPTE_A)) {
-                               atomic_set_long(ptep, VPTE_M|VPTE_A);
+                               atomic_set_long(ptep, VPTE_M | VPTE_A);
                                vm_page_dirty(fs->m);
                        }
                }
index 6ec426e..f819737 100644 (file)
@@ -9,15 +9,21 @@ NCPUS ?= 2
 
 all: help
 
-scratch: world32 kernel32 install32
+.if ${MACHINE_ARCH} == "i386"
+USEKERNEL=VKERNEL
+.else
+USEKERNEL=VKERNEL64
+.endif
+
+scratch: world kernel install
        @echo "Run the environment with:"
        @echo "make VKDIR=${VKDIR} run"
 
-quickw: quickworld32 quickkernel32 reinstall32 reinstallkernel32
+quickw: quickworld quickkernel reinstall reinstallkernel
        @echo "Run the environment with:"
        @echo "make VKDIR=${VKDIR} run"
 
-quick: quickkernel32 reinstallkernel32
+quick: quickkernel reinstallkernel
        @echo "Run the environment with:"
        @echo "make VKDIR=${VKDIR} run"
 
@@ -40,16 +46,16 @@ help:
        @echo ""
        @echo "Individual target components:"
        @echo ""
-       @echo "    world32           - build the 32 bit world from scratch"
-       @echo "    root32            - create a new, empty root.img"
-       @echo "    install32         - install a 32 bit world & kernel"
+       @echo "    world             - build the world from scratch"
+       @echo "    root              - create a new, empty root.img"
+       @echo "    install           - install a world & kernel"
        @echo "                        into root.img"
-       @echo "    kernel32          - build 32 bit vkernel"
-       @echo "    quickworld32      - incremental rebuild world32"
-       @echo "    quickkernel32     - incremental rebuild kernel32"
-       @echo "    reinstall32       - reinstall world32 into root.img"
+       @echo "    kernel            - build vkernel"
+       @echo "    quickworld        - incremental rebuild world"
+       @echo "    quickkernel       - incremental rebuild kernel"
+       @echo "    reinstall         - reinstall world into root.img"
        @echo "                        (just the installworld piece)"
-       @echo "    reinstallkernel32 - reinstall kernel32 into root.img"
+       @echo "    reinstallkernel   - reinstall kernel into root.img"
        @echo ""
 
 # Unmount everything, de-configured VN, and clean up.
@@ -58,30 +64,30 @@ help:
 clean: check
        rm -rf ${VKDIR}/root.img ${VKDIR}/root
 
-# Build the 32 bit world and kernel
+# Build the world and kernel
 #
 #
-world32: checkq
+world: checkq
        cd ${SRCDIR} && make -j 4 buildworld
 
-kernel32: checkq
-       cd ${SRCDIR} && make -j 4 KERNCONF=VKERNEL buildkernel
+kernel: checkq
+       cd ${SRCDIR} && make -j 4 KERNCONF=${USEKERNEL} buildkernel
 
 # Quick build - just rebuild the kernel quickly
 #
 #
-quickworld32: checkq
+quickworld: checkq
        cd ${SRCDIR} && make -j 4 quickworld
 
-quickkernel32: checkq
-       cd ${SRCDIR} && make KERNCONF=VKERNEL quickkernel
+quickkernel: checkq
+       cd ${SRCDIR} && make KERNCONF=${USEKERNEL} quickkernel
 
 # Build and mount an empty filesystem for the emulated root disk
 #
-# NOTE: root32 must umount when done because a later dependency may
+# NOTE: root must umount when done because a later dependency may
 #       have a dependency on mount.
 #
-root32:        check
+root:  check
        vnconfig -c -T -S ${ROOTSIZE} -s labels \
            `cat ${VKDIR}/vn.which` ${VKDIR}/root.img
        dd if=/dev/zero of=/dev/`cat ${VKDIR}/vn.which` bs=32k count=4
@@ -103,9 +109,9 @@ mount: check
 
 umount: check
 
-# Install a fresh 32 bit world & distribution, and kernel
+# Install a fresh world & distribution, and kernel
 #
-install32: mount
+install: mount
        cd ${SRCDIR} && \
            make -j 4 DESTDIR=${VKDIR}/root installworld
        cd ${SRCDIR}/etc && \
@@ -117,7 +123,7 @@ install32: mount
        #mv -f ${VKDIR}/root/etc/ttys.new ${VKDIR}/root/etc/ttys
        cd ${SRCDIR} && \
            make -j 4 \
-                DESTDIR=${VKDIR}/root KERNCONF=VKERNEL \
+                DESTDIR=${VKDIR}/root KERNCONF=${USEKERNEL} \
                 NO_MODULES= \
                 installkernel
        cp ${VKDIR}/root/boot/kernel ${VKDIR}/vkernel
@@ -125,12 +131,12 @@ install32: mount
 # Quick reinstall - just install a new kernel on top of an existing image
 #
 #
-reinstall32: mount
+reinstall: mount
        cd ${SRCDIR} && make -j 4 DESTDIR=${VKDIR}/root installworld
 
-reinstallkernel32: mount
+reinstallkernel: mount
        cd ${SRCDIR} && \
-           make -j 4 DESTDIR=${VKDIR}/root KERNCONF=VKERNEL \
+           make -j 4 DESTDIR=${VKDIR}/root KERNCONF=${USEKERNEL} \
                 NO_MODULES= installkernel
        cp ${VKDIR}/root/boot/kernel ${VKDIR}/vkernel