@ -20,8 +20,6 @@
# include <asm/page.h>
# include <asm/processor.h>
# include <asm-generic/pgtable-nopud.h>
/* The kernel image occupies 0x4000000 to 0x6000000 (4MB --> 96MB).
* The page copy blockops can use 0x6000000 to 0x8000000 .
* The 8 K TSB is mapped in the 0x8000000 to 0x8400000 range .
@ -55,13 +53,21 @@
# define PMD_MASK (~(PMD_SIZE-1))
# define PMD_BITS (PAGE_SHIFT - 3)
/* PGDIR_SHIFT determines what a third-level page table entry can map */
# define PGDIR_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3) + PMD_BITS)
/* PUD_SHIFT determines the size of the area a third-level page
* table can map
*/
# define PUD_SHIFT (PMD_SHIFT + PMD_BITS)
# define PUD_SIZE (_AC(1,UL) << PUD_SHIFT)
# define PUD_MASK (~(PUD_SIZE-1))
# define PUD_BITS (PAGE_SHIFT - 3)
/* PGDIR_SHIFT determines what a fourth-level page table entry can map */
# define PGDIR_SHIFT (PUD_SHIFT + PUD_BITS)
# define PGDIR_SIZE (_AC(1,UL) << PGDIR_SHIFT)
# define PGDIR_MASK (~(PGDIR_SIZE-1))
# define PGDIR_BITS (PAGE_SHIFT - 3)
# if (PGDIR_SHIFT + PGDIR_BITS) != 43
# if (PGDIR_SHIFT + PGDIR_BITS) != 5 3
# error Page table parameters do not cover virtual address space properly.
# endif
@ -93,6 +99,7 @@ static inline bool kern_addr_valid(unsigned long addr)
/* Entries per page directory level. */
# define PTRS_PER_PTE (1UL << (PAGE_SHIFT-3))
# define PTRS_PER_PMD (1UL << PMD_BITS)
# define PTRS_PER_PUD (1UL << PUD_BITS)
# define PTRS_PER_PGD (1UL << PGDIR_BITS)
/* Kernel has a separate 44bit address space. */
@ -101,6 +108,9 @@ static inline bool kern_addr_valid(unsigned long addr)
# define pmd_ERROR(e) \
pr_err ( " %s:%d: bad pmd %p(%016lx) seen at (%pS) \n " , \
__FILE__ , __LINE__ , & ( e ) , pmd_val ( e ) , __builtin_return_address ( 0 ) )
# define pud_ERROR(e) \
pr_err ( " %s:%d: bad pud %p(%016lx) seen at (%pS) \n " , \
__FILE__ , __LINE__ , & ( e ) , pud_val ( e ) , __builtin_return_address ( 0 ) )
# define pgd_ERROR(e) \
pr_err ( " %s:%d: bad pgd %p(%016lx) seen at (%pS) \n " , \
__FILE__ , __LINE__ , & ( e ) , pgd_val ( e ) , __builtin_return_address ( 0 ) )
@ -779,6 +789,11 @@ static inline int pmd_present(pmd_t pmd)
# define pud_bad(pud) ((pud_val(pud) & ~PAGE_MASK) || \
! __kern_addr_valid ( pud_val ( pud ) ) )
# define pgd_none(pgd) (!pgd_val(pgd))
# define pgd_bad(pgd) ((pgd_val(pgd) & ~PAGE_MASK) || \
! __kern_addr_valid ( pgd_val ( pgd ) ) )
# ifdef CONFIG_TRANSPARENT_HUGEPAGE
void set_pmd_at ( struct mm_struct * mm , unsigned long addr ,
pmd_t * pmdp , pmd_t pmd ) ;
@ -815,10 +830,17 @@ static inline unsigned long __pmd_page(pmd_t pmd)
# define pmd_clear(pmdp) (pmd_val(*(pmdp)) = 0UL)
# define pud_present(pud) (pud_val(pud) != 0U)
# define pud_clear(pudp) (pud_val(*(pudp)) = 0UL)
# define pgd_page_vaddr(pgd) \
( ( unsigned long ) __va ( pgd_val ( pgd ) ) )
# define pgd_present(pgd) (pgd_val(pgd) != 0U)
# define pgd_clear(pgdp) (pgd_val(*(pgd)) = 0UL)
/* Same in both SUN4V and SUN4U. */
# define pte_none(pte) (!pte_val(pte))
# define pgd_set(pgdp, pudp) \
( pgd_val ( * ( pgdp ) ) = ( __pa ( ( unsigned long ) ( pudp ) ) ) )
/* to find an entry in a page-table-directory. */
# define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
# define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
@ -826,6 +848,11 @@ static inline unsigned long __pmd_page(pmd_t pmd)
/* to find an entry in a kernel page-table-directory */
# define pgd_offset_k(address) pgd_offset(&init_mm, address)
/* Find an entry in the third-level page table.. */
# define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
# define pud_offset(pgdp, address) \
( ( pud_t * ) pgd_page_vaddr ( * ( pgdp ) ) + pud_index ( address ) )
/* Find an entry in the second-level page table.. */
# define pmd_offset(pudp, address) \
( ( pmd_t * ) pud_page_vaddr ( * ( pudp ) ) + \