#include <linux/linkage.h> #include <asm/cpufeatures.h> #include <asm/alternative-asm.h> #include <asm/export.h> /* * Most CPUs support enhanced REP MOVSB/STOSB instructions. It is * recommended to use this when possible and we do use them by default. * If enhanced REP MOVSB/STOSB is not available, try to use fast string. * Otherwise, use original. */ /* * Zero a page. * %rdi - page */ ENTRY(clear_page) ALTERNATIVE_2 "jmp clear_page_orig", "", X86_FEATURE_REP_GOOD, \ "jmp clear_page_c_e", X86_FEATURE_ERMS movl $4096/8,%ecx xorl %eax,%eax rep stosq ret ENDPROC(clear_page) EXPORT_SYMBOL(clear_page) ENTRY(clear_page_orig) xorl %eax,%eax movl $4096/64,%ecx .p2align 4 .Lloop: decl %ecx #define PUT(x) movq %rax,x*8(%rdi) movq %rax,(%rdi) PUT(1) PUT(2) PUT(3) PUT(4) PUT(5) PUT(6) PUT(7) leaq 64(%rdi),%rdi jnz .Lloop nop ret ENDPROC(clear_page_orig) ENTRY(clear_page_c_e) movl $4096,%ecx xorl %eax,%eax rep stosb ret ENDPROC(clear_page_c_e) |