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