]> xenbits.xensource.com Git - people/liuw/mini-os.git/commitdiff
minios: Fix >4GB machine addresses
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 10 Jun 2008 15:59:24 +0000 (16:59 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 10 Jun 2008 15:59:24 +0000 (16:59 +0100)
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
arch/x86/mm.c
include/x86/arch_mm.h

index 50fcc116885fc5ab8c4ed712e95bed5b410afbc9..96c433b13541212aac5d5ff9943a284fc7cf0b66 100644 (file)
@@ -59,7 +59,7 @@ void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn,
 {   
     pgentry_t *tab = (pgentry_t *)start_info.pt_base;
     unsigned long pt_page = (unsigned long)pfn_to_virt(*pt_pfn); 
-    unsigned long prot_e, prot_t;
+    pgentry_t prot_e, prot_t;
     mmu_update_t mmu_updates[1];
     
     prot_e = prot_t = 0;
@@ -69,7 +69,7 @@ void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn,
 
     /* We need to clear the page, otherwise we might fail to map it
        as a page table page */
-    memset((unsigned long*)pfn_to_virt(*pt_pfn), 0, PAGE_SIZE);  
+    memset((void*) pt_page, 0, PAGE_SIZE);  
  
     switch ( level )
     {
@@ -99,7 +99,7 @@ void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn,
 #endif
     tab = pte_to_virt(tab[l3_table_offset(pt_page)]);
 
-    mmu_updates[0].ptr = ((pgentry_t)tab[l2_table_offset(pt_page)] & PAGE_MASK) + 
+    mmu_updates[0].ptr = (tab[l2_table_offset(pt_page)] & PAGE_MASK) + 
                          sizeof(pgentry_t) * l1_table_offset(pt_page);
     mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT | 
                          (prot_e & ~_PAGE_RW);
@@ -474,7 +474,7 @@ void do_map_frames(unsigned long addr,
                 if (!pgt || !(addr & L1_MASK))
                     pgt = need_pgt(addr);
                mmu_updates[i].ptr = virt_to_mach(pgt);
-               mmu_updates[i].val = ((f[(done + i) * stride] + (done + i) * increment) << PAGE_SHIFT) | prot;
+               mmu_updates[i].val = ((pgentry_t)(f[(done + i) * stride] + (done + i) * increment) << PAGE_SHIFT) | prot;
            }
 
            rc = HYPERVISOR_mmu_update(mmu_updates, todo, NULL, id);
index 580955d223958a936ae6d08b672cf82ef363af1c..a7e013bc06b43c5dbb43bd2b389ded661969ac3f 100644 (file)
@@ -109,16 +109,16 @@ typedef unsigned long pgentry_t;
   (((_a) >> L4_PAGETABLE_SHIFT) & (L4_PAGETABLE_ENTRIES - 1))
 #endif
 
-#define _PAGE_PRESENT  0x001UL
-#define _PAGE_RW       0x002UL
-#define _PAGE_USER     0x004UL
-#define _PAGE_PWT      0x008UL
-#define _PAGE_PCD      0x010UL
-#define _PAGE_ACCESSED 0x020UL
-#define _PAGE_DIRTY    0x040UL
-#define _PAGE_PAT      0x080UL
-#define _PAGE_PSE      0x080UL
-#define _PAGE_GLOBAL   0x100UL
+#define _PAGE_PRESENT  0x001ULL
+#define _PAGE_RW       0x002ULL
+#define _PAGE_USER     0x004ULL
+#define _PAGE_PWT      0x008ULL
+#define _PAGE_PCD      0x010ULL
+#define _PAGE_ACCESSED 0x020ULL
+#define _PAGE_DIRTY    0x040ULL
+#define _PAGE_PAT      0x080ULL
+#define _PAGE_PSE      0x080ULL
+#define _PAGE_GLOBAL   0x100ULL
 
 #if defined(__i386__)
 #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
@@ -140,7 +140,7 @@ typedef unsigned long pgentry_t;
 
 #define PFN_UP(x)      (((x) + PAGE_SIZE-1) >> L1_PAGETABLE_SHIFT)
 #define PFN_DOWN(x)    ((x) >> L1_PAGETABLE_SHIFT)
-#define PFN_PHYS(x)    ((x) << L1_PAGETABLE_SHIFT)
+#define PFN_PHYS(x)    ((uint64_t)(x) << L1_PAGETABLE_SHIFT)
 #define PHYS_PFN(x)    ((x) >> L1_PAGETABLE_SHIFT)
 
 /* to align the pointer to the (next) page boundary */