Index: sys/amd64/amd64/machdep.c =================================================================== --- sys/amd64/amd64/machdep.c +++ sys/amd64/amd64/machdep.c @@ -2746,9 +2746,12 @@ void pagezero_std(void *addr); void pagezero_erms(void *addr); +void pagezero_clzero(void *addr); DEFINE_IFUNC(, void , pagezero, (void *)) { + if ((amd_extended_feature_extensions & AMDFEID_CLZERO) != 0) + return (pagezero_clzero); return ((cpu_stdext_feature & CPUID_STDEXT_ERMS) != 0 ? pagezero_erms : pagezero_std); } Index: sys/amd64/amd64/support.S =================================================================== --- sys/amd64/amd64/support.S +++ sys/amd64/amd64/support.S @@ -66,6 +66,22 @@ ret END(pagezero_erms) +ENTRY(pagezero_clzero) + PUSH_FRAME_POINTER + movq %rdi,%rax + movl cpu_clflush_line_size(%rip),%ecx + addq $PAGE_SIZE,%rdi + sfence +1: + clzero + addq %rcx,%rax + cmpq %rax,%rdi + jne 1b + sfence + POP_FRAME_POINTER + ret +END(pagezero_clzero) + /* * pagecopy(%rdi=from, %rsi=to) */