|
@@ -94,11 +94,109 @@
|
|
|
#define _HPAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | \
|
|
|
_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_SPLITTING | \
|
|
|
_PAGE_THP_HUGE)
|
|
|
+#define _PTE_NONE_MASK _PAGE_HPTEFLAGS
|
|
|
/*
|
|
|
- * Default defines for things which we don't use.
|
|
|
- * We should get this removed.
|
|
|
+ * The mask convered by the RPN must be a ULL on 32-bit platforms with
|
|
|
+ * 64-bit PTEs
|
|
|
*/
|
|
|
-#include <asm/pte-common.h>
|
|
|
+#define PTE_RPN_MASK (~((1UL << PTE_RPN_SHIFT) - 1))
|
|
|
+/*
|
|
|
+ * _PAGE_CHG_MASK masks of bits that are to be preserved across
|
|
|
+ * pgprot changes
|
|
|
+ */
|
|
|
+#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \
|
|
|
+ _PAGE_ACCESSED | _PAGE_SPECIAL)
|
|
|
+/*
|
|
|
+ * Mask of bits returned by pte_pgprot()
|
|
|
+ */
|
|
|
+#define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \
|
|
|
+ _PAGE_WRITETHRU | _PAGE_4K_PFN | \
|
|
|
+ _PAGE_USER | _PAGE_ACCESSED | \
|
|
|
+ _PAGE_RW | _PAGE_DIRTY | _PAGE_EXEC)
|
|
|
+/*
|
|
|
+ * We define 2 sets of base prot bits, one for basic pages (ie,
|
|
|
+ * cacheable kernel and user pages) and one for non cacheable
|
|
|
+ * pages. We always set _PAGE_COHERENT when SMP is enabled or
|
|
|
+ * the processor might need it for DMA coherency.
|
|
|
+ */
|
|
|
+#define _PAGE_BASE_NC (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_PSIZE)
|
|
|
+#define _PAGE_BASE (_PAGE_BASE_NC | _PAGE_COHERENT)
|
|
|
+
|
|
|
+/* Permission masks used to generate the __P and __S table,
|
|
|
+ *
|
|
|
+ * Note:__pgprot is defined in arch/powerpc/include/asm/page.h
|
|
|
+ *
|
|
|
+ * Write permissions imply read permissions for now (we could make write-only
|
|
|
+ * pages on BookE but we don't bother for now). Execute permission control is
|
|
|
+ * possible on platforms that define _PAGE_EXEC
|
|
|
+ *
|
|
|
+ * Note due to the way vm flags are laid out, the bits are XWR
|
|
|
+ */
|
|
|
+#define PAGE_NONE __pgprot(_PAGE_BASE)
|
|
|
+#define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW)
|
|
|
+#define PAGE_SHARED_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW | \
|
|
|
+ _PAGE_EXEC)
|
|
|
+#define PAGE_COPY __pgprot(_PAGE_BASE | _PAGE_USER )
|
|
|
+#define PAGE_COPY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
|
|
|
+#define PAGE_READONLY __pgprot(_PAGE_BASE | _PAGE_USER )
|
|
|
+#define PAGE_READONLY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
|
|
|
+
|
|
|
+#define __P000 PAGE_NONE
|
|
|
+#define __P001 PAGE_READONLY
|
|
|
+#define __P010 PAGE_COPY
|
|
|
+#define __P011 PAGE_COPY
|
|
|
+#define __P100 PAGE_READONLY_X
|
|
|
+#define __P101 PAGE_READONLY_X
|
|
|
+#define __P110 PAGE_COPY_X
|
|
|
+#define __P111 PAGE_COPY_X
|
|
|
+
|
|
|
+#define __S000 PAGE_NONE
|
|
|
+#define __S001 PAGE_READONLY
|
|
|
+#define __S010 PAGE_SHARED
|
|
|
+#define __S011 PAGE_SHARED
|
|
|
+#define __S100 PAGE_READONLY_X
|
|
|
+#define __S101 PAGE_READONLY_X
|
|
|
+#define __S110 PAGE_SHARED_X
|
|
|
+#define __S111 PAGE_SHARED_X
|
|
|
+
|
|
|
+/* Permission masks used for kernel mappings */
|
|
|
+#define PAGE_KERNEL __pgprot(_PAGE_BASE | _PAGE_KERNEL_RW)
|
|
|
+#define PAGE_KERNEL_NC __pgprot(_PAGE_BASE_NC | _PAGE_KERNEL_RW | \
|
|
|
+ _PAGE_NO_CACHE)
|
|
|
+#define PAGE_KERNEL_NCG __pgprot(_PAGE_BASE_NC | _PAGE_KERNEL_RW | \
|
|
|
+ _PAGE_NO_CACHE | _PAGE_GUARDED)
|
|
|
+#define PAGE_KERNEL_X __pgprot(_PAGE_BASE | _PAGE_KERNEL_RWX)
|
|
|
+#define PAGE_KERNEL_RO __pgprot(_PAGE_BASE | _PAGE_KERNEL_RO)
|
|
|
+#define PAGE_KERNEL_ROX __pgprot(_PAGE_BASE | _PAGE_KERNEL_ROX)
|
|
|
+
|
|
|
+/* Protection used for kernel text. We want the debuggers to be able to
|
|
|
+ * set breakpoints anywhere, so don't write protect the kernel text
|
|
|
+ * on platforms where such control is possible.
|
|
|
+ */
|
|
|
+#if defined(CONFIG_KGDB) || defined(CONFIG_XMON) || defined(CONFIG_BDI_SWITCH) ||\
|
|
|
+ defined(CONFIG_KPROBES) || defined(CONFIG_DYNAMIC_FTRACE)
|
|
|
+#define PAGE_KERNEL_TEXT PAGE_KERNEL_X
|
|
|
+#else
|
|
|
+#define PAGE_KERNEL_TEXT PAGE_KERNEL_ROX
|
|
|
+#endif
|
|
|
+
|
|
|
+/* Make modules code happy. We don't set RO yet */
|
|
|
+#define PAGE_KERNEL_EXEC PAGE_KERNEL_X
|
|
|
+
|
|
|
+/*
|
|
|
+ * Don't just check for any non zero bits in __PAGE_USER, since for book3e
|
|
|
+ * and PTE_64BIT, PAGE_KERNEL_X contains _PAGE_BAP_SR which is also in
|
|
|
+ * _PAGE_USER. Need to explicitly match _PAGE_BAP_UR bit in that case too.
|
|
|
+ */
|
|
|
+#define pte_user(val) ((val & _PAGE_USER) == _PAGE_USER)
|
|
|
+
|
|
|
+/* Advertise special mapping type for AGP */
|
|
|
+#define PAGE_AGP (PAGE_KERNEL_NC)
|
|
|
+#define HAVE_PAGE_AGP
|
|
|
+
|
|
|
+/* Advertise support for _PAGE_SPECIAL */
|
|
|
+#define __HAVE_ARCH_PTE_SPECIAL
|
|
|
+
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
|
/*
|