git: 9b0102837e30 - main - powerpc: Don't use cache to zero pages

From: Justin Hibbits <jhibbits_at_FreeBSD.org>
Date: Wed, 19 Nov 2025 04:40:25 UTC
The branch main has been updated by jhibbits:

URL: https://cgit.FreeBSD.org/src/commit/?id=9b0102837e305ca75de2bc14d284f786a33f9a6a

commit 9b0102837e305ca75de2bc14d284f786a33f9a6a
Author:     Justin Hibbits <jhibbits@FreeBSD.org>
AuthorDate: 2025-11-14 16:56:42 +0000
Commit:     Justin Hibbits <jhibbits@FreeBSD.org>
CommitDate: 2025-11-19 04:40:09 +0000

    powerpc: Don't use cache to zero pages
    
    pmap_zero_page() may be called on uncached pages, so using the cache to
    zero uncached pages may trigger a fault.
    
    MFC after:      2 weeks
---
 sys/powerpc/aim/mmu_oea.c   |  5 ++---
 sys/powerpc/aim/mmu_oea64.c | 10 ++++------
 sys/powerpc/booke/pmap_32.c |  5 ++---
 sys/powerpc/booke/pmap_64.c |  5 ++---
 4 files changed, 10 insertions(+), 15 deletions(-)

diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index ae17b3289593..b1f74597aa42 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -1090,10 +1090,9 @@ moea_copy_pages(vm_page_t *ma, vm_offset_t a_offset,
 void
 moea_zero_page(vm_page_t m)
 {
-	vm_offset_t off, pa = VM_PAGE_TO_PHYS(m);
+	vm_offset_t pa = VM_PAGE_TO_PHYS(m);
 
-	for (off = 0; off < PAGE_SIZE; off += cacheline_size)
-		__asm __volatile("dcbz 0,%0" :: "r"(pa + off));
+	bzero((void *)pa, PAGE_SIZE);
 }
 
 void
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index 01bf4c7e90a8..62bbb6ddaf9b 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -1567,15 +1567,14 @@ void
 moea64_zero_page(vm_page_t m)
 {
 	vm_paddr_t pa = VM_PAGE_TO_PHYS(m);
-	vm_offset_t va, off;
+	vm_offset_t va;
 
 	mtx_lock(&moea64_scratchpage_mtx);
 
 	moea64_set_scratchpage_pa(0, pa);
 	va = moea64_scratchpage_va[0];
 
-	for (off = 0; off < PAGE_SIZE; off += cacheline_size)
-		__asm __volatile("dcbz 0,%0" :: "r"(va + off));
+	bzero((void *)va, PAGE_SIZE);
 
 	mtx_unlock(&moea64_scratchpage_mtx);
 }
@@ -1584,11 +1583,10 @@ void
 moea64_zero_page_dmap(vm_page_t m)
 {
 	vm_paddr_t pa = VM_PAGE_TO_PHYS(m);
-	vm_offset_t va, off;
+	vm_offset_t va;
 
 	va = PHYS_TO_DMAP(pa);
-	for (off = 0; off < PAGE_SIZE; off += cacheline_size)
-		__asm __volatile("dcbz 0,%0" :: "r"(va + off));
+	bzero((void *)va, PAGE_SIZE);
 }
 
 vm_offset_t
diff --git a/sys/powerpc/booke/pmap_32.c b/sys/powerpc/booke/pmap_32.c
index efeefb6a91c5..5186a8852ed3 100644
--- a/sys/powerpc/booke/pmap_32.c
+++ b/sys/powerpc/booke/pmap_32.c
@@ -803,15 +803,14 @@ mmu_booke_zero_page_area(vm_page_t m, int off, int size)
 static void
 mmu_booke_zero_page(vm_page_t m)
 {
-	vm_offset_t off, va;
+	vm_offset_t va;
 
 	va = zero_page_va;
 	mtx_lock(&zero_page_mutex);
 
 	mmu_booke_kenter(va, VM_PAGE_TO_PHYS(m));
 
-	for (off = 0; off < PAGE_SIZE; off += cacheline_size)
-		__asm __volatile("dcbz 0,%0" :: "r"(va + off));
+	bzero((void *)va, PAGE_SIZE);
 
 	mmu_booke_kremove(va);
 
diff --git a/sys/powerpc/booke/pmap_64.c b/sys/powerpc/booke/pmap_64.c
index affa08ebee3f..5a414b9026c8 100644
--- a/sys/powerpc/booke/pmap_64.c
+++ b/sys/powerpc/booke/pmap_64.c
@@ -679,12 +679,11 @@ mmu_booke_zero_page_area(vm_page_t m, int off, int size)
 static void
 mmu_booke_zero_page(vm_page_t m)
 {
-	vm_offset_t off, va;
+	vm_offset_t va;
 
 	va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
 
-	for (off = 0; off < PAGE_SIZE; off += cacheline_size)
-		__asm __volatile("dcbz 0,%0" :: "r"(va + off));
+	bzero((void *)va, PAGE_SIZE);
 }
 
 /*