162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#include <errno.h> 462306a36Sopenharmony_ci#include "../../util/debug.h" 562306a36Sopenharmony_ci#ifndef REMOTE_UNWIND_LIBUNWIND 662306a36Sopenharmony_ci#include <libunwind.h> 762306a36Sopenharmony_ci#include "perf_regs.h" 862306a36Sopenharmony_ci#include "../../util/unwind.h" 962306a36Sopenharmony_ci#endif 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifdef HAVE_ARCH_X86_64_SUPPORT 1262306a36Sopenharmony_ciint LIBUNWIND__ARCH_REG_ID(int regnum) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci int id; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci switch (regnum) { 1762306a36Sopenharmony_ci case UNW_X86_64_RAX: 1862306a36Sopenharmony_ci id = PERF_REG_X86_AX; 1962306a36Sopenharmony_ci break; 2062306a36Sopenharmony_ci case UNW_X86_64_RDX: 2162306a36Sopenharmony_ci id = PERF_REG_X86_DX; 2262306a36Sopenharmony_ci break; 2362306a36Sopenharmony_ci case UNW_X86_64_RCX: 2462306a36Sopenharmony_ci id = PERF_REG_X86_CX; 2562306a36Sopenharmony_ci break; 2662306a36Sopenharmony_ci case UNW_X86_64_RBX: 2762306a36Sopenharmony_ci id = PERF_REG_X86_BX; 2862306a36Sopenharmony_ci break; 2962306a36Sopenharmony_ci case UNW_X86_64_RSI: 3062306a36Sopenharmony_ci id = PERF_REG_X86_SI; 3162306a36Sopenharmony_ci break; 3262306a36Sopenharmony_ci case UNW_X86_64_RDI: 3362306a36Sopenharmony_ci id = PERF_REG_X86_DI; 3462306a36Sopenharmony_ci break; 3562306a36Sopenharmony_ci case UNW_X86_64_RBP: 3662306a36Sopenharmony_ci id = PERF_REG_X86_BP; 3762306a36Sopenharmony_ci break; 3862306a36Sopenharmony_ci case UNW_X86_64_RSP: 3962306a36Sopenharmony_ci id = PERF_REG_X86_SP; 4062306a36Sopenharmony_ci break; 4162306a36Sopenharmony_ci case UNW_X86_64_R8: 4262306a36Sopenharmony_ci id = PERF_REG_X86_R8; 4362306a36Sopenharmony_ci break; 4462306a36Sopenharmony_ci case UNW_X86_64_R9: 4562306a36Sopenharmony_ci id = PERF_REG_X86_R9; 4662306a36Sopenharmony_ci break; 4762306a36Sopenharmony_ci case UNW_X86_64_R10: 4862306a36Sopenharmony_ci id = PERF_REG_X86_R10; 4962306a36Sopenharmony_ci break; 5062306a36Sopenharmony_ci case UNW_X86_64_R11: 5162306a36Sopenharmony_ci id = PERF_REG_X86_R11; 5262306a36Sopenharmony_ci break; 5362306a36Sopenharmony_ci case UNW_X86_64_R12: 5462306a36Sopenharmony_ci id = PERF_REG_X86_R12; 5562306a36Sopenharmony_ci break; 5662306a36Sopenharmony_ci case UNW_X86_64_R13: 5762306a36Sopenharmony_ci id = PERF_REG_X86_R13; 5862306a36Sopenharmony_ci break; 5962306a36Sopenharmony_ci case UNW_X86_64_R14: 6062306a36Sopenharmony_ci id = PERF_REG_X86_R14; 6162306a36Sopenharmony_ci break; 6262306a36Sopenharmony_ci case UNW_X86_64_R15: 6362306a36Sopenharmony_ci id = PERF_REG_X86_R15; 6462306a36Sopenharmony_ci break; 6562306a36Sopenharmony_ci case UNW_X86_64_RIP: 6662306a36Sopenharmony_ci id = PERF_REG_X86_IP; 6762306a36Sopenharmony_ci break; 6862306a36Sopenharmony_ci default: 6962306a36Sopenharmony_ci pr_err("unwind: invalid reg id %d\n", regnum); 7062306a36Sopenharmony_ci return -EINVAL; 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci return id; 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci#else 7662306a36Sopenharmony_ciint LIBUNWIND__ARCH_REG_ID(int regnum) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci int id; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci switch (regnum) { 8162306a36Sopenharmony_ci case UNW_X86_EAX: 8262306a36Sopenharmony_ci id = PERF_REG_X86_AX; 8362306a36Sopenharmony_ci break; 8462306a36Sopenharmony_ci case UNW_X86_EDX: 8562306a36Sopenharmony_ci id = PERF_REG_X86_DX; 8662306a36Sopenharmony_ci break; 8762306a36Sopenharmony_ci case UNW_X86_ECX: 8862306a36Sopenharmony_ci id = PERF_REG_X86_CX; 8962306a36Sopenharmony_ci break; 9062306a36Sopenharmony_ci case UNW_X86_EBX: 9162306a36Sopenharmony_ci id = PERF_REG_X86_BX; 9262306a36Sopenharmony_ci break; 9362306a36Sopenharmony_ci case UNW_X86_ESI: 9462306a36Sopenharmony_ci id = PERF_REG_X86_SI; 9562306a36Sopenharmony_ci break; 9662306a36Sopenharmony_ci case UNW_X86_EDI: 9762306a36Sopenharmony_ci id = PERF_REG_X86_DI; 9862306a36Sopenharmony_ci break; 9962306a36Sopenharmony_ci case UNW_X86_EBP: 10062306a36Sopenharmony_ci id = PERF_REG_X86_BP; 10162306a36Sopenharmony_ci break; 10262306a36Sopenharmony_ci case UNW_X86_ESP: 10362306a36Sopenharmony_ci id = PERF_REG_X86_SP; 10462306a36Sopenharmony_ci break; 10562306a36Sopenharmony_ci case UNW_X86_EIP: 10662306a36Sopenharmony_ci id = PERF_REG_X86_IP; 10762306a36Sopenharmony_ci break; 10862306a36Sopenharmony_ci default: 10962306a36Sopenharmony_ci pr_err("unwind: invalid reg id %d\n", regnum); 11062306a36Sopenharmony_ci return -EINVAL; 11162306a36Sopenharmony_ci } 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci return id; 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci#endif /* HAVE_ARCH_X86_64_SUPPORT */ 116