1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <linux/linkage.h>
3 
4 #define AX	 0
5 #define BX	 1 * 8
6 #define CX	 2 * 8
7 #define DX	 3 * 8
8 #define SI	 4 * 8
9 #define DI	 5 * 8
10 #define BP	 6 * 8
11 #define SP	 7 * 8
12 #define IP	 8 * 8
13 #define FLAGS	 9 * 8
14 #define CS	10 * 8
15 #define SS	11 * 8
16 #define DS	12 * 8
17 #define ES	13 * 8
18 #define FS	14 * 8
19 #define GS	15 * 8
20 #define R8	16 * 8
21 #define R9	17 * 8
22 #define R10	18 * 8
23 #define R11	19 * 8
24 #define R12	20 * 8
25 #define R13	21 * 8
26 #define R14	22 * 8
27 #define R15	23 * 8
28 
29 .text
30 #ifdef HAVE_ARCH_X86_64_SUPPORT
31 ENTRY(perf_regs_load)
32 	movq %rax, AX(%rdi)
33 	movq %rbx, BX(%rdi)
34 	movq %rcx, CX(%rdi)
35 	movq %rdx, DX(%rdi)
36 	movq %rsi, SI(%rdi)
37 	movq %rdi, DI(%rdi)
38 	movq %rbp, BP(%rdi)
39 
40 	leaq 8(%rsp), %rax /* exclude this call.  */
41 	movq %rax, SP(%rdi)
42 
43 	movq 0(%rsp), %rax
44 	movq %rax, IP(%rdi)
45 
46 	movq $0, FLAGS(%rdi)
47 	movq $0, CS(%rdi)
48 	movq $0, SS(%rdi)
49 	movq $0, DS(%rdi)
50 	movq $0, ES(%rdi)
51 	movq $0, FS(%rdi)
52 	movq $0, GS(%rdi)
53 
54 	movq %r8,  R8(%rdi)
55 	movq %r9,  R9(%rdi)
56 	movq %r10, R10(%rdi)
57 	movq %r11, R11(%rdi)
58 	movq %r12, R12(%rdi)
59 	movq %r13, R13(%rdi)
60 	movq %r14, R14(%rdi)
61 	movq %r15, R15(%rdi)
62 	ret
63 ENDPROC(perf_regs_load)
64 #else
65 ENTRY(perf_regs_load)
66 	push %edi
67 	movl 8(%esp), %edi
68 	movl %eax, AX(%edi)
69 	movl %ebx, BX(%edi)
70 	movl %ecx, CX(%edi)
71 	movl %edx, DX(%edi)
72 	movl %esi, SI(%edi)
73 	pop %eax
74 	movl %eax, DI(%edi)
75 	movl %ebp, BP(%edi)
76 
77 	leal 4(%esp), %eax /* exclude this call.  */
78 	movl %eax, SP(%edi)
79 
80 	movl 0(%esp), %eax
81 	movl %eax, IP(%edi)
82 
83 	movl $0, FLAGS(%edi)
84 	movl $0, CS(%edi)
85 	movl $0, SS(%edi)
86 	movl $0, DS(%edi)
87 	movl $0, ES(%edi)
88 	movl $0, FS(%edi)
89 	movl $0, GS(%edi)
90 	ret
91 ENDPROC(perf_regs_load)
92 #endif
93 
94 /*
95  * We need to provide note.GNU-stack section, saying that we want
96  * NOT executable stack. Otherwise the final linking will assume that
97  * the ELF stack should not be restricted at all and set it RWX.
98  */
99 .section .note.GNU-stack,"",@progbits
100