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
31SYM_FUNC_START(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
63SYM_FUNC_END(perf_regs_load)
64#else
65SYM_FUNC_START(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
91SYM_FUNC_END(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