1/* SPDX-License-Identifier: GPL-2.0-only */ 2#include <linux/linkage.h> 3#include <asm/export.h> 4 5/* 6 * Most CPUs support enhanced REP MOVSB/STOSB instructions. It is 7 * recommended to use this when possible and we do use them by default. 8 * If enhanced REP MOVSB/STOSB is not available, try to use fast string. 9 * Otherwise, use original. 10 */ 11 12/* 13 * Zero a page. 14 * %rdi - page 15 */ 16SYM_FUNC_START(clear_page_rep) 17 movl $4096/8,%ecx 18 xorl %eax,%eax 19 rep stosq 20 ret 21SYM_FUNC_END(clear_page_rep) 22EXPORT_SYMBOL_GPL(clear_page_rep) 23 24SYM_FUNC_START(clear_page_orig) 25 xorl %eax,%eax 26 movl $4096/64,%ecx 27 .p2align 4 28.Lloop: 29 decl %ecx 30#define PUT(x) movq %rax,x*8(%rdi) 31 movq %rax,(%rdi) 32 PUT(1) 33 PUT(2) 34 PUT(3) 35 PUT(4) 36 PUT(5) 37 PUT(6) 38 PUT(7) 39 leaq 64(%rdi),%rdi 40 jnz .Lloop 41 nop 42 ret 43SYM_FUNC_END(clear_page_orig) 44EXPORT_SYMBOL_GPL(clear_page_orig) 45 46SYM_FUNC_START(clear_page_erms) 47 movl $4096,%ecx 48 xorl %eax,%eax 49 rep stosb 50 ret 51SYM_FUNC_END(clear_page_erms) 52EXPORT_SYMBOL_GPL(clear_page_erms) 53