
From: Matt Porter <mporter@kernel.crashing.org>

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__ */

_
