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