diff options
author | Laura Abbott <lauraa@codeaurora.org> | 2014-08-19 15:41:42 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2014-09-08 09:39:18 -0400 |
commit | b6d4f2800b7bad654caf00654f4bff21594ef838 (patch) | |
tree | 9d6d26aa5587d8c65ea64dd61068db2659a1c2f0 | |
parent | 5e051531447259e5df95c44bccb69979537c19e4 (diff) |
arm64: Introduce {set,clear}_pte_bit
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>
-rw-r--r-- | arch/arm64/include/asm/pgtable.h | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index ffe1ba0506d1..d58e40cde88e 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
@@ -149,46 +149,51 @@ extern struct page *empty_zero_page; | |||
149 | #define pte_valid_not_user(pte) \ | 149 | #define pte_valid_not_user(pte) \ |
150 | ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) | 150 | ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) |
151 | 151 | ||
152 | static inline pte_t pte_wrprotect(pte_t pte) | 152 | static inline pte_t clear_pte_bit(pte_t pte, pgprot_t prot) |
153 | { | 153 | { |
154 | pte_val(pte) &= ~PTE_WRITE; | 154 | pte_val(pte) &= ~pgprot_val(prot); |
155 | return pte; | 155 | return pte; |
156 | } | 156 | } |
157 | 157 | ||
158 | static inline pte_t pte_mkwrite(pte_t pte) | 158 | static inline pte_t set_pte_bit(pte_t pte, pgprot_t prot) |
159 | { | 159 | { |
160 | pte_val(pte) |= PTE_WRITE; | 160 | pte_val(pte) |= pgprot_val(prot); |
161 | return pte; | 161 | return pte; |
162 | } | 162 | } |
163 | 163 | ||
164 | static inline pte_t pte_wrprotect(pte_t pte) | ||
165 | { | ||
166 | return clear_pte_bit(pte, __pgprot(PTE_WRITE)); | ||
167 | } | ||
168 | |||
169 | static inline pte_t pte_mkwrite(pte_t pte) | ||
170 | { | ||
171 | return set_pte_bit(pte, __pgprot(PTE_WRITE)); | ||
172 | } | ||
173 | |||
164 | static inline pte_t pte_mkclean(pte_t pte) | 174 | static inline pte_t pte_mkclean(pte_t pte) |
165 | { | 175 | { |
166 | pte_val(pte) &= ~PTE_DIRTY; | 176 | return clear_pte_bit(pte, __pgprot(PTE_DIRTY)); |
167 | return pte; | ||
168 | } | 177 | } |
169 | 178 | ||
170 | static inline pte_t pte_mkdirty(pte_t pte) | 179 | static inline pte_t pte_mkdirty(pte_t pte) |
171 | { | 180 | { |
172 | pte_val(pte) |= PTE_DIRTY; | 181 | return set_pte_bit(pte, __pgprot(PTE_DIRTY)); |
173 | return pte; | ||
174 | } | 182 | } |
175 | 183 | ||
176 | static inline pte_t pte_mkold(pte_t pte) | 184 | static inline pte_t pte_mkold(pte_t pte) |
177 | { | 185 | { |
178 | pte_val(pte) &= ~PTE_AF; | 186 | return clear_pte_bit(pte, __pgprot(PTE_AF)); |
179 | return pte; | ||
180 | } | 187 | } |
181 | 188 | ||
182 | static inline pte_t pte_mkyoung(pte_t pte) | 189 | static inline pte_t pte_mkyoung(pte_t pte) |
183 | { | 190 | { |
184 | pte_val(pte) |= PTE_AF; | 191 | return set_pte_bit(pte, __pgprot(PTE_AF)); |
185 | return pte; | ||
186 | } | 192 | } |
187 | 193 | ||
188 | static inline pte_t pte_mkspecial(pte_t pte) | 194 | static inline pte_t pte_mkspecial(pte_t pte) |
189 | { | 195 | { |
190 | pte_val(pte) |= PTE_SPECIAL; | 196 | return set_pte_bit(pte, __pgprot(PTE_SPECIAL)); |
191 | return pte; | ||
192 | } | 197 | } |
193 | 198 | ||
194 | static inline void set_pte(pte_t *ptep, pte_t pte) | 199 | static inline void set_pte(pte_t *ptep, pte_t pte) |