1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun // Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #include <elfutils/libdwfl.h> 5*4882a593Smuzhiyun #include "../../util/unwind-libdw.h" 6*4882a593Smuzhiyun #include "../../util/perf_regs.h" 7*4882a593Smuzhiyun #include "../../util/event.h" 8*4882a593Smuzhiyun libdw__arch_set_initial_registers(Dwfl_Thread * thread,void * arg)9*4882a593Smuzhiyunbool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) 10*4882a593Smuzhiyun { 11*4882a593Smuzhiyun struct unwind_info *ui = arg; 12*4882a593Smuzhiyun struct regs_dump *user_regs = &ui->sample->user_regs; 13*4882a593Smuzhiyun Dwarf_Word dwarf_regs[PERF_REG_CSKY_MAX]; 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define REG(r) ({ \ 16*4882a593Smuzhiyun Dwarf_Word val = 0; \ 17*4882a593Smuzhiyun perf_reg_value(&val, user_regs, PERF_REG_CSKY_##r); \ 18*4882a593Smuzhiyun val; \ 19*4882a593Smuzhiyun }) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #if defined(__CSKYABIV2__) 22*4882a593Smuzhiyun dwarf_regs[0] = REG(A0); 23*4882a593Smuzhiyun dwarf_regs[1] = REG(A1); 24*4882a593Smuzhiyun dwarf_regs[2] = REG(A2); 25*4882a593Smuzhiyun dwarf_regs[3] = REG(A3); 26*4882a593Smuzhiyun dwarf_regs[4] = REG(REGS0); 27*4882a593Smuzhiyun dwarf_regs[5] = REG(REGS1); 28*4882a593Smuzhiyun dwarf_regs[6] = REG(REGS2); 29*4882a593Smuzhiyun dwarf_regs[7] = REG(REGS3); 30*4882a593Smuzhiyun dwarf_regs[8] = REG(REGS4); 31*4882a593Smuzhiyun dwarf_regs[9] = REG(REGS5); 32*4882a593Smuzhiyun dwarf_regs[10] = REG(REGS6); 33*4882a593Smuzhiyun dwarf_regs[11] = REG(REGS7); 34*4882a593Smuzhiyun dwarf_regs[12] = REG(REGS8); 35*4882a593Smuzhiyun dwarf_regs[13] = REG(REGS9); 36*4882a593Smuzhiyun dwarf_regs[14] = REG(SP); 37*4882a593Smuzhiyun dwarf_regs[15] = REG(LR); 38*4882a593Smuzhiyun dwarf_regs[16] = REG(EXREGS0); 39*4882a593Smuzhiyun dwarf_regs[17] = REG(EXREGS1); 40*4882a593Smuzhiyun dwarf_regs[18] = REG(EXREGS2); 41*4882a593Smuzhiyun dwarf_regs[19] = REG(EXREGS3); 42*4882a593Smuzhiyun dwarf_regs[20] = REG(EXREGS4); 43*4882a593Smuzhiyun dwarf_regs[21] = REG(EXREGS5); 44*4882a593Smuzhiyun dwarf_regs[22] = REG(EXREGS6); 45*4882a593Smuzhiyun dwarf_regs[23] = REG(EXREGS7); 46*4882a593Smuzhiyun dwarf_regs[24] = REG(EXREGS8); 47*4882a593Smuzhiyun dwarf_regs[25] = REG(EXREGS9); 48*4882a593Smuzhiyun dwarf_regs[26] = REG(EXREGS10); 49*4882a593Smuzhiyun dwarf_regs[27] = REG(EXREGS11); 50*4882a593Smuzhiyun dwarf_regs[28] = REG(EXREGS12); 51*4882a593Smuzhiyun dwarf_regs[29] = REG(EXREGS13); 52*4882a593Smuzhiyun dwarf_regs[30] = REG(EXREGS14); 53*4882a593Smuzhiyun dwarf_regs[31] = REG(TLS); 54*4882a593Smuzhiyun dwarf_regs[32] = REG(PC); 55*4882a593Smuzhiyun #else 56*4882a593Smuzhiyun dwarf_regs[0] = REG(SP); 57*4882a593Smuzhiyun dwarf_regs[1] = REG(REGS9); 58*4882a593Smuzhiyun dwarf_regs[2] = REG(A0); 59*4882a593Smuzhiyun dwarf_regs[3] = REG(A1); 60*4882a593Smuzhiyun dwarf_regs[4] = REG(A2); 61*4882a593Smuzhiyun dwarf_regs[5] = REG(A3); 62*4882a593Smuzhiyun dwarf_regs[6] = REG(REGS0); 63*4882a593Smuzhiyun dwarf_regs[7] = REG(REGS1); 64*4882a593Smuzhiyun dwarf_regs[8] = REG(REGS2); 65*4882a593Smuzhiyun dwarf_regs[9] = REG(REGS3); 66*4882a593Smuzhiyun dwarf_regs[10] = REG(REGS4); 67*4882a593Smuzhiyun dwarf_regs[11] = REG(REGS5); 68*4882a593Smuzhiyun dwarf_regs[12] = REG(REGS6); 69*4882a593Smuzhiyun dwarf_regs[13] = REG(REGS7); 70*4882a593Smuzhiyun dwarf_regs[14] = REG(REGS8); 71*4882a593Smuzhiyun dwarf_regs[15] = REG(LR); 72*4882a593Smuzhiyun #endif 73*4882a593Smuzhiyun dwfl_thread_state_register_pc(thread, REG(PC)); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun return dwfl_thread_state_registers(thread, 0, PERF_REG_CSKY_MAX, 76*4882a593Smuzhiyun dwarf_regs); 77*4882a593Smuzhiyun } 78