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