A dynamic tracer for Linux

arch-x86_64.c 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <assert.h>
  2. #include <linux/ptrace.h>
  3. #include "type.h"
  4. #define arch_typedef(_a, _t) { \
  5. .ttype = T_TYPEDEF, \
  6. .t = { .tdef = { .name = #_a, .type = _t } }, \
  7. }
  8. #define arch_pointer(_t) { \
  9. .ttype = T_POINTER, \
  10. .t = { .pointer = { .type = _t } }, \
  11. }
  12. type_t t_s8 = arch_typedef(s8, &t_c);
  13. type_t t_s8p = arch_pointer(&t_s8);
  14. type_t t_u8 = arch_typedef(u8, &t_uc);
  15. type_t t_u8p = arch_pointer(&t_u8);
  16. type_t t_s16 = arch_typedef(s16, &t_s);
  17. type_t t_s16p = arch_pointer(&t_s16);
  18. type_t t_u16 = arch_typedef(u16, &t_us);
  19. type_t t_u16p = arch_pointer(&t_u16);
  20. type_t t_s32 = arch_typedef(s32, &t_i);
  21. type_t t_s32p = arch_pointer(&t_s32);
  22. type_t t_u32 = arch_typedef(u32, &t_ui);
  23. type_t t_u32p = arch_pointer(&t_u32);
  24. type_t t_s64 = arch_typedef(s64, &t_l);
  25. type_t t_s64p = arch_pointer(&t_s64);
  26. type_t t_u64 = arch_typedef(u64, &t_ul);
  27. type_t t_u64p = arch_pointer(&t_u64);
  28. field_t f_pt_regs_fields[] = {
  29. { .name = "r15", .type = &t_ul },
  30. { .name = "r14", .type = &t_ul },
  31. { .name = "r13", .type = &t_ul },
  32. { .name = "r12", .type = &t_ul },
  33. { .name = "rbp", .type = &t_ul },
  34. { .name = "rbx", .type = &t_ul },
  35. { .name = "r11", .type = &t_ul },
  36. { .name = "r10", .type = &t_ul },
  37. { .name = "r9", .type = &t_ul },
  38. { .name = "r8", .type = &t_ul },
  39. { .name = "rax", .type = &t_ul },
  40. { .name = "rcx", .type = &t_ul },
  41. { .name = "rdx", .type = &t_ul },
  42. { .name = "rsi", .type = &t_ul },
  43. { .name = "rdi", .type = &t_ul },
  44. { .name = "orig_rax", .type = &t_ul },
  45. { .name = "rip", .type = &t_ul },
  46. { .name = "cs", .type = &t_ul },
  47. { .name = "eflags", .type = &t_ul },
  48. { .name = "rsp", .type = &t_ul },
  49. { .name = "ss", .type = &t_ul },
  50. { .type = NULL }
  51. };
  52. type_t t_pt_regs = {
  53. .ttype = T_STRUCT,
  54. .t.sou = {
  55. .name = "pt_regs",
  56. .fields = f_pt_regs_fields,
  57. },
  58. };
  59. type_t *arch_types[] = {
  60. &t_s8, &t_s8p, &t_u8, &t_u8p,
  61. &t_s16, &t_s16p, &t_u16, &t_u16p,
  62. &t_s32, &t_s32p, &t_u32, &t_u32p,
  63. &t_s64, &t_s64p, &t_u64, &t_u64p,
  64. &t_pt_regs,
  65. NULL
  66. };
  67. __attribute__((constructor))
  68. static void arch_init(void)
  69. {
  70. type_add_list(arch_types);
  71. assert(t_pt_regs.size == sizeof(struct pt_regs));
  72. }