#include <linux/linkage.h> | |
#include <asm/dwarf2.h> | |
/* | |
* Zero a page. | |
* rdi page | |
*/ | |
ALIGN | |
clear_page_c: | |
CFI_STARTPROC | |
movl $4096/8,%ecx | |
xorl %eax,%eax | |
rep stosq | |
ret | |
CFI_ENDPROC | |
ENDPROC(clear_page) | |
ENTRY(clear_page) | |
CFI_STARTPROC | |
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 | |
CFI_ENDPROC | |
.Lclear_page_end: | |
ENDPROC(clear_page) | |
/* Some CPUs run faster using the string instructions. | |
It is also a lot simpler. Use this when possible */ | |
#include <asm/cpufeature.h> | |
.section .altinstr_replacement,"ax" | |
1: .byte 0xeb /* jmp <disp8> */ | |
.byte (clear_page_c - clear_page) - (2f - 1b) /* offset */ | |
2: | |
.previous | |
.section .altinstructions,"a" | |
.align 8 | |
.quad clear_page | |
.quad 1b | |
.byte X86_FEATURE_REP_GOOD | |
.byte .Lclear_page_end - clear_page | |
.byte 2b - 1b | |
.previous |