powerpc32: properly clear page table when 0 is not a good default PTE value
PATCH 2/4 powerpc32: properly clear page table when 0 is not a good default PTE value
Some HW invert some PTE bits. In some case, __pte(0) is not 0 so the PTEs shall be properly set prior to being used.
Signed-off-by Christophe Leroy <[email protected]>
--- arch/powerpc/mm/pgtable_32.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
arch/powerpc/mm/pgtable_32.c +14 -0
@@ -96,6 +96,14 @@ void pgd_free(struct mm_struct *mm, pgd_t *pgd)#endif } +static inline void pte_alloc_clear (pte_t *pte) +{ +int i; + +for (i =0 ; i <PTRS_PER_PTE ; i++) + pte[i] =__pte (0 ); +} + __init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) {pte_t *pte;
@@ -109,18 +117,24 @@ __init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addif (pte)clear_page (pte); } +if (pte && !pte_none (*pte)) +pte_alloc_clear (pte);return pte; }pgtable_t pte_alloc_one (struct mm_struct *mm,unsigned long address) {struct page *ptepage; +pte_t *pte;gfp_t flags =GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO; ptepage =alloc_pages (flags,0 );if (!ptepage)return NULL ; + pte = (pte_t *)pfn_to_kaddr (page_to_pfn (ptepage)); +if (!pte_none (*pte)) +pte_alloc_clear (pte);if (!pgtable_page_ctor (ptepage)) {__free_page (ptepage);return NULL ;
Signature · 1 line
2.1.0
Quoted 2 lines · Christophe Leroy
Some HW invert some PTE bits. In some case,
__pte(0)is not 0 so the PTEs shall be properly set prior to being used.
__pte(0) is always zero. If that changes in a future patch, that patch is not doing the right thing. The __pte()/pte_val() accesors should not do anything beyond boxing/unboxing the value in a struct. The right place for special 8xx handling of the inverted bit is in pte_mkwrite() and such.
I don't see any other architecture using __pte()/pte_val() this way.
-Scott