|
@@ -146,6 +146,8 @@ extern struct page *empty_zero_page;
|
|
|
|
|
|
#define pte_valid_user(pte) \
|
|
|
((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))
|
|
|
+#define pte_valid_not_user(pte) \
|
|
|
+ ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID)
|
|
|
|
|
|
static inline pte_t pte_wrprotect(pte_t pte)
|
|
|
{
|
|
@@ -192,6 +194,15 @@ static inline pte_t pte_mkspecial(pte_t pte)
|
|
|
static inline void set_pte(pte_t *ptep, pte_t pte)
|
|
|
{
|
|
|
*ptep = pte;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Only if the new pte is valid and kernel, otherwise TLB maintenance
|
|
|
+ * or update_mmu_cache() have the necessary barriers.
|
|
|
+ */
|
|
|
+ if (pte_valid_not_user(pte)) {
|
|
|
+ dsb(ishst);
|
|
|
+ isb();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
extern void __sync_icache_dcache(pte_t pteval, unsigned long addr);
|
|
@@ -311,6 +322,7 @@ static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)
|
|
|
{
|
|
|
*pmdp = pmd;
|
|
|
dsb(ishst);
|
|
|
+ isb();
|
|
|
}
|
|
|
|
|
|
static inline void pmd_clear(pmd_t *pmdp)
|
|
@@ -343,6 +355,7 @@ static inline void set_pud(pud_t *pudp, pud_t pud)
|
|
|
{
|
|
|
*pudp = pud;
|
|
|
dsb(ishst);
|
|
|
+ isb();
|
|
|
}
|
|
|
|
|
|
static inline void pud_clear(pud_t *pudp)
|