// SPDX-License-Identifier: GPL-2.0 | |
#include <errno.h> | |
#ifndef REMOTE_UNWIND_LIBUNWIND | |
#include <libunwind.h> | |
#include "perf_regs.h" | |
#include "../../util/unwind.h" | |
#include "../../util/debug.h" | |
#endif | |
#ifdef HAVE_ARCH_X86_64_SUPPORT | |
int LIBUNWIND__ARCH_REG_ID(int regnum) | |
{ | |
int id; | |
switch (regnum) { | |
case UNW_X86_64_RAX: | |
id = PERF_REG_X86_AX; | |
break; | |
case UNW_X86_64_RDX: | |
id = PERF_REG_X86_DX; | |
break; | |
case UNW_X86_64_RCX: | |
id = PERF_REG_X86_CX; | |
break; | |
case UNW_X86_64_RBX: | |
id = PERF_REG_X86_BX; | |
break; | |
case UNW_X86_64_RSI: | |
id = PERF_REG_X86_SI; | |
break; | |
case UNW_X86_64_RDI: | |
id = PERF_REG_X86_DI; | |
break; | |
case UNW_X86_64_RBP: | |
id = PERF_REG_X86_BP; | |
break; | |
case UNW_X86_64_RSP: | |
id = PERF_REG_X86_SP; | |
break; | |
case UNW_X86_64_R8: | |
id = PERF_REG_X86_R8; | |
break; | |
case UNW_X86_64_R9: | |
id = PERF_REG_X86_R9; | |
break; | |
case UNW_X86_64_R10: | |
id = PERF_REG_X86_R10; | |
break; | |
case UNW_X86_64_R11: | |
id = PERF_REG_X86_R11; | |
break; | |
case UNW_X86_64_R12: | |
id = PERF_REG_X86_R12; | |
break; | |
case UNW_X86_64_R13: | |
id = PERF_REG_X86_R13; | |
break; | |
case UNW_X86_64_R14: | |
id = PERF_REG_X86_R14; | |
break; | |
case UNW_X86_64_R15: | |
id = PERF_REG_X86_R15; | |
break; | |
case UNW_X86_64_RIP: | |
id = PERF_REG_X86_IP; | |
break; | |
default: | |
pr_err("unwind: invalid reg id %d\n", regnum); | |
return -EINVAL; | |
} | |
return id; | |
} | |
#else | |
int LIBUNWIND__ARCH_REG_ID(int regnum) | |
{ | |
int id; | |
switch (regnum) { | |
case UNW_X86_EAX: | |
id = PERF_REG_X86_AX; | |
break; | |
case UNW_X86_EDX: | |
id = PERF_REG_X86_DX; | |
break; | |
case UNW_X86_ECX: | |
id = PERF_REG_X86_CX; | |
break; | |
case UNW_X86_EBX: | |
id = PERF_REG_X86_BX; | |
break; | |
case UNW_X86_ESI: | |
id = PERF_REG_X86_SI; | |
break; | |
case UNW_X86_EDI: | |
id = PERF_REG_X86_DI; | |
break; | |
case UNW_X86_EBP: | |
id = PERF_REG_X86_BP; | |
break; | |
case UNW_X86_ESP: | |
id = PERF_REG_X86_SP; | |
break; | |
case UNW_X86_EIP: | |
id = PERF_REG_X86_IP; | |
break; | |
default: | |
pr_err("unwind: invalid reg id %d\n", regnum); | |
return -EINVAL; | |
} | |
return id; | |
} | |
#endif /* HAVE_ARCH_X86_64_SUPPORT */ |