|
@@ -326,3 +326,50 @@ extern void update_mmu_cache(struct vm_area_struct * vma,
|
|
|
unsigned long address, pte_t *ptep);
|
|
|
|
|
|
/*
|
|
|
+ * Encode and decode a swap entry
|
|
|
+ *
|
|
|
+ * Constraints:
|
|
|
+ * _PAGE_FILE at bit 0
|
|
|
+ * _PAGE_TYPE_* at bits 2-3 (for emulating _PAGE_PROTNONE)
|
|
|
+ * _PAGE_PRESENT at bit 10
|
|
|
+ *
|
|
|
+ * We encode the type into bits 4-9 and offset into bits 11-31. This
|
|
|
+ * gives us a 21 bits offset, or 2**21 * 4K = 8G usable swap space per
|
|
|
+ * device, and 64 possible types.
|
|
|
+ *
|
|
|
+ * NOTE: We should set ZEROs at the position of _PAGE_PRESENT
|
|
|
+ * and _PAGE_PROTNONE bits
|
|
|
+ */
|
|
|
+#define __swp_type(x) (((x).val >> 4) & 0x3f)
|
|
|
+#define __swp_offset(x) ((x).val >> 11)
|
|
|
+#define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 4) | ((offset) << 11) })
|
|
|
+#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
|
|
+#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
|
|
+
|
|
|
+/*
|
|
|
+ * Encode and decode a nonlinear file mapping entry. We have to
|
|
|
+ * preserve _PAGE_FILE and _PAGE_PRESENT here. _PAGE_TYPE_* isn't
|
|
|
+ * necessary, since _PAGE_FILE implies !_PAGE_PROTNONE (?)
|
|
|
+ */
|
|
|
+#define PTE_FILE_MAX_BITS 30
|
|
|
+#define pte_to_pgoff(pte) (((pte_val(pte) >> 1) & 0x1ff) \
|
|
|
+ | ((pte_val(pte) >> 11) << 9))
|
|
|
+#define pgoff_to_pte(off) ((pte_t) { ((((off) & 0x1ff) << 1) \
|
|
|
+ | (((off) >> 9) << 11) \
|
|
|
+ | _PAGE_FILE) })
|
|
|
+
|
|
|
+typedef pte_t *pte_addr_t;
|
|
|
+
|
|
|
+#define kern_addr_valid(addr) (1)
|
|
|
+
|
|
|
+#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
|
|
+ remap_pfn_range(vma, vaddr, pfn, size, prot)
|
|
|
+
|
|
|
+/* No page table caches to initialize (?) */
|
|
|
+#define pgtable_cache_init() do { } while(0)
|
|
|
+
|
|
|
+#include <asm-generic/pgtable.h>
|
|
|
+
|
|
|
+#endif /* !__ASSEMBLY__ */
|
|
|
+
|
|
|
+#endif /* __ASM_AVR32_PGTABLE_H */
|