aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Hibbits <jhibbits@FreeBSD.org>2025-11-14 16:56:42 +0000
committerJustin Hibbits <jhibbits@FreeBSD.org>2025-11-19 04:40:09 +0000
commit9b0102837e305ca75de2bc14d284f786a33f9a6a (patch)
tree76ed9cdc57c69e1035bf3e67edc9f3c97187f85b
parentd1180baa9b99538481f3780fc8f4e6e464a15e99 (diff)
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
-rw-r--r--sys/powerpc/aim/mmu_oea.c5
-rw-r--r--sys/powerpc/aim/mmu_oea64.c10
-rw-r--r--sys/powerpc/booke/pmap_32.c5
-rw-r--r--sys/powerpc/booke/pmap_64.c5
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);
}
/*