be_cpu.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * Debugger CPU backend definitions
  3. *
  4. * Copyright 2004 Eric Pouech
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  19. */
  20. enum be_cpu_addr {be_cpu_addr_pc, be_cpu_addr_stack, be_cpu_addr_frame};
  21. enum be_xpoint_type {be_xpoint_break, be_xpoint_watch_exec, be_xpoint_watch_read,
  22. be_xpoint_watch_write, be_xpoint_free=-1};
  23. struct gdb_register
  24. {
  25. const char *feature;
  26. const char *name;
  27. const char *type;
  28. size_t offset;
  29. size_t length;
  30. };
  31. struct backend_cpu
  32. {
  33. const DWORD machine;
  34. const DWORD pointer_size;
  35. /* ------------------------------------------------------------------------------
  36. * address manipulation
  37. * ------------------------------------------------------------------------------ */
  38. /* Linearizes an address. Only CPUs with segmented address model need this.
  39. * Otherwise, implementation is straightforward (be_cpu_linearize will do)
  40. */
  41. void* (*linearize)(HANDLE hThread, const ADDRESS64*);
  42. /* Fills in an ADDRESS64 structure from a segment & an offset. CPUs without
  43. * segment address model should use 0 as seg. Required method to fill
  44. * in an ADDRESS64 (except an linear one).
  45. * Non segmented CPU shall use be_cpu_build_addr
  46. */
  47. BOOL (*build_addr)(HANDLE hThread, const dbg_ctx_t *ctx,
  48. ADDRESS64* addr, unsigned seg,
  49. DWORD64 offset);
  50. /* Retrieves in addr an address related to the context (program counter, stack
  51. * pointer, frame pointer)
  52. */
  53. BOOL (*get_addr)(HANDLE hThread, const dbg_ctx_t *ctx,
  54. enum be_cpu_addr, ADDRESS64* addr);
  55. /* returns which kind of information a given register number refers to */
  56. BOOL (*get_register_info)(int regno, enum be_cpu_addr* kind);
  57. /* -------------------------------------------------------------------------------
  58. * context manipulation
  59. * ------------------------------------------------------------------------------- */
  60. /* Enables/disables CPU single step mode (depending on enable) */
  61. void (*single_step)(dbg_ctx_t *ctx, BOOL enable);
  62. /* Dumps out the content of the context */
  63. void (*print_context)(HANDLE hThread, const dbg_ctx_t *ctx, int all_regs);
  64. /* Prints information about segments. Non segmented CPU should leave this
  65. * function empty
  66. */
  67. void (*print_segment_info)(HANDLE hThread, const dbg_ctx_t *ctx);
  68. /* all the CONTEXT's relative variables, bound to this CPU */
  69. const struct dbg_internal_var* context_vars;
  70. /* -------------------------------------------------------------------------------
  71. * code inspection
  72. * -------------------------------------------------------------------------------*/
  73. /* Check whether the instruction at addr is an insn to step over
  74. * (like function call, interruption...)
  75. */
  76. BOOL (*is_step_over_insn)(const void* addr);
  77. /* Check whether instruction at 'addr' is the return from a function call */
  78. BOOL (*is_function_return)(const void* addr);
  79. /* Check whether instruction at 'addr' is the CPU break instruction. On i386,
  80. * it's INT3 (0xCC)
  81. */
  82. BOOL (*is_break_insn)(const void*);
  83. /* Check whether instruction at 'addr' is a function call */
  84. BOOL (*is_function_call)(const void* insn, ADDRESS64* callee);
  85. /* Check whether instruction at 'addr' is a jump */
  86. BOOL (*is_jump)(const void* insn, ADDRESS64* jumpee);
  87. /* Ask for disassembling one instruction. If display is true, assembly code
  88. * will be printed. In all cases, 'addr' is advanced at next instruction
  89. */
  90. void (*disasm_one_insn)(ADDRESS64* addr, int display);
  91. /* -------------------------------------------------------------------------------
  92. * break points / watchpoints handling
  93. * -------------------------------------------------------------------------------*/
  94. /* Inserts an Xpoint in the CPU context and/or debuggee address space */
  95. BOOL (*insert_Xpoint)(HANDLE hProcess, const struct be_process_io* pio,
  96. dbg_ctx_t *ctx, enum be_xpoint_type type,
  97. void* addr, unsigned *val, unsigned size);
  98. /* Removes an Xpoint in the CPU context and/or debuggee address space */
  99. BOOL (*remove_Xpoint)(HANDLE hProcess, const struct be_process_io* pio,
  100. dbg_ctx_t *ctx, enum be_xpoint_type type,
  101. void* addr, unsigned val, unsigned size);
  102. /* Checks whether a given watchpoint has been triggered */
  103. BOOL (*is_watchpoint_set)(const dbg_ctx_t *ctx, unsigned idx);
  104. /* Clears the watchpoint indicator */
  105. void (*clear_watchpoint)(dbg_ctx_t *ctx, unsigned idx);
  106. /* After a break instruction is executed, in the corresponding exception handler,
  107. * some CPUs report the address of the insn after the break insn, some others
  108. * report the address of the break insn itself.
  109. * This function lets adjust the context PC to reflect this behavior.
  110. */
  111. int (*adjust_pc_for_break)(dbg_ctx_t *ctx, BOOL way);
  112. /* -------------------------------------------------------------------------------
  113. * basic type read/write
  114. * -------------------------------------------------------------------------------*/
  115. BOOL (*get_context)(HANDLE thread, dbg_ctx_t *ctx);
  116. BOOL (*set_context)(HANDLE thread, const dbg_ctx_t *ctx);
  117. const struct gdb_register *gdb_register_map;
  118. const size_t gdb_num_regs;
  119. };
  120. /* some handy functions for non segmented CPUs */
  121. void* be_cpu_linearize(HANDLE hThread, const ADDRESS64*);
  122. BOOL be_cpu_build_addr(HANDLE hThread, const dbg_ctx_t *ctx, ADDRESS64* addr,
  123. unsigned seg, DWORD64 offset);