| // 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 */ |