18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci#include <linux/linkage.h> 38c2ecf20Sopenharmony_ci#include <asm/export.h> 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci/* 68c2ecf20Sopenharmony_ci * Most CPUs support enhanced REP MOVSB/STOSB instructions. It is 78c2ecf20Sopenharmony_ci * recommended to use this when possible and we do use them by default. 88c2ecf20Sopenharmony_ci * If enhanced REP MOVSB/STOSB is not available, try to use fast string. 98c2ecf20Sopenharmony_ci * Otherwise, use original. 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci/* 138c2ecf20Sopenharmony_ci * Zero a page. 148c2ecf20Sopenharmony_ci * %rdi - page 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ciSYM_FUNC_START(clear_page_rep) 178c2ecf20Sopenharmony_ci movl $4096/8,%ecx 188c2ecf20Sopenharmony_ci xorl %eax,%eax 198c2ecf20Sopenharmony_ci rep stosq 208c2ecf20Sopenharmony_ci RET 218c2ecf20Sopenharmony_ciSYM_FUNC_END(clear_page_rep) 228c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clear_page_rep) 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ciSYM_FUNC_START(clear_page_orig) 258c2ecf20Sopenharmony_ci xorl %eax,%eax 268c2ecf20Sopenharmony_ci movl $4096/64,%ecx 278c2ecf20Sopenharmony_ci .p2align 4 288c2ecf20Sopenharmony_ci.Lloop: 298c2ecf20Sopenharmony_ci decl %ecx 308c2ecf20Sopenharmony_ci#define PUT(x) movq %rax,x*8(%rdi) 318c2ecf20Sopenharmony_ci movq %rax,(%rdi) 328c2ecf20Sopenharmony_ci PUT(1) 338c2ecf20Sopenharmony_ci PUT(2) 348c2ecf20Sopenharmony_ci PUT(3) 358c2ecf20Sopenharmony_ci PUT(4) 368c2ecf20Sopenharmony_ci PUT(5) 378c2ecf20Sopenharmony_ci PUT(6) 388c2ecf20Sopenharmony_ci PUT(7) 398c2ecf20Sopenharmony_ci leaq 64(%rdi),%rdi 408c2ecf20Sopenharmony_ci jnz .Lloop 418c2ecf20Sopenharmony_ci nop 428c2ecf20Sopenharmony_ci RET 438c2ecf20Sopenharmony_ciSYM_FUNC_END(clear_page_orig) 448c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clear_page_orig) 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ciSYM_FUNC_START(clear_page_erms) 478c2ecf20Sopenharmony_ci movl $4096,%ecx 488c2ecf20Sopenharmony_ci xorl %eax,%eax 498c2ecf20Sopenharmony_ci rep stosb 508c2ecf20Sopenharmony_ci RET 518c2ecf20Sopenharmony_ciSYM_FUNC_END(clear_page_erms) 528c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clear_page_erms) 53