|
@@ -178,28 +178,6 @@ static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long addr)
|
|
|
#define pte_offset_map(dir, addr) pte_offset_kernel((dir), (addr))
|
|
|
#define pte_unmap(pte) ((void)(pte))
|
|
|
|
|
|
-/*
|
|
|
- * Certain architectures need to do special things when PTEs within
|
|
|
- * a page table are directly modified. Thus, the following hook is
|
|
|
- * made available.
|
|
|
- */
|
|
|
-static inline void set_pte(pte_t *ptep, pte_t pteval)
|
|
|
-{
|
|
|
- *ptep = pteval;
|
|
|
-}
|
|
|
-
|
|
|
-static inline void set_pte_at(struct mm_struct *mm,
|
|
|
- unsigned long addr, pte_t *ptep, pte_t pteval)
|
|
|
-{
|
|
|
- set_pte(ptep, pteval);
|
|
|
-}
|
|
|
-
|
|
|
-static inline void pte_clear(struct mm_struct *mm,
|
|
|
- unsigned long addr, pte_t *ptep)
|
|
|
-{
|
|
|
- set_pte_at(mm, addr, ptep, __pte(0));
|
|
|
-}
|
|
|
-
|
|
|
static inline int pte_present(pte_t pte)
|
|
|
{
|
|
|
return (pte_val(pte) & _PAGE_PRESENT);
|
|
@@ -210,21 +188,22 @@ static inline int pte_none(pte_t pte)
|
|
|
return (pte_val(pte) == 0);
|
|
|
}
|
|
|
|
|
|
-/* static inline int pte_read(pte_t pte) */
|
|
|
-
|
|
|
static inline int pte_write(pte_t pte)
|
|
|
{
|
|
|
return pte_val(pte) & _PAGE_WRITE;
|
|
|
}
|
|
|
|
|
|
+static inline int pte_exec(pte_t pte)
|
|
|
+{
|
|
|
+ return pte_val(pte) & _PAGE_EXEC;
|
|
|
+}
|
|
|
+
|
|
|
static inline int pte_huge(pte_t pte)
|
|
|
{
|
|
|
return pte_present(pte)
|
|
|
&& (pte_val(pte) & (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC));
|
|
|
}
|
|
|
|
|
|
-/* static inline int pte_exec(pte_t pte) */
|
|
|
-
|
|
|
static inline int pte_dirty(pte_t pte)
|
|
|
{
|
|
|
return pte_val(pte) & _PAGE_DIRTY;
|
|
@@ -311,6 +290,33 @@ static inline int pte_same(pte_t pte_a, pte_t pte_b)
|
|
|
return pte_val(pte_a) == pte_val(pte_b);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Certain architectures need to do special things when PTEs within
|
|
|
+ * a page table are directly modified. Thus, the following hook is
|
|
|
+ * made available.
|
|
|
+ */
|
|
|
+static inline void set_pte(pte_t *ptep, pte_t pteval)
|
|
|
+{
|
|
|
+ *ptep = pteval;
|
|
|
+}
|
|
|
+
|
|
|
+void flush_icache_pte(pte_t pte);
|
|
|
+
|
|
|
+static inline void set_pte_at(struct mm_struct *mm,
|
|
|
+ unsigned long addr, pte_t *ptep, pte_t pteval)
|
|
|
+{
|
|
|
+ if (pte_present(pteval) && pte_exec(pteval))
|
|
|
+ flush_icache_pte(pteval);
|
|
|
+
|
|
|
+ set_pte(ptep, pteval);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void pte_clear(struct mm_struct *mm,
|
|
|
+ unsigned long addr, pte_t *ptep)
|
|
|
+{
|
|
|
+ set_pte_at(mm, addr, ptep, __pte(0));
|
|
|
+}
|
|
|
+
|
|
|
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
|
|
|
static inline int ptep_set_access_flags(struct vm_area_struct *vma,
|
|
|
unsigned long address, pte_t *ptep,
|