+
+static inline pte_t pte_mkold(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_ACCESSED_4U;
+ const unsigned long mask_4v = _PAGE_ACCESSED_4V;
+ unsigned long mask;
+
+ BUILD_BUG_ON((mask_4u & ~(0x0000000000000fffUL)) ||
+ (mask_4v & ~(0xfffffc0000000000UL)));
+
+ __asm__ __volatile__(
+ "\n661: mov %1, %0\n"
+ " nop\n"
+ " .section .sun4v_2insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " sethi %%uhi(%2), %0\n"
+ " sllx %0, 32, %0\n"
+ " .previous\n"
+ : "=r" (mask)
+ : "i" (mask_4u), "i" (mask_4v));
+
+ mask |= _PAGE_R;
+
+ return __pte(pte_val(pte) & ~mask);
+}
+
+static inline pte_t pte_mkyoung(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_ACCESSED_4U;
+ const unsigned long mask_4v = _PAGE_ACCESSED_4V;
+ unsigned long mask;
+
+ BUILD_BUG_ON((mask_4u & ~(0x0000000000000fffUL)) ||
+ (mask_4v & ~(0xfffffc0000000000UL)));
+
+ __asm__ __volatile__(
+ "\n661: mov %1, %0\n"
+ " nop\n"
+ " .section .sun4v_2insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " sethi %%uhi(%2), %0\n"
+ " sllx %0, 32, %0\n"
+ " .previous\n"
+ : "=r" (mask)
+ : "i" (mask_4u), "i" (mask_4v));
+
+ mask |= _PAGE_R;
+
+ return __pte(pte_val(pte) | mask);
+}
+
+static inline unsigned long pte_young(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_ACCESSED_4U;
+ const unsigned long mask_4v = _PAGE_ACCESSED_4V;
+ unsigned long mask;
+
+ BUILD_BUG_ON((mask_4u & ~(0x0000000000000fffUL)) ||
+ (mask_4v & ~(0xfffffc0000000000UL)));
+
+ __asm__ __volatile__(
+ "\n661: mov %1, %0\n"
+ " nop\n"
+ " .section .sun4v_2insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " sethi %%uhi(%2), %0\n"
+ " sllx %0, 32, %0\n"
+ " .previous\n"
+ : "=r" (mask)
+ : "i" (mask_4u), "i" (mask_4v));
+
+ return (pte_val(pte) & mask);
+}
+
+static inline unsigned long pte_dirty(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_MODIFIED_4U;
+ const unsigned long mask_4v = _PAGE_MODIFIED_4V;
+ unsigned long mask;
+
+ BUILD_BUG_ON((mask_4u & ~(0x0000000000000fffUL)) ||
+ (mask_4v & ~(0xfffffc0000000000UL)));
+
+ __asm__ __volatile__(
+ "\n661: mov %1, %0\n"
+ " nop\n"
+ " .section .sun4v_2insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " sethi %%uhi(%2), %0\n"
+ " sllx %0, 32, %0\n"
+ " .previous\n"
+ : "=r" (mask)
+ : "i" (mask_4u), "i" (mask_4v));
+
+ return (pte_val(pte) & mask);
+}
+
+static inline unsigned long pte_write(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_WRITE_4U;
+ const unsigned long mask_4v = _PAGE_WRITE_4V;
+ unsigned long mask;
+
+ BUILD_BUG_ON((mask_4u & ~(0x0000000000000fffUL)) ||
+ (mask_4v & ~(0xfffffc0000000000UL)));
+
+ __asm__ __volatile__(
+ "\n661: mov %1, %0\n"
+ " nop\n"
+ " .section .sun4v_2insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " sethi %%uhi(%2), %0\n"
+ " sllx %0, 32, %0\n"
+ " .previous\n"
+ : "=r" (mask)
+ : "i" (mask_4u), "i" (mask_4v));
+
+ return (pte_val(pte) & mask);
+}
+
+static inline unsigned long pte_exec(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_EXEC_4U;
+ const unsigned long mask_4v = _PAGE_EXEC_4V;
+ unsigned long mask;
+
+ BUILD_BUG_ON((mask_4u & ~(0x00000000fffffc00UL)) ||
+ (mask_4v & ~(0x0000000000000fffUL)));
+
+ __asm__ __volatile__(
+ "\n661: sethi %%hi(%1), %0\n"
+ " .section .sun4v_1insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " mov %2, %0\n"
+ " .previous\n"
+ : "=r" (mask)
+ : "i" (mask_4u), "i" (mask_4v));
+
+ return (pte_val(pte) & mask);
+}
+
+static inline unsigned long pte_read(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_READ_4U;
+ const unsigned long mask_4v = _PAGE_READ_4V;
+ unsigned long mask;
+
+ BUILD_BUG_ON((mask_4u & ~(0x0000000000000fffUL)) ||
+ (mask_4v & ~(0xfffffc0000000000UL)));
+
+ __asm__ __volatile__(
+ "\n661: mov %1, %0\n"
+ " nop\n"
+ " .section .sun4v_2insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " sethi %%uhi(%2), %0\n"
+ " sllx %0, 32, %0\n"
+ " .previous\n"
+ : "=r" (mask)
+ : "i" (mask_4u), "i" (mask_4v));
+
+ return (pte_val(pte) & mask);
+}
+
+static inline unsigned long pte_file(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_FILE_4U;
+ const unsigned long mask_4v = _PAGE_FILE_4V;
+ unsigned long val = pte_val(pte);
+
+ BUILD_BUG_ON((mask_4u & ~(0x0000000000000fffUL)) ||
+ (mask_4v & ~(0x0000000000000fffUL)));
+
+ __asm__ __volatile__(
+ "\n661: and %0, %2, %0\n"
+ " .section .sun4v_1insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " and %0, %3, %0\n"
+ " .previous\n"
+ : "=r" (val)
+ : "0" (val), "i" (mask_4u), "i" (mask_4v));
+
+ return val;
+}
+
+static inline unsigned long pte_present(pte_t pte)
+{
+ const unsigned long mask_4u = _PAGE_PRESENT_4U;
+ const unsigned long mask_4v = _PAGE_PRESENT_4V;
+ unsigned long val = pte_val(pte);
+
+ BUILD_BUG_ON((mask_4u & ~(0x0000000000000fffUL)) ||
+ (mask_4v & ~(0x0000000000000fffUL)));
+
+ __asm__ __volatile__(
+ "\n661: and %0, %2, %0\n"
+ " .section .sun4v_1insn_patch, \"ax\"\n"
+ " .word 661b\n"
+ " and %0, %3, %0\n"
+ " .previous\n"
+ : "=r" (val)
+ : "0" (val), "i" (mask_4u), "i" (mask_4v));
+
+ return val;
+}
+