|
@@ -278,9 +278,24 @@ extern struct page *empty_zero_page;
|
|
|
|
|
|
#define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext)
|
|
|
|
|
|
-#define set_pte_at(mm,addr,ptep,pteval) do { \
|
|
|
- set_pte_ext(ptep, pteval, (addr) >= TASK_SIZE ? 0 : PTE_EXT_NG); \
|
|
|
- } while (0)
|
|
|
+#if __LINUX_ARM_ARCH__ < 6
|
|
|
+static inline void __sync_icache_dcache(pte_t pteval)
|
|
|
+{
|
|
|
+}
|
|
|
+#else
|
|
|
+extern void __sync_icache_dcache(pte_t pteval);
|
|
|
+#endif
|
|
|
+
|
|
|
+static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|
|
+ pte_t *ptep, pte_t pteval)
|
|
|
+{
|
|
|
+ if (addr >= TASK_SIZE)
|
|
|
+ set_pte_ext(ptep, pteval, 0);
|
|
|
+ else {
|
|
|
+ __sync_icache_dcache(pteval);
|
|
|
+ set_pte_ext(ptep, pteval, PTE_EXT_NG);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
* The following only work if pte_present() is true.
|
|
@@ -290,8 +305,13 @@ extern struct page *empty_zero_page;
|
|
|
#define pte_write(pte) (pte_val(pte) & L_PTE_WRITE)
|
|
|
#define pte_dirty(pte) (pte_val(pte) & L_PTE_DIRTY)
|
|
|
#define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG)
|
|
|
+#define pte_exec(pte) (pte_val(pte) & L_PTE_EXEC)
|
|
|
#define pte_special(pte) (0)
|
|
|
|
|
|
+#define pte_present_user(pte) \
|
|
|
+ ((pte_val(pte) & (L_PTE_PRESENT | L_PTE_USER)) == \
|
|
|
+ (L_PTE_PRESENT | L_PTE_USER))
|
|
|
+
|
|
|
#define PTE_BIT_FUNC(fn,op) \
|
|
|
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
|
|
|
|