select ARCH_HAS_SETUP_DMA_OPS
        select ARCH_HAS_SYNC_DMA_FOR_CPU
        select ARCH_HAS_SYNC_DMA_FOR_DEVICE
+       select ARCH_HAS_VM_GET_PAGE_PROT
        select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC
        select ARCH_32BIT_OFF_T
        select BUILDTIME_TABLE_SORT
 
  *     This is to enable COW mechanism
  */
        /* xwr */
-#define __P000  PAGE_U_NONE
-#define __P001  PAGE_U_R
-#define __P010  PAGE_U_R       /* Pvt-W => !W */
-#define __P011  PAGE_U_R       /* Pvt-W => !W */
-#define __P100  PAGE_U_X_R     /* X => R */
-#define __P101  PAGE_U_X_R
-#define __P110  PAGE_U_X_R     /* Pvt-W => !W and X => R */
-#define __P111  PAGE_U_X_R     /* Pvt-W => !W */
-
-#define __S000  PAGE_U_NONE
-#define __S001  PAGE_U_R
-#define __S010  PAGE_U_W_R     /* W => R */
-#define __S011  PAGE_U_W_R
-#define __S100  PAGE_U_X_R     /* X => R */
-#define __S101  PAGE_U_X_R
-#define __S110  PAGE_U_X_W_R   /* X => R */
-#define __S111  PAGE_U_X_W_R
-
 #ifndef __ASSEMBLY__
 
 #define pte_write(pte)         (pte_val(pte) & _PAGE_WRITE)
 
        info.align_offset = pgoff << PAGE_SHIFT;
        return vm_unmapped_area(&info);
 }
+
+static const pgprot_t protection_map[16] = {
+       [VM_NONE]                                       = PAGE_U_NONE,
+       [VM_READ]                                       = PAGE_U_R,
+       [VM_WRITE]                                      = PAGE_U_R,
+       [VM_WRITE | VM_READ]                            = PAGE_U_R,
+       [VM_EXEC]                                       = PAGE_U_X_R,
+       [VM_EXEC | VM_READ]                             = PAGE_U_X_R,
+       [VM_EXEC | VM_WRITE]                            = PAGE_U_X_R,
+       [VM_EXEC | VM_WRITE | VM_READ]                  = PAGE_U_X_R,
+       [VM_SHARED]                                     = PAGE_U_NONE,
+       [VM_SHARED | VM_READ]                           = PAGE_U_R,
+       [VM_SHARED | VM_WRITE]                          = PAGE_U_W_R,
+       [VM_SHARED | VM_WRITE | VM_READ]                = PAGE_U_W_R,
+       [VM_SHARED | VM_EXEC]                           = PAGE_U_X_R,
+       [VM_SHARED | VM_EXEC | VM_READ]                 = PAGE_U_X_R,
+       [VM_SHARED | VM_EXEC | VM_WRITE]                = PAGE_U_X_W_R,
+       [VM_SHARED | VM_EXEC | VM_WRITE | VM_READ]      = PAGE_U_X_W_R
+};
+DECLARE_VM_GET_PAGE_PROT