Path: blob/master/tools/perf/arch/powerpc/util/unwind-libdw.c
29274 views
// SPDX-License-Identifier: GPL-2.01#include <elfutils/libdwfl.h>2#include <linux/kernel.h>3#include "perf_regs.h"4#include "../../../util/unwind-libdw.h"5#include "../../../util/perf_regs.h"6#include "../../../util/sample.h"78/* See backends/ppc_initreg.c and backends/ppc_regs.c in elfutils. */9static const int special_regs[3][2] = {10{ 65, PERF_REG_POWERPC_LINK },11{ 101, PERF_REG_POWERPC_XER },12{ 109, PERF_REG_POWERPC_CTR },13};1415bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)16{17struct unwind_info *ui = arg;18struct regs_dump *user_regs = perf_sample__user_regs(ui->sample);19Dwarf_Word dwarf_regs[32], dwarf_nip;20size_t i;2122#define REG(r) ({ \23Dwarf_Word val = 0; \24perf_reg_value(&val, user_regs, PERF_REG_POWERPC_##r); \25val; \26})2728dwarf_regs[0] = REG(R0);29dwarf_regs[1] = REG(R1);30dwarf_regs[2] = REG(R2);31dwarf_regs[3] = REG(R3);32dwarf_regs[4] = REG(R4);33dwarf_regs[5] = REG(R5);34dwarf_regs[6] = REG(R6);35dwarf_regs[7] = REG(R7);36dwarf_regs[8] = REG(R8);37dwarf_regs[9] = REG(R9);38dwarf_regs[10] = REG(R10);39dwarf_regs[11] = REG(R11);40dwarf_regs[12] = REG(R12);41dwarf_regs[13] = REG(R13);42dwarf_regs[14] = REG(R14);43dwarf_regs[15] = REG(R15);44dwarf_regs[16] = REG(R16);45dwarf_regs[17] = REG(R17);46dwarf_regs[18] = REG(R18);47dwarf_regs[19] = REG(R19);48dwarf_regs[20] = REG(R20);49dwarf_regs[21] = REG(R21);50dwarf_regs[22] = REG(R22);51dwarf_regs[23] = REG(R23);52dwarf_regs[24] = REG(R24);53dwarf_regs[25] = REG(R25);54dwarf_regs[26] = REG(R26);55dwarf_regs[27] = REG(R27);56dwarf_regs[28] = REG(R28);57dwarf_regs[29] = REG(R29);58dwarf_regs[30] = REG(R30);59dwarf_regs[31] = REG(R31);60if (!dwfl_thread_state_registers(thread, 0, 32, dwarf_regs))61return false;6263dwarf_nip = REG(NIP);64dwfl_thread_state_register_pc(thread, dwarf_nip);65for (i = 0; i < ARRAY_SIZE(special_regs); i++) {66Dwarf_Word val = 0;67perf_reg_value(&val, user_regs, special_regs[i][1]);68if (!dwfl_thread_state_registers(thread,69special_regs[i][0], 1,70&val))71return false;72}7374return true;75}767778