|
@@ -2,23 +2,26 @@
|
|
|
|
|
|
#include <linux/linkage.h>
|
|
#include <linux/linkage.h>
|
|
#include <asm/dwarf2.h>
|
|
#include <asm/dwarf2.h>
|
|
|
|
+#include <asm/cpufeature.h>
|
|
#include <asm/alternative-asm.h>
|
|
#include <asm/alternative-asm.h>
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Some CPUs run faster using the string copy instructions (sane microcode).
|
|
|
|
+ * It is also a lot simpler. Use this when possible. But, don't use streaming
|
|
|
|
+ * copy unless the CPU indicates X86_FEATURE_REP_GOOD. Could vary the
|
|
|
|
+ * prefetch distance based on SMP/UP.
|
|
|
|
+ */
|
|
ALIGN
|
|
ALIGN
|
|
-copy_page_rep:
|
|
|
|
|
|
+ENTRY(copy_page)
|
|
CFI_STARTPROC
|
|
CFI_STARTPROC
|
|
|
|
+ ALTERNATIVE "jmp copy_page_regs", "", X86_FEATURE_REP_GOOD
|
|
movl $4096/8, %ecx
|
|
movl $4096/8, %ecx
|
|
rep movsq
|
|
rep movsq
|
|
ret
|
|
ret
|
|
CFI_ENDPROC
|
|
CFI_ENDPROC
|
|
-ENDPROC(copy_page_rep)
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Don't use streaming copy unless the CPU indicates X86_FEATURE_REP_GOOD.
|
|
|
|
- * Could vary the prefetch distance based on SMP/UP.
|
|
|
|
-*/
|
|
|
|
|
|
+ENDPROC(copy_page)
|
|
|
|
|
|
-ENTRY(copy_page)
|
|
|
|
|
|
+ENTRY(copy_page_regs)
|
|
CFI_STARTPROC
|
|
CFI_STARTPROC
|
|
subq $2*8, %rsp
|
|
subq $2*8, %rsp
|
|
CFI_ADJUST_CFA_OFFSET 2*8
|
|
CFI_ADJUST_CFA_OFFSET 2*8
|
|
@@ -90,21 +93,5 @@ ENTRY(copy_page)
|
|
addq $2*8, %rsp
|
|
addq $2*8, %rsp
|
|
CFI_ADJUST_CFA_OFFSET -2*8
|
|
CFI_ADJUST_CFA_OFFSET -2*8
|
|
ret
|
|
ret
|
|
-.Lcopy_page_end:
|
|
|
|
CFI_ENDPROC
|
|
CFI_ENDPROC
|
|
-ENDPROC(copy_page)
|
|
|
|
-
|
|
|
|
- /* Some CPUs run faster using the string copy 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 (copy_page_rep - copy_page) - (2f - 1b) /* offset */
|
|
|
|
-2:
|
|
|
|
- .previous
|
|
|
|
- .section .altinstructions,"a"
|
|
|
|
- altinstruction_entry copy_page, 1b, X86_FEATURE_REP_GOOD, \
|
|
|
|
- .Lcopy_page_end-copy_page, 2b-1b, 0
|
|
|
|
- .previous
|
|
|
|
|
|
+ENDPROC(copy_page_regs)
|