Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/lib/clear_page_64.S
10818 views
1
#include <linux/linkage.h>
2
#include <asm/dwarf2.h>
3
#include <asm/alternative-asm.h>
4
5
/*
6
* Zero a page.
7
* rdi page
8
*/
9
ENTRY(clear_page_c)
10
CFI_STARTPROC
11
movl $4096/8,%ecx
12
xorl %eax,%eax
13
rep stosq
14
ret
15
CFI_ENDPROC
16
ENDPROC(clear_page_c)
17
18
ENTRY(clear_page_c_e)
19
CFI_STARTPROC
20
movl $4096,%ecx
21
xorl %eax,%eax
22
rep stosb
23
ret
24
CFI_ENDPROC
25
ENDPROC(clear_page_c_e)
26
27
ENTRY(clear_page)
28
CFI_STARTPROC
29
xorl %eax,%eax
30
movl $4096/64,%ecx
31
.p2align 4
32
.Lloop:
33
decl %ecx
34
#define PUT(x) movq %rax,x*8(%rdi)
35
movq %rax,(%rdi)
36
PUT(1)
37
PUT(2)
38
PUT(3)
39
PUT(4)
40
PUT(5)
41
PUT(6)
42
PUT(7)
43
leaq 64(%rdi),%rdi
44
jnz .Lloop
45
nop
46
ret
47
CFI_ENDPROC
48
.Lclear_page_end:
49
ENDPROC(clear_page)
50
51
/*
52
* Some CPUs support enhanced REP MOVSB/STOSB instructions.
53
* It is recommended to use this when possible.
54
* If enhanced REP MOVSB/STOSB is not available, try to use fast string.
55
* Otherwise, use original function.
56
*
57
*/
58
59
#include <asm/cpufeature.h>
60
61
.section .altinstr_replacement,"ax"
62
1: .byte 0xeb /* jmp <disp8> */
63
.byte (clear_page_c - clear_page) - (2f - 1b) /* offset */
64
2: .byte 0xeb /* jmp <disp8> */
65
.byte (clear_page_c_e - clear_page) - (3f - 2b) /* offset */
66
3:
67
.previous
68
.section .altinstructions,"a"
69
altinstruction_entry clear_page,1b,X86_FEATURE_REP_GOOD,\
70
.Lclear_page_end-clear_page, 2b-1b
71
altinstruction_entry clear_page,2b,X86_FEATURE_ERMS, \
72
.Lclear_page_end-clear_page,3b-2b
73
.previous
74
75