git: 9b0102837e30 - main - powerpc: Don't use cache to zero pages
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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);
}
/*