|
@@ -453,3 +453,92 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
|
#define pte_offset_map(dir, address) \
|
|
|
((pte_t *)kmap_atomic(pmd_page(*(dir))) + pte_index(address))
|
|
|
#define pte_unmap(pte) kunmap_atomic(pte)
|
|
|
+#else
|
|
|
+#define pte_offset_map(dir, address) \
|
|
|
+ ((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
|
|
|
+#define pte_unmap(pte) do { } while (0)
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * Handle swap and file entries
|
|
|
+ * - the PTE is encoded in the following format:
|
|
|
+ * bit 0: Must be 0 (!_PAGE_PRESENT)
|
|
|
+ * bit 1: Type: 0 for swap, 1 for file (_PAGE_FILE)
|
|
|
+ * bits 2-7: Swap type
|
|
|
+ * bits 8-31: Swap offset
|
|
|
+ * bits 2-31: File pgoff
|
|
|
+ */
|
|
|
+#define __swp_type(x) (((x).val >> 2) & 0x1f)
|
|
|
+#define __swp_offset(x) ((x).val >> 8)
|
|
|
+#define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 8) })
|
|
|
+#define __pte_to_swp_entry(_pte) ((swp_entry_t) { (_pte).pte })
|
|
|
+#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
|
|
+
|
|
|
+static inline int pte_file(pte_t pte)
|
|
|
+{
|
|
|
+ return pte.pte & _PAGE_FILE;
|
|
|
+}
|
|
|
+
|
|
|
+#define PTE_FILE_MAX_BITS 29
|
|
|
+
|
|
|
+#define pte_to_pgoff(PTE) ((PTE).pte >> 2)
|
|
|
+#define pgoff_to_pte(off) __pte((off) << 2 | _PAGE_FILE)
|
|
|
+
|
|
|
+/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
|
|
|
+#define PageSkip(page) (0)
|
|
|
+#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>
|
|
|
+
|
|
|
+/*
|
|
|
+ * preload information about a newly instantiated PTE into the SCR0/SCR1 PGE cache
|
|
|
+ */
|
|
|
+static inline void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t *ptep)
|
|
|
+{
|
|
|
+ struct mm_struct *mm;
|
|
|
+ unsigned long ampr;
|
|
|
+
|
|
|
+ mm = current->mm;
|
|
|
+ if (mm) {
|
|
|
+ pgd_t *pge = pgd_offset(mm, address);
|
|
|
+ pud_t *pue = pud_offset(pge, address);
|
|
|
+ pmd_t *pme = pmd_offset(pue, address);
|
|
|
+
|
|
|
+ ampr = pme->ste[0] & 0xffffff00;
|
|
|
+ ampr |= xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C |
|
|
|
+ xAMPRx_V;
|
|
|
+ } else {
|
|
|
+ address = ULONG_MAX;
|
|
|
+ ampr = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ asm volatile("movgs %0,scr0\n"
|
|
|
+ "movgs %0,scr1\n"
|
|
|
+ "movgs %1,dampr4\n"
|
|
|
+ "movgs %1,dampr5\n"
|
|
|
+ :
|
|
|
+ : "r"(address), "r"(ampr)
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_PROC_FS
|
|
|
+extern char *proc_pid_status_frv_cxnr(struct mm_struct *mm, char *buffer);
|
|
|
+#endif
|
|
|
+
|
|
|
+extern void __init pgtable_cache_init(void);
|
|
|
+
|
|
|
+#endif /* !__ASSEMBLY__ */
|
|
|
+#endif /* !CONFIG_MMU */
|
|
|
+
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
+extern void __init paging_init(void);
|
|
|
+#endif /* !__ASSEMBLY__ */
|
|
|
+
|
|
|
+#endif /* _ASM_PGTABLE_H */
|