arm64: Introduce {set,clear}_pte_bit
authorLaura Abbott <lauraa@codeaurora.org>
Tue, 19 Aug 2014 19:41:42 +0000 (20:41 +0100)
committerMark Brown <broonie@kernel.org>
Thu, 22 Jan 2015 21:43:31 +0000 (21:43 +0000)
It's useful to be able to change individual bits in ptes at times.
Introduce functions for this and update existing pte_mk* functions
to use these primatives.

Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
[will: added missing inline keyword for new header functions]
Signed-off-by: Will Deacon <will.deacon@arm.com>
(cherry picked from commit b6d4f2800b7bad654caf00654f4bff21594ef838)
Signed-off-by: Mark Brown <broonie@kernel.org>
arch/arm64/include/asm/pgtable.h

index 7099e3b84778974999710a786ef7da154f5b61d1..d86b4d4df1f0a3e5ae1572ca99ee3453bec24f32 100644 (file)
@@ -141,46 +141,51 @@ extern struct page *empty_zero_page;
 #define pte_valid_not_user(pte) \
        ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID)
 
-static inline pte_t pte_wrprotect(pte_t pte)
+static inline pte_t clear_pte_bit(pte_t pte, pgprot_t prot)
 {
-       pte_val(pte) &= ~PTE_WRITE;
+       pte_val(pte) &= ~pgprot_val(prot);
        return pte;
 }
 
-static inline pte_t pte_mkwrite(pte_t pte)
+static inline pte_t set_pte_bit(pte_t pte, pgprot_t prot)
 {
-       pte_val(pte) |= PTE_WRITE;
+       pte_val(pte) |= pgprot_val(prot);
        return pte;
 }
 
+static inline pte_t pte_wrprotect(pte_t pte)
+{
+       return clear_pte_bit(pte, __pgprot(PTE_WRITE));
+}
+
+static inline pte_t pte_mkwrite(pte_t pte)
+{
+       return set_pte_bit(pte, __pgprot(PTE_WRITE));
+}
+
 static inline pte_t pte_mkclean(pte_t pte)
 {
-       pte_val(pte) &= ~PTE_DIRTY;
-       return pte;
+       return clear_pte_bit(pte, __pgprot(PTE_DIRTY));
 }
 
 static inline pte_t pte_mkdirty(pte_t pte)
 {
-       pte_val(pte) |= PTE_DIRTY;
-       return pte;
+       return set_pte_bit(pte, __pgprot(PTE_DIRTY));
 }
 
 static inline pte_t pte_mkold(pte_t pte)
 {
-       pte_val(pte) &= ~PTE_AF;
-       return pte;
+       return clear_pte_bit(pte, __pgprot(PTE_AF));
 }
 
 static inline pte_t pte_mkyoung(pte_t pte)
 {
-       pte_val(pte) |= PTE_AF;
-       return pte;
+       return set_pte_bit(pte, __pgprot(PTE_AF));
 }
 
 static inline pte_t pte_mkspecial(pte_t pte)
 {
-       pte_val(pte) |= PTE_SPECIAL;
-       return pte;
+       return set_pte_bit(pte, __pgprot(PTE_SPECIAL));
 }
 
 static inline void set_pte(pte_t *ptep, pte_t pte)