| #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) |