|
@@ -59,6 +59,16 @@ static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte)
|
|
|
native_set_pte(ptep, pte);
|
|
|
}
|
|
|
|
|
|
+static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd)
|
|
|
+{
|
|
|
+ *pmdp = pmd;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void native_pmd_clear(pmd_t *pmd)
|
|
|
+{
|
|
|
+ native_set_pmd(pmd, native_make_pmd(0));
|
|
|
+}
|
|
|
+
|
|
|
static inline pte_t native_ptep_get_and_clear(pte_t *xp)
|
|
|
{
|
|
|
#ifdef CONFIG_SMP
|
|
@@ -72,14 +82,17 @@ static inline pte_t native_ptep_get_and_clear(pte_t *xp)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd)
|
|
|
-{
|
|
|
- *pmdp = pmd;
|
|
|
-}
|
|
|
-
|
|
|
-static inline void native_pmd_clear(pmd_t *pmd)
|
|
|
+static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp)
|
|
|
{
|
|
|
- native_set_pmd(pmd, native_make_pmd(0));
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ return native_make_pmd(xchg(&xp->pmd, 0));
|
|
|
+#else
|
|
|
+ /* native_local_pmdp_get_and_clear,
|
|
|
+ but duplicated because of cyclic dependency */
|
|
|
+ pmd_t ret = *xp;
|
|
|
+ native_pmd_clear(xp);
|
|
|
+ return ret;
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
static inline void native_set_pud(pud_t *pudp, pud_t pud)
|
|
@@ -181,6 +194,98 @@ static inline int pmd_trans_huge(pmd_t pmd)
|
|
|
}
|
|
|
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
|
|
|
|
|
+#define mk_pmd(page, pgprot) pfn_pmd(page_to_pfn(page), (pgprot))
|
|
|
+
|
|
|
+#define __HAVE_ARCH_PMDP_SET_ACCESS_FLAGS
|
|
|
+extern int pmdp_set_access_flags(struct vm_area_struct *vma,
|
|
|
+ unsigned long address, pmd_t *pmdp,
|
|
|
+ pmd_t entry, int dirty);
|
|
|
+
|
|
|
+#define __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG
|
|
|
+extern int pmdp_test_and_clear_young(struct vm_area_struct *vma,
|
|
|
+ unsigned long addr, pmd_t *pmdp);
|
|
|
+
|
|
|
+#define __HAVE_ARCH_PMDP_CLEAR_YOUNG_FLUSH
|
|
|
+extern int pmdp_clear_flush_young(struct vm_area_struct *vma,
|
|
|
+ unsigned long address, pmd_t *pmdp);
|
|
|
+
|
|
|
+
|
|
|
+#define __HAVE_ARCH_PMDP_SPLITTING_FLUSH
|
|
|
+extern void pmdp_splitting_flush(struct vm_area_struct *vma,
|
|
|
+ unsigned long addr, pmd_t *pmdp);
|
|
|
+
|
|
|
+#define __HAVE_ARCH_PMD_WRITE
|
|
|
+static inline int pmd_write(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_flags(pmd) & _PAGE_RW;
|
|
|
+}
|
|
|
+
|
|
|
+#define __HAVE_ARCH_PMDP_GET_AND_CLEAR
|
|
|
+static inline pmd_t pmdp_get_and_clear(struct mm_struct *mm, unsigned long addr,
|
|
|
+ pmd_t *pmdp)
|
|
|
+{
|
|
|
+ pmd_t pmd = native_pmdp_get_and_clear(pmdp);
|
|
|
+ pmd_update(mm, addr, pmdp);
|
|
|
+ return pmd;
|
|
|
+}
|
|
|
+
|
|
|
+#define __HAVE_ARCH_PMDP_SET_WRPROTECT
|
|
|
+static inline void pmdp_set_wrprotect(struct mm_struct *mm,
|
|
|
+ unsigned long addr, pmd_t *pmdp)
|
|
|
+{
|
|
|
+ clear_bit(_PAGE_BIT_RW, (unsigned long *)&pmdp->pmd);
|
|
|
+ pmd_update(mm, addr, pmdp);
|
|
|
+}
|
|
|
+
|
|
|
+static inline int pmd_young(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_flags(pmd) & _PAGE_ACCESSED;
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_set_flags(pmd_t pmd, pmdval_t set)
|
|
|
+{
|
|
|
+ pmdval_t v = native_pmd_val(pmd);
|
|
|
+
|
|
|
+ return native_make_pmd(v | set);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_clear_flags(pmd_t pmd, pmdval_t clear)
|
|
|
+{
|
|
|
+ pmdval_t v = native_pmd_val(pmd);
|
|
|
+
|
|
|
+ return native_make_pmd(v & ~clear);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_mkold(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_clear_flags(pmd, _PAGE_ACCESSED);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_wrprotect(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_clear_flags(pmd, _PAGE_RW);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_mkdirty(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_set_flags(pmd, _PAGE_DIRTY);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_mkhuge(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_set_flags(pmd, _PAGE_PSE);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_mkyoung(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_set_flags(pmd, _PAGE_ACCESSED);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_mkwrite(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_set_flags(pmd, _PAGE_RW);
|
|
|
+}
|
|
|
+
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
|
|
#endif /* _ASM_X86_PGTABLE_64_H */
|