amd64: Add kernel support for 64-bit virtual page tables.
authorJordan Gordeev <jgordeev@dir.bg>
Fri, 1 Jan 2010 18:57:33 +0000 (20:57 +0200)
committerSascha Wildner <saw@online.de>
Sun, 21 Mar 2010 08:16:44 +0000 (09:16 +0100)
WARNING: This change removes support for 32-bit vpagetables.

sys/sys/vkernel.h
sys/vm/vm_fault.c

index 9443c0d..1b1d919 100644 (file)
@@ -116,10 +116,10 @@ void vkernel_trap(struct lwp *lp, struct trapframe *frame);
  * KERNEL AND USER DEFINITIONS
  */
 
-typedef u_int32_t      vpte_t;
+typedef u_int64_t      vpte_t;
 
 #define VPTE_PAGE_ENTRIES      (PAGE_SIZE / sizeof(vpte_t))
-#define VPTE_PAGE_BITS         10
+#define VPTE_PAGE_BITS         9
 #define VPTE_PAGE_MASK         ((1 << VPTE_PAGE_BITS) - 1)
 #define VPTE_PAGETABLE_SIZE    PAGE_SIZE
 
@@ -135,7 +135,7 @@ typedef u_int32_t   vpte_t;
 #define VPTE_G         0x00000200      /* global bit ?? */
 #define VPTE_WIRED     0x00000400      /* wired */
 
-#define VPTE_FRAME     0xFFFFF000
+#define VPTE_FRAME     0x000FFFFFFFFFF000L
 
 #endif
 
index c163a2f..4e280e0 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 = 32 - PAGE_SHIFT;   /* page index bits remaining */
+       int vshift = 48 - PAGE_SHIFT;   /* page index bits remaining */
        int result = KERN_SUCCESS;
        vpte_t *ptep;
 
@@ -826,7 +826,7 @@ vm_fault_vpagetable(struct faultstate *fs, vm_pindex_t *pindex,
                 *
                 * There is currently no real need to optimize this.
                 */
-               result = vm_fault_object(fs, vpte >> PAGE_SHIFT,
+               result = vm_fault_object(fs, (vpte & VPTE_FRAME) >> PAGE_SHIFT,
                                         VM_PROT_READ|VM_PROT_WRITE);
                if (result != KERN_SUCCESS)
                        return (result);
@@ -852,14 +852,14 @@ 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_int(ptep, VPTE_M|VPTE_A);
+                               atomic_set_long(ptep, VPTE_M|VPTE_A);
                                vm_page_dirty(fs->m);
                        }
                }
                if ((fault_type & VM_PROT_READ) && (vpte & VPTE_V) &&
                    (vpte & VPTE_R)) {
                        if ((vpte & VPTE_A) == 0) {
-                               atomic_set_int(ptep, VPTE_A);
+                               atomic_set_long(ptep, VPTE_A);
                                vm_page_dirty(fs->m);
                        }
                }
@@ -872,8 +872,9 @@ vm_fault_vpagetable(struct faultstate *fs, vm_pindex_t *pindex,
        /*
         * Combine remaining address bits with the vpte.
         */
-       *pindex = (vpte >> PAGE_SHIFT) +
-                 (*pindex & ((1 << vshift) - 1));
+       /* JG how many bits from each? */
+       *pindex = ((vpte & VPTE_FRAME) >> PAGE_SHIFT) +
+                 (*pindex & ((1L << vshift) - 1));
        return (KERN_SUCCESS);
 }