|
@@ -167,7 +167,7 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
|
|
|
#define _PAGE_NO_CACHE_BIT 24 /* (0x080) Uncached Page (U bit) */
|
|
|
#define _PAGE_ACCESSED_BIT 23 /* (0x100) Software: Page Accessed */
|
|
|
#define _PAGE_PRESENT_BIT 22 /* (0x200) Software: translation valid */
|
|
|
-/* bit 21 was formerly the FLUSH bit but is now unused */
|
|
|
+#define _PAGE_HPAGE_BIT 21 /* (0x400) Software: Huge Page */
|
|
|
#define _PAGE_USER_BIT 20 /* (0x800) Software: User accessible page */
|
|
|
|
|
|
/* N.B. The bits are defined in terms of a 32 bit word above, so the */
|
|
@@ -194,6 +194,7 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
|
|
|
#define _PAGE_NO_CACHE (1 << xlate_pabit(_PAGE_NO_CACHE_BIT))
|
|
|
#define _PAGE_ACCESSED (1 << xlate_pabit(_PAGE_ACCESSED_BIT))
|
|
|
#define _PAGE_PRESENT (1 << xlate_pabit(_PAGE_PRESENT_BIT))
|
|
|
+#define _PAGE_HUGE (1 << xlate_pabit(_PAGE_HPAGE_BIT))
|
|
|
#define _PAGE_USER (1 << xlate_pabit(_PAGE_USER_BIT))
|
|
|
|
|
|
#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | _PAGE_DIRTY | _PAGE_ACCESSED)
|
|
@@ -217,7 +218,7 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
|
|
|
#define PxD_FLAG_VALID (1 << xlate_pabit(_PxD_VALID_BIT))
|
|
|
#define PxD_FLAG_MASK (0xf)
|
|
|
#define PxD_FLAG_SHIFT (4)
|
|
|
-#define PxD_VALUE_SHIFT (8) /* (PAGE_SHIFT-PxD_FLAG_SHIFT) */
|
|
|
+#define PxD_VALUE_SHIFT (PFN_PTE_SHIFT-PxD_FLAG_SHIFT)
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
@@ -362,6 +363,18 @@ static inline pte_t pte_mkyoung(pte_t pte) { pte_val(pte) |= _PAGE_ACCESSED; ret
|
|
|
static inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) |= _PAGE_WRITE; return pte; }
|
|
|
static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
|
|
|
|
|
|
+/*
|
|
|
+ * Huge pte definitions.
|
|
|
+ */
|
|
|
+#ifdef CONFIG_HUGETLB_PAGE
|
|
|
+#define pte_huge(pte) (pte_val(pte) & _PAGE_HUGE)
|
|
|
+#define pte_mkhuge(pte) (__pte(pte_val(pte) | _PAGE_HUGE))
|
|
|
+#else
|
|
|
+#define pte_huge(pte) (0)
|
|
|
+#define pte_mkhuge(pte) (pte)
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
* Conversion functions: convert a page and protection to a page entry,
|
|
|
* and a page entry and page directory to the page they refer to.
|
|
@@ -410,8 +423,9 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
|
/* Find an entry in the second-level page table.. */
|
|
|
|
|
|
#if CONFIG_PGTABLE_LEVELS == 3
|
|
|
+#define pmd_index(addr) (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
|
|
|
#define pmd_offset(dir,address) \
|
|
|
-((pmd_t *) pgd_page_vaddr(*(dir)) + (((address)>>PMD_SHIFT) & (PTRS_PER_PMD-1)))
|
|
|
+((pmd_t *) pgd_page_vaddr(*(dir)) + pmd_index(address))
|
|
|
#else
|
|
|
#define pmd_offset(dir,addr) ((pmd_t *) dir)
|
|
|
#endif
|