162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <linux/linkage.h>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#define AX	 0
562306a36Sopenharmony_ci#define BX	 1 * 8
662306a36Sopenharmony_ci#define CX	 2 * 8
762306a36Sopenharmony_ci#define DX	 3 * 8
862306a36Sopenharmony_ci#define SI	 4 * 8
962306a36Sopenharmony_ci#define DI	 5 * 8
1062306a36Sopenharmony_ci#define BP	 6 * 8
1162306a36Sopenharmony_ci#define SP	 7 * 8
1262306a36Sopenharmony_ci#define IP	 8 * 8
1362306a36Sopenharmony_ci#define FLAGS	 9 * 8
1462306a36Sopenharmony_ci#define CS	10 * 8
1562306a36Sopenharmony_ci#define SS	11 * 8
1662306a36Sopenharmony_ci#define DS	12 * 8
1762306a36Sopenharmony_ci#define ES	13 * 8
1862306a36Sopenharmony_ci#define FS	14 * 8
1962306a36Sopenharmony_ci#define GS	15 * 8
2062306a36Sopenharmony_ci#define R8	16 * 8
2162306a36Sopenharmony_ci#define R9	17 * 8
2262306a36Sopenharmony_ci#define R10	18 * 8
2362306a36Sopenharmony_ci#define R11	19 * 8
2462306a36Sopenharmony_ci#define R12	20 * 8
2562306a36Sopenharmony_ci#define R13	21 * 8
2662306a36Sopenharmony_ci#define R14	22 * 8
2762306a36Sopenharmony_ci#define R15	23 * 8
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci.text
3062306a36Sopenharmony_ci#ifdef HAVE_ARCH_X86_64_SUPPORT
3162306a36Sopenharmony_ciSYM_FUNC_START(perf_regs_load)
3262306a36Sopenharmony_ci	movq %rax, AX(%rdi)
3362306a36Sopenharmony_ci	movq %rbx, BX(%rdi)
3462306a36Sopenharmony_ci	movq %rcx, CX(%rdi)
3562306a36Sopenharmony_ci	movq %rdx, DX(%rdi)
3662306a36Sopenharmony_ci	movq %rsi, SI(%rdi)
3762306a36Sopenharmony_ci	movq %rdi, DI(%rdi)
3862306a36Sopenharmony_ci	movq %rbp, BP(%rdi)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	leaq 8(%rsp), %rax /* exclude this call.  */
4162306a36Sopenharmony_ci	movq %rax, SP(%rdi)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	movq 0(%rsp), %rax
4462306a36Sopenharmony_ci	movq %rax, IP(%rdi)
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	movq $0, FLAGS(%rdi)
4762306a36Sopenharmony_ci	movq $0, CS(%rdi)
4862306a36Sopenharmony_ci	movq $0, SS(%rdi)
4962306a36Sopenharmony_ci	movq $0, DS(%rdi)
5062306a36Sopenharmony_ci	movq $0, ES(%rdi)
5162306a36Sopenharmony_ci	movq $0, FS(%rdi)
5262306a36Sopenharmony_ci	movq $0, GS(%rdi)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	movq %r8,  R8(%rdi)
5562306a36Sopenharmony_ci	movq %r9,  R9(%rdi)
5662306a36Sopenharmony_ci	movq %r10, R10(%rdi)
5762306a36Sopenharmony_ci	movq %r11, R11(%rdi)
5862306a36Sopenharmony_ci	movq %r12, R12(%rdi)
5962306a36Sopenharmony_ci	movq %r13, R13(%rdi)
6062306a36Sopenharmony_ci	movq %r14, R14(%rdi)
6162306a36Sopenharmony_ci	movq %r15, R15(%rdi)
6262306a36Sopenharmony_ci	ret
6362306a36Sopenharmony_ciSYM_FUNC_END(perf_regs_load)
6462306a36Sopenharmony_ci#else
6562306a36Sopenharmony_ciSYM_FUNC_START(perf_regs_load)
6662306a36Sopenharmony_ci	push %edi
6762306a36Sopenharmony_ci	movl 8(%esp), %edi
6862306a36Sopenharmony_ci	movl %eax, AX(%edi)
6962306a36Sopenharmony_ci	movl %ebx, BX(%edi)
7062306a36Sopenharmony_ci	movl %ecx, CX(%edi)
7162306a36Sopenharmony_ci	movl %edx, DX(%edi)
7262306a36Sopenharmony_ci	movl %esi, SI(%edi)
7362306a36Sopenharmony_ci	pop %eax
7462306a36Sopenharmony_ci	movl %eax, DI(%edi)
7562306a36Sopenharmony_ci	movl %ebp, BP(%edi)
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	leal 4(%esp), %eax /* exclude this call.  */
7862306a36Sopenharmony_ci	movl %eax, SP(%edi)
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	movl 0(%esp), %eax
8162306a36Sopenharmony_ci	movl %eax, IP(%edi)
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	movl $0, FLAGS(%edi)
8462306a36Sopenharmony_ci	movl $0, CS(%edi)
8562306a36Sopenharmony_ci	movl $0, SS(%edi)
8662306a36Sopenharmony_ci	movl $0, DS(%edi)
8762306a36Sopenharmony_ci	movl $0, ES(%edi)
8862306a36Sopenharmony_ci	movl $0, FS(%edi)
8962306a36Sopenharmony_ci	movl $0, GS(%edi)
9062306a36Sopenharmony_ci	ret
9162306a36Sopenharmony_ciSYM_FUNC_END(perf_regs_load)
9262306a36Sopenharmony_ci#endif
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/*
9562306a36Sopenharmony_ci * We need to provide note.GNU-stack section, saying that we want
9662306a36Sopenharmony_ci * NOT executable stack. Otherwise the final linking will assume that
9762306a36Sopenharmony_ci * the ELF stack should not be restricted at all and set it RWX.
9862306a36Sopenharmony_ci */
9962306a36Sopenharmony_ci.section .note.GNU-stack,"",@progbits
100