|
@@ -287,3 +287,75 @@ static inline pgprot_t pgprot_noncached(pgprot_t _prot)
|
|
|
* Conversion functions: convert a page and protection to a page entry,
|
|
|
* and a page entry and page directory to the page they refer to.
|
|
|
*/
|
|
|
+#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), pgprot)
|
|
|
+
|
|
|
+static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
|
+{
|
|
|
+ set_pte(&pte, __pte((pte_val(pte) & _PAGE_CHG_MASK) \
|
|
|
+ | pgprot_val(newprot)));
|
|
|
+
|
|
|
+ return pte;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Conversion functions: convert a page and protection to a page entry,
|
|
|
+ * and a page entry and page directory to the page they refer to.
|
|
|
+ */
|
|
|
+
|
|
|
+static inline void pmd_set(pmd_t * pmdp, pte_t * ptep)
|
|
|
+{
|
|
|
+ pmd_val(*pmdp) = (((unsigned long) ptep) & PAGE_MASK);
|
|
|
+}
|
|
|
+
|
|
|
+#define pmd_page_vaddr(pmd) \
|
|
|
+ ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
|
|
|
+
|
|
|
+#ifndef CONFIG_DISCONTIGMEM
|
|
|
+#define pmd_page(pmd) (mem_map + ((pmd_val(pmd) >> PAGE_SHIFT) - PFN_BASE))
|
|
|
+#endif /* !CONFIG_DISCONTIGMEM */
|
|
|
+
|
|
|
+/* 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))
|
|
|
+
|
|
|
+/* to find an entry in a kernel page-table-directory */
|
|
|
+#define pgd_offset_k(address) pgd_offset(&init_mm, address)
|
|
|
+
|
|
|
+#define pmd_index(address) \
|
|
|
+ (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
|
|
|
+
|
|
|
+#define pte_index(address) \
|
|
|
+ (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
|
|
|
+#define pte_offset_kernel(dir, address) \
|
|
|
+ ((pte_t *)pmd_page_vaddr(*(dir)) + pte_index(address))
|
|
|
+#define pte_offset_map(dir, address) \
|
|
|
+ ((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
|
|
|
+#define pte_unmap(pte) do { } while (0)
|
|
|
+
|
|
|
+/* Encode and de-code a swap entry */
|
|
|
+#define __swp_type(x) (((x).val >> 2) & 0x1f)
|
|
|
+#define __swp_offset(x) ((x).val >> 10)
|
|
|
+#define __swp_entry(type, offset) \
|
|
|
+ ((swp_entry_t) { ((type) << 2) | ((offset) << 10) })
|
|
|
+#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
|
|
+#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
|
|
+
|
|
|
+#endif /* !__ASSEMBLY__ */
|
|
|
+
|
|
|
+/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
|
|
|
+#define kern_addr_valid(addr) (1)
|
|
|
+
|
|
|
+#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
|
|
+ remap_pfn_range(vma, vaddr, pfn, size, prot)
|
|
|
+
|
|
|
+#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
|
|
|
+#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
|
|
|
+#define __HAVE_ARCH_PTEP_SET_WRPROTECT
|
|
|
+#define __HAVE_ARCH_PTE_SAME
|
|
|
+#include <asm-generic/pgtable.h>
|
|
|
+
|
|
|
+#endif /* __KERNEL__ */
|
|
|
+
|
|
|
+#endif /* _ASM_M32R_PGTABLE_H */
|