unwind-libunwind.c (2016B)
1// SPDX-License-Identifier: GPL-2.0 2 3#include <errno.h> 4#include "../../util/debug.h" 5#ifndef REMOTE_UNWIND_LIBUNWIND 6#include <libunwind.h> 7#include "perf_regs.h" 8#include "../../util/unwind.h" 9#endif 10 11#ifdef HAVE_ARCH_X86_64_SUPPORT 12int LIBUNWIND__ARCH_REG_ID(int regnum) 13{ 14 int id; 15 16 switch (regnum) { 17 case UNW_X86_64_RAX: 18 id = PERF_REG_X86_AX; 19 break; 20 case UNW_X86_64_RDX: 21 id = PERF_REG_X86_DX; 22 break; 23 case UNW_X86_64_RCX: 24 id = PERF_REG_X86_CX; 25 break; 26 case UNW_X86_64_RBX: 27 id = PERF_REG_X86_BX; 28 break; 29 case UNW_X86_64_RSI: 30 id = PERF_REG_X86_SI; 31 break; 32 case UNW_X86_64_RDI: 33 id = PERF_REG_X86_DI; 34 break; 35 case UNW_X86_64_RBP: 36 id = PERF_REG_X86_BP; 37 break; 38 case UNW_X86_64_RSP: 39 id = PERF_REG_X86_SP; 40 break; 41 case UNW_X86_64_R8: 42 id = PERF_REG_X86_R8; 43 break; 44 case UNW_X86_64_R9: 45 id = PERF_REG_X86_R9; 46 break; 47 case UNW_X86_64_R10: 48 id = PERF_REG_X86_R10; 49 break; 50 case UNW_X86_64_R11: 51 id = PERF_REG_X86_R11; 52 break; 53 case UNW_X86_64_R12: 54 id = PERF_REG_X86_R12; 55 break; 56 case UNW_X86_64_R13: 57 id = PERF_REG_X86_R13; 58 break; 59 case UNW_X86_64_R14: 60 id = PERF_REG_X86_R14; 61 break; 62 case UNW_X86_64_R15: 63 id = PERF_REG_X86_R15; 64 break; 65 case UNW_X86_64_RIP: 66 id = PERF_REG_X86_IP; 67 break; 68 default: 69 pr_err("unwind: invalid reg id %d\n", regnum); 70 return -EINVAL; 71 } 72 73 return id; 74} 75#else 76int LIBUNWIND__ARCH_REG_ID(int regnum) 77{ 78 int id; 79 80 switch (regnum) { 81 case UNW_X86_EAX: 82 id = PERF_REG_X86_AX; 83 break; 84 case UNW_X86_EDX: 85 id = PERF_REG_X86_DX; 86 break; 87 case UNW_X86_ECX: 88 id = PERF_REG_X86_CX; 89 break; 90 case UNW_X86_EBX: 91 id = PERF_REG_X86_BX; 92 break; 93 case UNW_X86_ESI: 94 id = PERF_REG_X86_SI; 95 break; 96 case UNW_X86_EDI: 97 id = PERF_REG_X86_DI; 98 break; 99 case UNW_X86_EBP: 100 id = PERF_REG_X86_BP; 101 break; 102 case UNW_X86_ESP: 103 id = PERF_REG_X86_SP; 104 break; 105 case UNW_X86_EIP: 106 id = PERF_REG_X86_IP; 107 break; 108 default: 109 pr_err("unwind: invalid reg id %d\n", regnum); 110 return -EINVAL; 111 } 112 113 return id; 114} 115#endif /* HAVE_ARCH_X86_64_SUPPORT */