unwind.c 1.8 KB

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