diff options
Diffstat (limited to 'arch/x86/lib/clear_page_64.S')
-rw-r--r-- | arch/x86/lib/clear_page_64.S | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/arch/x86/lib/clear_page_64.S b/arch/x86/lib/clear_page_64.S new file mode 100644 index 000000000..88acd3499 --- /dev/null +++ b/arch/x86/lib/clear_page_64.S @@ -0,0 +1,51 @@ +#include <linux/linkage.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_rep) + movl $4096/8,%ecx + xorl %eax,%eax + rep stosq + ret +ENDPROC(clear_page_rep) +EXPORT_SYMBOL_GPL(clear_page_rep) + +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) +EXPORT_SYMBOL_GPL(clear_page_orig) + +ENTRY(clear_page_erms) + movl $4096,%ecx + xorl %eax,%eax + rep stosb + ret +ENDPROC(clear_page_erms) +EXPORT_SYMBOL_GPL(clear_page_erms) |