Merge tag 'pinctrl-v4.8-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[cascardo/linux.git] / arch / mips / include / asm / page.h
index 21ed715..5f98759 100644 (file)
@@ -162,16 +162,34 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 /*
  * __pa()/__va() should be used only during mem init.
  */
-#ifdef CONFIG_64BIT
-#define __pa(x)                                                                \
-({                                                                     \
-    unsigned long __x = (unsigned long)(x);                            \
-    __x < CKSEG0 ? XPHYSADDR(__x) : CPHYSADDR(__x);                    \
-})
-#else
-#define __pa(x)                                                                \
-    ((unsigned long)(x) - PAGE_OFFSET + PHYS_OFFSET)
-#endif
+static inline unsigned long ___pa(unsigned long x)
+{
+       if (IS_ENABLED(CONFIG_64BIT)) {
+               /*
+                * For MIPS64 the virtual address may either be in one of
+                * the compatibility segements ckseg0 or ckseg1, or it may
+                * be in xkphys.
+                */
+               return x < CKSEG0 ? XPHYSADDR(x) : CPHYSADDR(x);
+       }
+
+       if (!IS_ENABLED(CONFIG_EVA)) {
+               /*
+                * We're using the standard MIPS32 legacy memory map, ie.
+                * the address x is going to be in kseg0 or kseg1. We can
+                * handle either case by masking out the desired bits using
+                * CPHYSADDR.
+                */
+               return CPHYSADDR(x);
+       }
+
+       /*
+        * EVA is in use so the memory map could be anything, making it not
+        * safe to just mask out bits.
+        */
+       return x - PAGE_OFFSET + PHYS_OFFSET;
+}
+#define __pa(x)                ___pa((unsigned long)(x))
 #define __va(x)                ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
 #include <asm/io.h>
 
@@ -229,8 +247,10 @@ extern int __virt_addr_valid(const volatile void *kaddr);
 #define virt_addr_valid(kaddr)                                         \
        __virt_addr_valid((const volatile void *) (kaddr))
 
-#define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
-                                VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
+#define VM_DATA_DEFAULT_FLAGS \
+       (VM_READ | VM_WRITE | \
+        ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \
+        VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
 #define UNCAC_ADDR(addr)       ((addr) - PAGE_OFFSET + UNCAC_BASE)
 #define CAC_ADDR(addr)         ((addr) - UNCAC_BASE + PAGE_OFFSET)