1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _ASM_GENERIC_PGTABLE_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _ASM_GENERIC_PGTABLE_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_ESTABLISH 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Establish a new mapping: 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - flush the old one 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - update the page tables 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - inform the TLB about the new one 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We hold the mm semaphore for reading, and the pte lock. 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Note: the old pte is known to not be writable, so we don't need to 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * worry about dirty bits etc getting lost. 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_SET_PTE_ATOMIC 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_establish(__vma, __address, __ptep, __entry) \ 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_pte_at((__vma)->vm_mm, (__address), __ptep, __entry); \ 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru flush_tlb_page(__vma, __address); \ 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* __HAVE_ARCH_SET_PTE_ATOMIC */ 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_establish(__vma, __address, __ptep, __entry) \ 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_pte_atomic(__ptep, __entry); \ 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru flush_tlb_page(__vma, __address); \ 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __HAVE_ARCH_SET_PTE_ATOMIC */ 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Largely same as above, but only sets the access flags (dirty, 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * accessed, and writable). Furthermore, we know it always gets set 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to a "more permissive" setting, which allows most architectures 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to optimize this. 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \ 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_pte_at((__vma)->vm_mm, (__address), __ptep, __entry); \ 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru flush_tlb_page(__vma, __address); \ 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_test_and_clear_young(__vma, __address, __ptep) \ 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_t __pte = *(__ptep); \ 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int r = 1; \ 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!pte_young(__pte)) \ 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru r = 0; \ 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else \ 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_pte_at((__vma)->vm_mm, (__address), \ 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (__ptep), pte_mkold(__pte)); \ 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru r; \ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_clear_flush_young(__vma, __address, __ptep) \ 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int __young; \ 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __young = ptep_test_and_clear_young(__vma, __address, __ptep); \ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (__young) \ 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru flush_tlb_page(__vma, __address); \ 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __young; \ 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_test_and_clear_dirty(__vma, __address, __ptep) \ 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_t __pte = *__ptep; \ 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int r = 1; \ 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!pte_dirty(__pte)) \ 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru r = 0; \ 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else \ 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_pte_at((__vma)->vm_mm, (__address), (__ptep), \ 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_mkclean(__pte)); \ 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru r; \ 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_CLEAR_DIRTY_FLUSH 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_clear_flush_dirty(__vma, __address, __ptep) \ 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int __dirty; \ 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __dirty = ptep_test_and_clear_dirty(__vma, __address, __ptep); \ 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (__dirty) \ 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru flush_tlb_page(__vma, __address); \ 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __dirty; \ 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_get_and_clear(__mm, __address, __ptep) \ 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_t __pte = *(__ptep); \ 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_clear((__mm), (__address), (__ptep)); \ 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __pte; \ 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_get_and_clear_full(__mm, __address, __ptep, __full) \ 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_t __pte; \ 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __pte = ptep_get_and_clear((__mm), (__address), (__ptep)); \ 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __pte; \ 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTE_CLEAR_FULL 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_clear_full(__mm, __address, __ptep, __full) \ 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_clear((__mm), (__address), (__ptep)); \ 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_CLEAR_FLUSH 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ptep_clear_flush(__vma, __address, __ptep) \ 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_t __pte; \ 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __pte = ptep_get_and_clear((__vma)->vm_mm, __address, __ptep); \ 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru flush_tlb_page(__vma, __address); \ 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __pte; \ 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTEP_SET_WRPROTECT 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mm_struct; 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long address, pte_t *ptep) 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_t old_pte = *ptep; 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_pte_at(mm, address, ptep, pte_wrprotect(old_pte)); 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PTE_SAME 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_same(A,B) (pte_val(A) == pte_val(B)) 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define page_test_and_clear_dirty(page) (0) 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_maybe_dirty(pte) pte_dirty(pte) 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_maybe_dirty(pte) (1) 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define page_test_and_clear_young(page) (0) 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_PGD_OFFSET_GATE 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pgd_offset_gate(mm, addr) pgd_offset(mm, addr) 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_LAZY_MMU_PROT_UPDATE 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define lazy_mmu_prot_update(pte) do { } while (0) 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __HAVE_ARCH_MOVE_PTE 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define move_pte(pte, prot, old_addr, new_addr) (pte) 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * When walking page tables, get the address of the next boundary, 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * or the end address of the range if that comes earlier. Although no 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * vma end wraps to 0, rounded up __boundary may wrap to 0 throughout. 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pgd_addr_end(addr, end) \ 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ unsigned long __boundary = ((addr) + PGDIR_SIZE) & PGDIR_MASK; \ 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (__boundary - 1 < (end) - 1)? __boundary: (end); \ 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef pud_addr_end 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pud_addr_end(addr, end) \ 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ unsigned long __boundary = ((addr) + PUD_SIZE) & PUD_MASK; \ 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (__boundary - 1 < (end) - 1)? __boundary: (end); \ 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef pmd_addr_end 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pmd_addr_end(addr, end) \ 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ unsigned long __boundary = ((addr) + PMD_SIZE) & PMD_MASK; \ 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (__boundary - 1 < (end) - 1)? __boundary: (end); \ 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __ASSEMBLY__ 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * When walking page tables, we usually want to skip any p?d_none entries; 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and any p?d_bad entries - reporting the error before resetting to none. 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Do the tests inline, but report and clear the bad entry in mm/memory.c. 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid pgd_clear_bad(pgd_t *); 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid pud_clear_bad(pud_t *); 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid pmd_clear_bad(pmd_t *); 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int pgd_none_or_clear_bad(pgd_t *pgd) 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (pgd_none(*pgd)) 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(pgd_bad(*pgd))) { 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pgd_clear_bad(pgd); 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int pud_none_or_clear_bad(pud_t *pud) 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (pud_none(*pud)) 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(pud_bad(*pud))) { 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pud_clear_bad(pud); 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int pmd_none_or_clear_bad(pmd_t *pmd) 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (pmd_none(*pmd)) 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(pmd_bad(*pmd))) { 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pmd_clear_bad(pmd); 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* !__ASSEMBLY__ */ 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _ASM_GENERIC_PGTABLE_H */ 236