Rev 6934 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6934 | Rev 6936 | ||
---|---|---|---|
Line 67... | Line 67... | ||
67 | 67 | ||
68 | #define pte_clear(mm, addr, ptep) native_pte_clear(mm, addr, ptep) |
68 | #define pte_clear(mm, addr, ptep) native_pte_clear(mm, addr, ptep) |
Line 69... | Line 69... | ||
69 | #define pmd_clear(pmd) native_pmd_clear(pmd) |
69 | #define pmd_clear(pmd) native_pmd_clear(pmd) |
70 | - | ||
71 | #define pte_update(mm, addr, ptep) do { } while (0) |
- | |
72 | #define pte_update_defer(mm, addr, ptep) do { } while (0) |
- | |
Line 73... | Line 70... | ||
73 | #define pmd_update(mm, addr, ptep) do { } while (0) |
70 | |
74 | #define pmd_update_defer(mm, addr, ptep) do { } while (0) |
71 | #define pte_update(mm, addr, ptep) do { } while (0) |
Line 75... | Line 72... | ||
75 | 72 | ||
Line 163... | Line 160... | ||
163 | { |
160 | { |
164 | return pmd_flags(pte) & _PAGE_PSE; |
161 | return pmd_flags(pte) & _PAGE_PSE; |
165 | } |
162 | } |
Line 166... | Line 163... | ||
166 | 163 | ||
167 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
- | |
168 | static inline int pmd_trans_splitting(pmd_t pmd) |
- | |
169 | { |
- | |
170 | return pmd_val(pmd) & _PAGE_SPLITTING; |
- | |
171 | } |
- | |
172 | 164 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
|
173 | static inline int pmd_trans_huge(pmd_t pmd) |
165 | static inline int pmd_trans_huge(pmd_t pmd) |
174 | { |
166 | { |
175 | return pmd_val(pmd) & _PAGE_PSE; |
167 | return (pmd_val(pmd) & (_PAGE_PSE|_PAGE_DEVMAP)) == _PAGE_PSE; |
Line 176... | Line 168... | ||
176 | } |
168 | } |
177 | 169 | ||
178 | static inline int has_transparent_hugepage(void) |
170 | static inline int has_transparent_hugepage(void) |
179 | { |
171 | { |
- | 172 | return cpu_has_pse; |
|
- | 173 | } |
|
- | 174 | ||
- | 175 | #ifdef __HAVE_ARCH_PTE_DEVMAP |
|
- | 176 | static inline int pmd_devmap(pmd_t pmd) |
|
- | 177 | { |
|
- | 178 | return !!(pmd_val(pmd) & _PAGE_DEVMAP); |
|
180 | return cpu_has_pse; |
179 | } |
Line 181... | Line 180... | ||
181 | } |
180 | #endif |
182 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
181 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
183 | 182 | ||
Line 253... | Line 252... | ||
253 | static inline pte_t pte_mkspecial(pte_t pte) |
252 | static inline pte_t pte_mkspecial(pte_t pte) |
254 | { |
253 | { |
255 | return pte_set_flags(pte, _PAGE_SPECIAL); |
254 | return pte_set_flags(pte, _PAGE_SPECIAL); |
256 | } |
255 | } |
Line -... | Line 256... | ||
- | 256 | ||
- | 257 | static inline pte_t pte_mkdevmap(pte_t pte) |
|
- | 258 | { |
|
- | 259 | return pte_set_flags(pte, _PAGE_SPECIAL|_PAGE_DEVMAP); |
|
- | 260 | } |
|
257 | 261 | ||
258 | static inline pmd_t pmd_set_flags(pmd_t pmd, pmdval_t set) |
262 | static inline pmd_t pmd_set_flags(pmd_t pmd, pmdval_t set) |
259 | { |
263 | { |
Line 260... | Line 264... | ||
260 | pmdval_t v = native_pmd_val(pmd); |
264 | pmdval_t v = native_pmd_val(pmd); |
Line 272... | Line 276... | ||
272 | static inline pmd_t pmd_mkold(pmd_t pmd) |
276 | static inline pmd_t pmd_mkold(pmd_t pmd) |
273 | { |
277 | { |
274 | return pmd_clear_flags(pmd, _PAGE_ACCESSED); |
278 | return pmd_clear_flags(pmd, _PAGE_ACCESSED); |
275 | } |
279 | } |
Line -... | Line 280... | ||
- | 280 | ||
- | 281 | static inline pmd_t pmd_mkclean(pmd_t pmd) |
|
- | 282 | { |
|
- | 283 | return pmd_clear_flags(pmd, _PAGE_DIRTY); |
|
- | 284 | } |
|
276 | 285 | ||
277 | static inline pmd_t pmd_wrprotect(pmd_t pmd) |
286 | static inline pmd_t pmd_wrprotect(pmd_t pmd) |
278 | { |
287 | { |
279 | return pmd_clear_flags(pmd, _PAGE_RW); |
288 | return pmd_clear_flags(pmd, _PAGE_RW); |
Line 280... | Line 289... | ||
280 | } |
289 | } |
281 | 290 | ||
282 | static inline pmd_t pmd_mkdirty(pmd_t pmd) |
291 | static inline pmd_t pmd_mkdirty(pmd_t pmd) |
283 | { |
292 | { |
Line -... | Line 293... | ||
- | 293 | return pmd_set_flags(pmd, _PAGE_DIRTY | _PAGE_SOFT_DIRTY); |
|
- | 294 | } |
|
- | 295 | ||
- | 296 | static inline pmd_t pmd_mkdevmap(pmd_t pmd) |
|
- | 297 | { |
|
284 | return pmd_set_flags(pmd, _PAGE_DIRTY | _PAGE_SOFT_DIRTY); |
298 | return pmd_set_flags(pmd, _PAGE_DEVMAP); |
285 | } |
299 | } |
286 | 300 | ||
287 | static inline pmd_t pmd_mkhuge(pmd_t pmd) |
301 | static inline pmd_t pmd_mkhuge(pmd_t pmd) |
Line 463... | Line 477... | ||
463 | static inline int pte_present(pte_t a) |
477 | static inline int pte_present(pte_t a) |
464 | { |
478 | { |
465 | return pte_flags(a) & (_PAGE_PRESENT | _PAGE_PROTNONE); |
479 | return pte_flags(a) & (_PAGE_PRESENT | _PAGE_PROTNONE); |
466 | } |
480 | } |
Line -... | Line 481... | ||
- | 481 | ||
- | 482 | #ifdef __HAVE_ARCH_PTE_DEVMAP |
|
- | 483 | static inline int pte_devmap(pte_t a) |
|
- | 484 | { |
|
- | 485 | return (pte_flags(a) & _PAGE_DEVMAP) == _PAGE_DEVMAP; |
|
- | 486 | } |
|
- | 487 | #endif |
|
467 | 488 | ||
468 | #define pte_accessible pte_accessible |
489 | #define pte_accessible pte_accessible |
469 | static inline bool pte_accessible(struct mm_struct *mm, pte_t a) |
490 | static inline bool pte_accessible(struct mm_struct *mm, pte_t a) |
470 | { |
491 | { |
471 | if (pte_flags(a) & _PAGE_PRESENT) |
492 | if (pte_flags(a) & _PAGE_PRESENT) |
Line 729... | Line 750... | ||
729 | * has not been done using the set_pte / clear_pte interfaces. It is used by |
750 | * has not been done using the set_pte / clear_pte interfaces. It is used by |
730 | * shadow mode hypervisors to resynchronize the shadow page tables. Kernel PTE |
751 | * shadow mode hypervisors to resynchronize the shadow page tables. Kernel PTE |
731 | * updates should either be sets, clears, or set_pte_atomic for P->P |
752 | * updates should either be sets, clears, or set_pte_atomic for P->P |
732 | * transitions, which means this hook should only be called for user PTEs. |
753 | * transitions, which means this hook should only be called for user PTEs. |
733 | * This hook implies a P->P protection or access change has taken place, which |
754 | * This hook implies a P->P protection or access change has taken place, which |
734 | * requires a subsequent TLB flush. The notification can optionally be delayed |
755 | * requires a subsequent TLB flush. |
735 | * until the TLB flush event by using the pte_update_defer form of the |
- | |
736 | * interface, but care must be taken to assure that the flush happens while |
- | |
737 | * still holding the same page table lock so that the shadow and primary pages |
- | |
738 | * do not become out of sync on SMP. |
- | |
739 | */ |
756 | */ |
740 | #define pte_update(mm, addr, ptep) do { } while (0) |
757 | #define pte_update(mm, addr, ptep) do { } while (0) |
741 | #define pte_update_defer(mm, addr, ptep) do { } while (0) |
- | |
742 | #endif |
758 | #endif |
Line 743... | Line 759... | ||
743 | 759 | ||
744 | /* |
760 | /* |
745 | * We only update the dirty/accessed state if we set |
761 | * We only update the dirty/accessed state if we set |
Line 814... | Line 830... | ||
814 | #define __HAVE_ARCH_PMDP_CLEAR_YOUNG_FLUSH |
830 | #define __HAVE_ARCH_PMDP_CLEAR_YOUNG_FLUSH |
815 | extern int pmdp_clear_flush_young(struct vm_area_struct *vma, |
831 | extern int pmdp_clear_flush_young(struct vm_area_struct *vma, |
816 | unsigned long address, pmd_t *pmdp); |
832 | unsigned long address, pmd_t *pmdp); |
Line 817... | Line -... | ||
817 | - | ||
818 | - | ||
819 | #define __HAVE_ARCH_PMDP_SPLITTING_FLUSH |
- | |
820 | extern void pmdp_splitting_flush(struct vm_area_struct *vma, |
- | |
821 | unsigned long addr, pmd_t *pmdp); |
833 | |
822 | 834 | ||
823 | #define __HAVE_ARCH_PMD_WRITE |
835 | #define __HAVE_ARCH_PMD_WRITE |
824 | static inline int pmd_write(pmd_t pmd) |
836 | static inline int pmd_write(pmd_t pmd) |
825 | { |
837 | { |
Line 826... | Line 838... | ||
826 | return pmd_flags(pmd) & _PAGE_RW; |
838 | return pmd_flags(pmd) & _PAGE_RW; |
827 | } |
839 | } |
828 | 840 | ||
829 | #define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR |
841 | #define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR |
830 | static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm, unsigned long addr, |
842 | static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm, unsigned long addr, |
831 | pmd_t *pmdp) |
- | |
832 | { |
- | |
833 | pmd_t pmd = native_pmdp_get_and_clear(pmdp); |
843 | pmd_t *pmdp) |
Line 834... | Line 844... | ||
834 | pmd_update(mm, addr, pmdp); |
844 | { |
835 | return pmd; |
845 | return native_pmdp_get_and_clear(pmdp); |
836 | } |
846 | } |
837 | 847 | ||
838 | #define __HAVE_ARCH_PMDP_SET_WRPROTECT |
848 | #define __HAVE_ARCH_PMDP_SET_WRPROTECT |
839 | static inline void pmdp_set_wrprotect(struct mm_struct *mm, |
- | |
840 | unsigned long addr, pmd_t *pmdp) |
849 | static inline void pmdp_set_wrprotect(struct mm_struct *mm, |
Line 841... | Line 850... | ||
841 | { |
850 | unsigned long addr, pmd_t *pmdp) |
842 | clear_bit(_PAGE_BIT_RW, (unsigned long *)pmdp); |
851 | { |
843 | pmd_update(mm, addr, pmdp); |
852 | clear_bit(_PAGE_BIT_RW, (unsigned long *)pmdp); |