Index: sys/arm64/arm64/pmap.c =================================================================== --- sys/arm64/arm64/pmap.c +++ sys/arm64/arm64/pmap.c @@ -244,6 +244,7 @@ static void _pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free); static int pmap_unuse_l3(pmap_t, vm_offset_t, pd_entry_t, struct spglist *); +void pagezero(void *p); /* * These load the old table data and store the new value. @@ -266,13 +267,6 @@ memcpy(d, s, PAGE_SIZE); } -static __inline void -pagezero(void *p) -{ - - bzero(p, PAGE_SIZE); -} - #define pmap_l1_index(va) (((va) >> L1_SHIFT) & Ln_ADDR_MASK) #define pmap_l2_index(va) (((va) >> L2_SHIFT) & Ln_ADDR_MASK) #define pmap_l3_index(va) (((va) >> L3_SHIFT) & Ln_ADDR_MASK) Index: sys/arm64/arm64/support.S =================================================================== --- sys/arm64/arm64/support.S +++ sys/arm64/arm64/support.S @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include "assym.s" @@ -290,3 +291,33 @@ mov x0, x1 ret END(longjmp) + +ENTRY(pagezero) + mov x2, #(PAGE_SIZE - 1) + add x0, x0, x2 + mov x2, #-1 + lsl x2, x2, #PAGE_SHIFT + and x0, x0, x2 + add x1, x0, #PAGE_SIZE + + ldr x2, =dczva_line_size + ldr x2, [x2] + cbz x2, nondczva + +dczva: + dc zva, x0 + add x0, x0, x2 + cmp x0, x1 + b.ne dczva + ret + +nondczva: + stp xzr, xzr, [x0], #0x10 + stp xzr, xzr, [x0], #0x10 + stp xzr, xzr, [x0], #0x10 + stp xzr, xzr, [x0], #0x10 + cmp x0, x1 + b.ne nondczva + ret + +END(pagezero)