diff -u linux/include/asm-x86_64/pgalloc.h-PMD linux/include/asm-x86_64/pgalloc.h --- linux/include/asm-x86_64/pgalloc.h-PMD 2003-06-09 08:18:21.000000000 +0200 +++ linux/include/asm-x86_64/pgalloc.h 2003-06-09 08:42:30.000000000 +0200 @@ -23,14 +23,8 @@ static inline void pmd_populate_bigpage(struct mm_struct *mm, pmd_t *pmd, struct page *page) { - unsigned int idx = page - mem_map; - - if (idx & ((1 << (BIGPAGE_SHIFT - PAGE_SHIFT)) -1)) { - printk("ugh, page idx %d (%p) cannot be PSE page!\n", idx, page); - BUG(); - } set_pmd(pmd, __pmd(_PAGE_TABLE + _PAGE_PSE + - ((unsigned long long)idx << (unsigned long long) PAGE_SHIFT))); + (page_to_pfn(page) << PAGE_SHIFT))); } #define pgd_populate(mm, pgd, pmd) \ @@ -154,7 +148,7 @@ static inline void pte_free_via_pmd(pmd_t pmd) { - pte_free(virt_to_page(__pmd_page(pmd))); + pte_free(__pmd_page(pmd)); } extern int do_check_pgt_cache(int, int); diff -u linux/include/asm-x86_64/mmzone.h-PMD linux/include/asm-x86_64/mmzone.h --- linux/include/asm-x86_64/mmzone.h-PMD 2003-06-09 08:18:21.000000000 +0200 +++ linux/include/asm-x86_64/mmzone.h 2003-06-09 08:43:02.000000000 +0200 @@ -129,6 +129,12 @@ unsigned long lpfn = paddr_to_local_pfn(addr,&lmemmap,1); \ lmemmap + lpfn; }) +#define __pmd_page(pte) \ + ({ struct page *lmemmap; \ + unsigned long addr = pmd_val(pte) & PHYSICAL_PAGE_MASK; \ + unsigned long lpfn = paddr_to_local_pfn(addr,&lmemmap,1); \ + lmemmap + lpfn; }) + #define pfn_to_page(pfn) virt_to_page(__va((unsigned long)(pfn) << PAGE_SHIFT)) #define page_to_pfn(page) ({ \ int nodeid = phys_to_nid(__pa(page)); \ diff -u linux/include/asm-x86_64/pgtable.h-PMD linux/include/asm-x86_64/pgtable.h --- linux/include/asm-x86_64/pgtable.h-PMD 2003-06-09 08:18:21.000000000 +0200 +++ linux/include/asm-x86_64/pgtable.h 2003-06-09 08:42:30.000000000 +0200 @@ -389,7 +389,9 @@ } #define page_pte(page) page_pte_prot(page, __pgprot(0)) -#define __pmd_page(pmd) (__va(pmd_val(pmd) & PHYSICAL_PAGE_MASK)) +#ifndef CONFIG_DISCONTIGMEM +#define __pmd_page(pmd) (mem_map + ((pmd_val(pmd) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT)) +#endif /* to find an entry in a page-table-directory. */ #define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) @@ -411,9 +413,9 @@ /* Find an entry in the third-level page table.. */ #define __pte_offset(address) \ - ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) -#define pte_offset(dir, address) ((pte_t *) __pmd_page(*(dir)) + \ - __pte_offset(address)) + (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) +#define pte_offset(dir, address) \ + ((pte_t *)__va(pmd_val(*(dir)) & PHYSICAL_PAGE_MASK) + __pte_offset(address)) #define pte_offset2(dir, address) pte_offset(dir, address) #define pte_offset_atomic(dir, address) pte_offset(dir, address)