| #include <linux/linkage.h> |
| #include <asm/alternative-asm.h> |
| #define PUT(x) movq %rax,x*8(%rdi) |
| * Some CPUs support enhanced REP MOVSB/STOSB instructions. |
| * It is recommended to use this when possible. |
| * If enhanced REP MOVSB/STOSB is not available, try to use fast string. |
| * Otherwise, use original function. |
| #include <asm/cpufeature.h> |
| .section .altinstr_replacement,"ax" |
| 1: .byte 0xeb /* jmp <disp8> */ |
| .byte (clear_page_c - clear_page) - (2f - 1b) /* offset */ |
| 2: .byte 0xeb /* jmp <disp8> */ |
| .byte (clear_page_c_e - clear_page) - (3f - 2b) /* offset */ |
| .section .altinstructions,"a" |
| altinstruction_entry clear_page,1b,X86_FEATURE_REP_GOOD,\ |
| .Lclear_page_end-clear_page, 2b-1b |
| altinstruction_entry clear_page,2b,X86_FEATURE_ERMS, \ |
| .Lclear_page_end-clear_page,3b-2b |