unwind-libunwind.c 1.9 KB

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