|
@@ -127,10 +127,14 @@ do { \
|
|
|
} \
|
|
|
} while(0)
|
|
|
|
|
|
+static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|
|
+ pte_t *ptep, pte_t pteval);
|
|
|
+
|
|
|
#if defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
|
|
|
|
|
|
#define pte_none(pte) (!(((pte).pte_high) & ~_PAGE_GLOBAL))
|
|
|
#define pte_present(pte) ((pte).pte_low & _PAGE_PRESENT)
|
|
|
+#define pte_no_exec(pte) ((pte).pte_low & _PAGE_NO_EXEC)
|
|
|
|
|
|
static inline void set_pte(pte_t *ptep, pte_t pte)
|
|
|
{
|
|
@@ -148,7 +152,6 @@ static inline void set_pte(pte_t *ptep, pte_t pte)
|
|
|
buddy->pte_high |= _PAGE_GLOBAL;
|
|
|
}
|
|
|
}
|
|
|
-#define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval)
|
|
|
|
|
|
static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
|
|
{
|
|
@@ -166,6 +169,7 @@ static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *pt
|
|
|
|
|
|
#define pte_none(pte) (!(pte_val(pte) & ~_PAGE_GLOBAL))
|
|
|
#define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT)
|
|
|
+#define pte_no_exec(pte) (pte_val(pte) & _PAGE_NO_EXEC)
|
|
|
|
|
|
/*
|
|
|
* Certain architectures need to do special things when pte's
|
|
@@ -230,7 +234,6 @@ static inline void set_pte(pte_t *ptep, pte_t pteval)
|
|
|
}
|
|
|
#endif
|
|
|
}
|
|
|
-#define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval)
|
|
|
|
|
|
static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
|
|
{
|
|
@@ -246,6 +249,22 @@ static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *pt
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|
|
+ pte_t *ptep, pte_t pteval)
|
|
|
+{
|
|
|
+ extern void __update_cache(unsigned long address, pte_t pte);
|
|
|
+
|
|
|
+ if (!pte_present(pteval))
|
|
|
+ goto cache_sync_done;
|
|
|
+
|
|
|
+ if (pte_present(*ptep) && (pte_pfn(*ptep) == pte_pfn(pteval)))
|
|
|
+ goto cache_sync_done;
|
|
|
+
|
|
|
+ __update_cache(addr, pteval);
|
|
|
+cache_sync_done:
|
|
|
+ set_pte(ptep, pteval);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* (pmds are folded into puds so this doesn't get actually called,
|
|
|
* but the define is needed for a generic inline function.)
|
|
@@ -442,15 +461,12 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
|
|
|
|
extern void __update_tlb(struct vm_area_struct *vma, unsigned long address,
|
|
|
pte_t pte);
|
|
|
-extern void __update_cache(struct vm_area_struct *vma, unsigned long address,
|
|
|
- pte_t pte);
|
|
|
|
|
|
static inline void update_mmu_cache(struct vm_area_struct *vma,
|
|
|
unsigned long address, pte_t *ptep)
|
|
|
{
|
|
|
pte_t pte = *ptep;
|
|
|
__update_tlb(vma, address, pte);
|
|
|
- __update_cache(vma, address, pte);
|
|
|
}
|
|
|
|
|
|
static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
|