2 * Debugger CPU backend definitions
4 * Copyright 2004 Eric Pouech
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.
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.
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
21 enum be_cpu_addr {be_cpu_addr_pc, be_cpu_addr_stack, be_cpu_addr_frame};
22 enum be_xpoint_type {be_xpoint_break, be_xpoint_watch_exec, be_xpoint_watch_read,
23 be_xpoint_watch_write};
26 /* ------------------------------------------------------------------------------
27 * address manipulation
28 * ------------------------------------------------------------------------------ */
29 /* Linearizes an address. Only CPUs with segmented address model need this.
30 * Otherwise, implementation is straigthforward (be_cpu_linearize will do)
32 void* (*linearize)(HANDLE hThread, const ADDRESS64*);
33 /* Fills in an ADDRESS64 structure from a segment & an offset. CPUs without
34 * segment address model should use 0 as seg. Required method to fill
35 * in an ADDRESS64 (except an linear one).
36 * Non segmented CPU shall use be_cpu_build_addr
38 unsigned (*build_addr)(HANDLE hThread, const CONTEXT* ctx,
39 ADDRESS64* addr, unsigned seg,
40 unsigned long offset);
41 /* Retrieves in addr an address related to the context (program counter, stack
42 * pointer, frame pointer)
44 unsigned (*get_addr)(HANDLE hThread, const CONTEXT* ctx,
45 enum be_cpu_addr, ADDRESS64* addr);
46 /* -------------------------------------------------------------------------------
47 * context manipulation
48 * ------------------------------------------------------------------------------- */
49 /* Enables/disables CPU single step mode (depending on enable) */
50 void (*single_step)(CONTEXT* ctx, unsigned enable);
51 /* Dumps out the content of the context */
52 void (*print_context)(HANDLE hThread, const CONTEXT* ctx, int all_regs);
53 /* Prints information about segments. Non segmented CPU should leave this
56 void (*print_segment_info)(HANDLE hThread, const CONTEXT* ctx);
57 /* Do the initialization so that the debugger has internal variables linked
58 * to the context's registers
60 const struct dbg_internal_var*
61 (*init_registers)(CONTEXT* ctx);
62 /* -------------------------------------------------------------------------------
64 * -------------------------------------------------------------------------------*/
65 /* Check whether the instruction at addr is an insn to step over
66 * (like function call, interruption...)
68 unsigned (*is_step_over_insn)(const void* addr);
69 /* Check whether instruction at 'addr' is the return from a function call */
70 unsigned (*is_function_return)(const void* addr);
71 /* Check whether instruction at 'addr' is the CPU break instruction. On i386,
74 unsigned (*is_break_insn)(const void*);
75 /* Check whether instruciton at 'addr' is a function call */
76 unsigned (*is_function_call)(const void* insn, ADDRESS64* callee);
77 /* Ask for dissasembling one instruction. If display is true, assembly code
78 * will be printed. In all cases, 'addr' is advanced at next instruction
80 void (*disasm_one_insn)(ADDRESS64* addr, int display);
81 /* -------------------------------------------------------------------------------
82 * break points / watchpoints handling
83 * -------------------------------------------------------------------------------*/
84 /* Inserts an Xpoint in the CPU context and/or debuggee address space */
85 unsigned (*insert_Xpoint)(HANDLE hProcess, const struct be_process_io* pio,
86 CONTEXT* ctx, enum be_xpoint_type type,
87 void* addr, unsigned long* val, unsigned size);
88 /* Removes an Xpoint in the CPU context and/or debuggee address space */
89 unsigned (*remove_Xpoint)(HANDLE hProcess, const struct be_process_io* pio,
90 CONTEXT* ctx, enum be_xpoint_type type,
91 void* addr, unsigned long val, unsigned size);
92 /* Checks whether a given watchpoint has been triggered */
93 unsigned (*is_watchpoint_set)(const CONTEXT* ctx, unsigned idx);
94 /* Clears the watchpoint indicator */
95 void (*clear_watchpoint)(CONTEXT* ctx, unsigned idx);
96 /* After a break instruction is executed, in the corresponding exception handler,
97 * some CPUs report the address of the insn after the break insn, some others
98 * report the address of the break insn itself.
99 * This function lets adjust the context PC to reflect this behavior.
101 int (*adjust_pc_for_break)(CONTEXT* ctx, BOOL way);
102 /* -------------------------------------------------------------------------------
103 * basic type read/write
104 * -------------------------------------------------------------------------------*/
105 /* Reads an integer from memory and stores it inside a long long int */
106 int (*fetch_integer)(const struct dbg_lvalue* lvalue, unsigned size, unsigned is_signed, LONGLONG*);
107 /* Reads a real from memory and stores it inside a long double */
108 int (*fetch_float)(const struct dbg_lvalue* lvalue, unsigned size, long double*);
111 extern struct backend_cpu* be_cpu;
113 /* some handy functions for non segmented CPUs */
114 void* be_cpu_linearize(HANDLE hThread, const ADDRESS64*);
115 unsigned be_cpu_build_addr(HANDLE hThread, const CONTEXT* ctx, ADDRESS64* addr,
116 unsigned seg, unsigned long offset);