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