From: Matt Porter This patch implements/uses __flush_dcache_icache_page() which kmaps on a Book E part, but keeps the existing behavior on other PowerPCs which can disable the MMU. --- 25-akpm/arch/ppc/mm/fault.c | 3 +-- 25-akpm/arch/ppc/mm/init.c | 12 +++++++++++- 25-akpm/include/asm-ppc/cacheflush.h | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff -puN arch/ppc/mm/fault.c~ppc32-fix-__flush_dcache_icache_phys-for-book-e arch/ppc/mm/fault.c --- 25/arch/ppc/mm/fault.c~ppc32-fix-__flush_dcache_icache_phys-for-book-e 2004-05-10 19:10:13.233722336 -0700 +++ 25-akpm/arch/ppc/mm/fault.c 2004-05-10 19:10:13.239721424 -0700 @@ -227,8 +227,7 @@ good_area: struct page *page = pte_page(*ptep); if (! test_bit(PG_arch_1, &page->flags)) { - unsigned long phys = page_to_pfn(page) << PAGE_SHIFT; - __flush_dcache_icache_phys(phys); + flush_dcache_icache_page(page); set_bit(PG_arch_1, &page->flags); } pte_update(ptep, 0, _PAGE_HWEXEC); diff -puN arch/ppc/mm/init.c~ppc32-fix-__flush_dcache_icache_phys-for-book-e arch/ppc/mm/init.c --- 25/arch/ppc/mm/init.c~ppc32-fix-__flush_dcache_icache_phys-for-book-e 2004-05-10 19:10:13.234722184 -0700 +++ 25-akpm/arch/ppc/mm/init.c 2004-05-10 19:10:13.240721272 -0700 @@ -572,6 +572,16 @@ void flush_dcache_page(struct page *page clear_bit(PG_arch_1, &page->flags); } +void flush_dcache_icache_page(struct page *page) +{ +#ifdef CONFIG_BOOKE + __flush_dcache_icache(kmap(page)); + kunmap(page); +#else + __flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT); +#endif + +} void clear_user_page(void *page, unsigned long vaddr, struct page *pg) { clear_page(page); @@ -614,7 +624,7 @@ void update_mmu_cache(struct vm_area_str if (vma->vm_mm == current->active_mm) __flush_dcache_icache((void *) address); else - __flush_dcache_icache_phys(pfn << PAGE_SHIFT); + flush_dcache_icache_page(page); set_bit(PG_arch_1, &page->flags); } } diff -puN include/asm-ppc/cacheflush.h~ppc32-fix-__flush_dcache_icache_phys-for-book-e include/asm-ppc/cacheflush.h --- 25/include/asm-ppc/cacheflush.h~ppc32-fix-__flush_dcache_icache_phys-for-book-e 2004-05-10 19:10:13.235722032 -0700 +++ 25-akpm/include/asm-ppc/cacheflush.h 2004-05-10 19:10:13.240721272 -0700 @@ -44,6 +44,6 @@ do { memcpy(dst, src, len); \ extern void __flush_dcache_icache(void *page_va); extern void __flush_dcache_icache_phys(unsigned long physaddr); - +extern void flush_dcache_icache_page(struct page *page); #endif /* _PPC_CACHEFLUSH_H */ #endif /* __KERNEL__ */ _