|
@@ -97,6 +97,11 @@ static inline int pte_young(pte_t pte)
|
|
|
return pte_flags(pte) & _PAGE_ACCESSED;
|
|
|
}
|
|
|
|
|
|
+static inline int pmd_young(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_flags(pmd) & _PAGE_ACCESSED;
|
|
|
+}
|
|
|
+
|
|
|
static inline int pte_write(pte_t pte)
|
|
|
{
|
|
|
return pte_flags(pte) & _PAGE_RW;
|
|
@@ -145,6 +150,18 @@ static inline int pmd_large(pmd_t pte)
|
|
|
(_PAGE_PSE | _PAGE_PRESENT);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
|
|
+static inline int pmd_trans_splitting(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_val(pmd) & _PAGE_SPLITTING;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int pmd_trans_huge(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_val(pmd) & _PAGE_PSE;
|
|
|
+}
|
|
|
+#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
|
|
+
|
|
|
static inline pte_t pte_set_flags(pte_t pte, pteval_t set)
|
|
|
{
|
|
|
pteval_t v = native_pte_val(pte);
|
|
@@ -219,6 +236,55 @@ static inline pte_t pte_mkspecial(pte_t pte)
|
|
|
return pte_set_flags(pte, _PAGE_SPECIAL);
|
|
|
}
|
|
|
|
|
|
+static inline pmd_t pmd_set_flags(pmd_t pmd, pmdval_t set)
|
|
|
+{
|
|
|
+ pmdval_t v = native_pmd_val(pmd);
|
|
|
+
|
|
|
+ return __pmd(v | set);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_clear_flags(pmd_t pmd, pmdval_t clear)
|
|
|
+{
|
|
|
+ pmdval_t v = native_pmd_val(pmd);
|
|
|
+
|
|
|
+ return __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);
|
|
|
+}
|
|
|
+
|
|
|
+static inline pmd_t pmd_mknotpresent(pmd_t pmd)
|
|
|
+{
|
|
|
+ return pmd_clear_flags(pmd, _PAGE_PRESENT);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Mask out unsupported bits in a present pgprot. Non-present pgprots
|
|
|
* can use those bits for other purposes, so leave them be.
|
|
@@ -527,6 +593,14 @@ static inline pte_t native_local_ptep_get_and_clear(pte_t *ptep)
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
+static inline pmd_t native_local_pmdp_get_and_clear(pmd_t *pmdp)
|
|
|
+{
|
|
|
+ pmd_t res = *pmdp;
|
|
|
+
|
|
|
+ native_pmd_clear(pmdp);
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
static inline void native_set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|
|
pte_t *ptep , pte_t pte)
|
|
|
{
|
|
@@ -616,6 +690,49 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm,
|
|
|
|
|
|
#define flush_tlb_fix_spurious_fault(vma, address)
|
|
|
|
|
|
+#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_update(mm, addr, pmdp);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* clone_pgd_range(pgd_t *dst, pgd_t *src, int count);
|
|
|
*
|