| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 1 | /* |
| 2 | * This file is part of ltrace. |
| Petr Machata | 693dfad | 2013-01-14 22:10:51 +0100 | [diff] [blame] | 3 | * Copyright (C) 2012,2013 Petr Machata, Red Hat Inc. |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or |
| 6 | * modify it under the terms of the GNU General Public License as |
| 7 | * published by the Free Software Foundation; either version 2 of the |
| 8 | * License, or (at your option) any later version. |
| 9 | * |
| 10 | * This program is distributed in the hope that it will be useful, but |
| 11 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 | * General Public License for more details. |
| 14 | * |
| 15 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software |
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA |
| 18 | * 02110-1301 USA |
| 19 | */ |
| 20 | |
| 21 | #ifndef BACKEND_H |
| 22 | #define BACKEND_H |
| 23 | |
| 24 | #include "forward.h" |
| Petr Machata | bac2da5 | 2012-05-29 00:42:59 +0200 | [diff] [blame] | 25 | #include "sysdep.h" |
| 26 | |
| Petr Machata | ba1664b | 2012-04-28 14:59:05 +0200 | [diff] [blame] | 27 | #include <gelf.h> |
| 28 | |
| 29 | enum process_status { |
| Petr Machata | 6dfc544 | 2012-12-17 03:38:36 +0100 | [diff] [blame] | 30 | PS_INVALID, /* Failure. */ |
| 31 | PS_STOP, /* Job-control stop. */ |
| 32 | PS_TRACING_STOP, |
| 33 | PS_SLEEPING, |
| 34 | PS_ZOMBIE, |
| 35 | PS_OTHER, /* Necessary other states can be added as needed. */ |
| Petr Machata | ba1664b | 2012-04-28 14:59:05 +0200 | [diff] [blame] | 36 | }; |
| 37 | |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 38 | /* |
| 39 | * This file contains documentation of back end interface. Some of |
| 40 | * these may be implemented on an OS level (i.e. they are the same |
| 41 | * e.g. on all Linux architectures), some may differ per architecture |
| 42 | * on the same OS (e.g. a way to insert a breakpoint into the process |
| 43 | * image is a likely candidate). |
| 44 | */ |
| 45 | |
| 46 | /* Convert a PID to a path to the corresponding binary. */ |
| 47 | char *pid2name(pid_t pid); |
| 48 | |
| 49 | /* Given a PID, find a leader of thread group. */ |
| 50 | pid_t process_leader(pid_t pid); |
| 51 | |
| 52 | /* Given a PID of leader thread, fill in PIDs of all the tasks. The |
| 53 | * function will initialize the pointer *RET_TASKS to a |
| 54 | * newly-allocated array, and will store number of elements in that |
| 55 | * array to *RET_N. You have to free that buffer when you don't need |
| 56 | * it anymore. */ |
| 57 | int process_tasks(pid_t pid, pid_t **ret_tasks, size_t *ret_n); |
| 58 | |
| 59 | /* Answer whether the process PID is stopped. Returns 0 when not |
| 60 | * stopped, 1 when stopped, or -1 when there was an error. */ |
| 61 | int process_stopped(pid_t pid); |
| 62 | |
| 63 | /* Answer a status of the task PID. See enum process_status. */ |
| 64 | enum process_status process_status(pid_t pid); |
| 65 | |
| 66 | /* Wait for PID to be ready for tracing. */ |
| Petr Machata | ba1664b | 2012-04-28 14:59:05 +0200 | [diff] [blame] | 67 | int wait_for_proc(pid_t pid); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 68 | |
| 69 | /* Send a signal SIG to the task PID. */ |
| 70 | int task_kill(pid_t pid, int sig); |
| 71 | |
| 72 | /* Called after PID is attached, but before it is continued. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 73 | void trace_set_options(struct process *proc); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 74 | |
| 75 | /* Called after ltrace forks. Should attach the newly created child, |
| 76 | * in whose context this function is called. */ |
| 77 | void trace_me(void); |
| 78 | |
| 79 | /* Called when ltrace needs to attach to PID, such as when it attaches |
| 80 | * to a running process, whose PID is given on the command line. */ |
| 81 | int trace_pid(pid_t pid); |
| 82 | |
| 83 | /* Stop tracing PID. */ |
| 84 | void untrace_pid(pid_t pid); |
| 85 | |
| 86 | /* The back end may need to store arbitrary data to a process. This |
| 87 | * is a place where it can initialize PROC->arch_dep. XXX this should |
| 88 | * be dropped in favor of arhc_process_init on pmachata/libs. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 89 | void get_arch_dep(struct process *proc); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 90 | |
| 91 | /* Return current instruction pointer of PROC. |
| 92 | * |
| 93 | * XXX note that the IP must fit into an arch pointer. This prevents |
| 94 | * us to use 32-bit ltrace to trace 64-bit process, even on arches |
| Petr Machata | ba1664b | 2012-04-28 14:59:05 +0200 | [diff] [blame] | 95 | * that would otherwise support this. Above we have a definition of |
| Petr Machata | bac2da5 | 2012-05-29 00:42:59 +0200 | [diff] [blame] | 96 | * arch_addr_t. This should be converted to an integral type and |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 97 | * used for target addresses throughout. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 98 | void *get_instruction_pointer(struct process *proc); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 99 | |
| 100 | /* Set instruction pointer of PROC to ADDR. XXX see above. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 101 | void set_instruction_pointer(struct process *proc, void *addr); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 102 | |
| 103 | /* Return current stack pointer of PROC. XXX see above. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 104 | void *get_stack_pointer(struct process *proc); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 105 | |
| 106 | /* Find and return caller address, i.e. the address where the current |
| 107 | * function returns. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 108 | void *get_return_addr(struct process *proc, void *stack_pointer); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 109 | |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 110 | /* Enable breakpoint SBP in process PROC. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 111 | void enable_breakpoint(struct process *proc, struct breakpoint *sbp); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 112 | |
| 113 | /* Disable breakpoint SBP in process PROC. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 114 | void disable_breakpoint(struct process *proc, struct breakpoint *sbp); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 115 | |
| 116 | /* Determine whether the event that we have just seen (and that is |
| 117 | * recorded in STATUS) was a syscall. If it was, return 1. If it was |
| 118 | * a return from syscall, return 2. In both cases, set *SYSNUM to the |
| 119 | * number of said syscall. If it wasn't a syscall, return 0. If |
| 120 | * there was an error, return -1. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 121 | int syscall_p(struct process *proc, int status, int *sysnum); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 122 | |
| 123 | /* Continue execution of the process with given PID. */ |
| 124 | void continue_process(pid_t pid); |
| 125 | |
| 126 | /* Called after we received a signal SIGNUM. Should do whatever |
| 127 | * book-keeping is necessary and continue the process if |
| 128 | * necessary. */ |
| 129 | void continue_after_signal(pid_t pid, int signum); |
| 130 | |
| 131 | /* Called after we received a system call SYSNUM. RET_P is 0 if this |
| 132 | * is system call, otherwise it's return from a system call. The |
| 133 | * callback should do whatever book-keeping is necessary and continue |
| 134 | * the process if necessary. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 135 | void continue_after_syscall(struct process *proc, int sysnum, int ret_p); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 136 | |
| 137 | /* Called after we hit a breakpoint SBP. Should do whatever |
| 138 | * book-keeping is necessary and then continue the process. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 139 | void continue_after_breakpoint(struct process *proc, struct breakpoint *sbp); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 140 | |
| 141 | /* Called after we received a vfork. Should do whatever book-keeping |
| 142 | * is necessary and continue the process if necessary. N.B. right |
| 143 | * now, with Linux/GNU the only back end, this is not necessary. I |
| 144 | * imagine other systems may be different. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 145 | void continue_after_vfork(struct process *proc); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 146 | |
| Petr Machata | 057caa5 | 2013-01-30 23:28:47 +0100 | [diff] [blame] | 147 | /* Called after the process exec's. Should do whatever book-keeping |
| 148 | * is necessary and then continue the process. */ |
| 149 | void continue_after_exec(struct process *proc); |
| 150 | |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 151 | /* Called when trace_me or primary trace_pid fail. This may plug in |
| 152 | * any platform-specific knowledge of why it could be so. */ |
| 153 | void trace_fail_warning(pid_t pid); |
| 154 | |
| 155 | /* A pair of functions called to initiate a detachment request when |
| 156 | * ltrace is about to exit. Their job is to undo any effects that |
| 157 | * tracing had and eventually detach process, perhaps by way of |
| 158 | * installing a process handler. |
| 159 | * |
| 160 | * OS_LTRACE_EXITING_SIGHANDLER is called from a signal handler |
| 161 | * context right after the signal was captured. It returns 1 if the |
| 162 | * request was handled or 0 if it wasn't. |
| 163 | * |
| 164 | * If the call to OS_LTRACE_EXITING_SIGHANDLER didn't handle the |
| 165 | * request, OS_LTRACE_EXITING is called when the next event is |
| 166 | * generated. Therefore it's called in "safe" context, without |
| 167 | * re-entrancy concerns, but it's only called after an even is |
| 168 | * generated. */ |
| 169 | int os_ltrace_exiting_sighandler(void); |
| 170 | void os_ltrace_exiting(void); |
| 171 | |
| 172 | /* Should copy COUNT bytes from address ADDR of process PROC to local |
| 173 | * buffer BUF. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 174 | size_t umovebytes(struct process *proc, void *addr, void *buf, size_t count); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 175 | |
| 176 | /* Find out an address of symbol SYM in process PROC, and return. |
| 177 | * Returning NULL delays breakpoint insertion and enables heaps of |
| 178 | * arch-specific black magic that we should clean up some day. |
| 179 | * |
| 180 | * XXX the same points as for get_instruction_pointer apply. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 181 | void *sym2addr(struct process *proc, struct library_symbol *sym); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 182 | |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 183 | /* Obtain address of PLT entry corresponding to relocation RELA in |
| 184 | * file LTE. This is NDX-th PLT entry in the file. |
| 185 | * |
| 186 | * XXX should this return arch_addr_t? */ |
| 187 | GElf_Addr arch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela *rela); |
| 188 | |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 189 | /* Called at some point after we have attached to PROC. This callback |
| Petr Machata | ba1664b | 2012-04-28 14:59:05 +0200 | [diff] [blame] | 190 | * should insert an introspection breakpoint for handling dynamic |
| 191 | * linker library loads. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 192 | int linkmap_init(struct process *proc, arch_addr_t dyn_addr); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 193 | |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 194 | /* This should produce and return the next event of one of the traced |
| 195 | * processes. The returned pointer will not be freed by the core and |
| 196 | * should be either statically allocated, or the management should be |
| 197 | * done some other way. */ |
| 198 | struct Event *next_event(void); |
| 199 | |
| 200 | /* Called when process PROC was removed. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 201 | void process_removed(struct process *proc); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 202 | |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 203 | /* This should extract entry point address and interpreter (dynamic |
| 204 | * linker) bias if possible. Returns 0 if there were no errors, -1 |
| 205 | * otherwise. Sets *ENTRYP and *INTERP_BIASP to non-zero values if |
| Petr Machata | da69ed0 | 2012-10-18 17:27:48 +0200 | [diff] [blame] | 206 | * the corresponding value is known, or zero otherwise; this is not |
| 207 | * done for pointers that are NULL. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 208 | int process_get_entry(struct process *proc, |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 209 | arch_addr_t *entryp, |
| 210 | arch_addr_t *interp_biasp); |
| 211 | |
| 212 | |
| 213 | /* Optional callbacks |
| 214 | * |
| 215 | * Some callbacks are only available if backend (arch.h) has a certain |
| 216 | * define. If such a define is not present, default implementation |
| 217 | * (most often doing nothing at all) us used instead. This is used |
| 218 | * for gradual extensions of ltrace, so that backends that are not |
| 219 | * fully up to date, or that don't need certain functionality, keep |
| 220 | * working, while other backends take advantage of the optional |
| 221 | * features. */ |
| 222 | |
| 223 | /* The following callbacks have to be implemented in backend if arch.h |
| 224 | * defines ARCH_HAVE_LTELF_DATA. Those are used to init and destroy |
| 225 | * LTE->arch. arch_elf_init returns 0 on success or a negative value |
| 226 | * on failure. */ |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 227 | int arch_elf_init(struct ltelf *lte, struct library *lib); |
| 228 | void arch_elf_destroy(struct ltelf *lte); |
| 229 | |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 230 | /* The following callbacks have to be implemented in backend if arch.h |
| 231 | * defines ARCH_HAVE_BREAKPOINT_DATA. Those are used to init, |
| 232 | * destroy, and clone SBP->arch. arch_breakpoint_init and |
| 233 | * arch_breakpoint_clone return 0 on success or a negative value on |
| 234 | * failure. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 235 | int arch_breakpoint_init(struct process *proc, struct breakpoint *sbp); |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 236 | void arch_breakpoint_destroy(struct breakpoint *sbp); |
| 237 | int arch_breakpoint_clone(struct breakpoint *retp, struct breakpoint *sbp); |
| 238 | |
| 239 | /* The following callbacks have to be implemented in backend if arch.h |
| 240 | * defines ARCH_HAVE_LIBRARY_DATA. Those are used to init, destroy |
| 241 | * and clone LIB->arch. */ |
| 242 | void arch_library_init(struct library *lib); |
| 243 | void arch_library_destroy(struct library *lib); |
| 244 | void arch_library_clone(struct library *retp, struct library *lib); |
| 245 | |
| 246 | /* The following callbacks have to be implemented in backend if arch.h |
| 247 | * defines ARCH_HAVE_LIBRARY_SYMBOL_DATA. Those are used to init, |
| 248 | * destroy and clone LIBSYM->arch. arch_library_symbol_init and |
| 249 | * arch_library_symbol_clone return 0 on success or a negative value |
| 250 | * on failure. */ |
| 251 | int arch_library_symbol_init(struct library_symbol *libsym); |
| 252 | void arch_library_symbol_destroy(struct library_symbol *libsym); |
| 253 | int arch_library_symbol_clone(struct library_symbol *retp, |
| 254 | struct library_symbol *libsym); |
| 255 | |
| 256 | /* The following callbacks have to be implemented in backend if arch.h |
| 257 | * defines ARCH_HAVE_PROCESS_DATA. Those are used to init, destroy |
| 258 | * and clone PROC->arch. arch_process_exec is called to update |
| 259 | * PROC->arch in case that PROC underwent an exec. See notes at |
| 260 | * process_init, process_destroy, process_clone and process_exec in |
| 261 | * proc.h. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 262 | int arch_process_init(struct process *proc); |
| 263 | void arch_process_destroy(struct process *proc); |
| 264 | int arch_process_clone(struct process *retp, struct process *proc); |
| 265 | int arch_process_exec(struct process *proc); |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 266 | |
| Petr Machata | 0f6e6d9 | 2012-10-26 23:42:17 +0200 | [diff] [blame] | 267 | /* The following callbacks have to be implemented in OS backend if |
| 268 | * os.h defines OS_HAVE_PROCESS_DATA. The protocol is same as for, |
| 269 | * respectively, arch_process_init, arch_process_destroy, |
| 270 | * arch_process_clone and arch_process_exec. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 271 | int os_process_init(struct process *proc); |
| 272 | void os_process_destroy(struct process *proc); |
| 273 | int os_process_clone(struct process *retp, struct process *proc); |
| 274 | int os_process_exec(struct process *proc); |
| Petr Machata | 0f6e6d9 | 2012-10-26 23:42:17 +0200 | [diff] [blame] | 275 | |
| Edgar E. Iglesias | b5920d1 | 2012-09-27 12:07:35 +0200 | [diff] [blame] | 276 | /* The following callback has to be implemented in backend if arch.h |
| 277 | * defines ARCH_HAVE_GET_SYM_INFO. |
| 278 | * |
| 279 | * This is called for every PLT relocation R in ELF file LTE, that |
| 280 | * ltrace is about to add to it's internal representation of the |
| 281 | * program under trace. |
| 282 | * The corresponding PLT entry is for SYM_INDEX-th relocation in the file. |
| 283 | * |
| 284 | * The callback is responsible for initializing RELA and SYM. |
| 285 | * |
| 286 | * Return 0 if OK. |
| 287 | * Return a negative value if this symbol (SYM_INDEX) should be ignored. */ |
| 288 | int arch_get_sym_info(struct ltelf *lte, const char *filename, |
| 289 | size_t sym_index, GElf_Rela *rela, GElf_Sym *sym); |
| 290 | |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 291 | enum plt_status { |
| Petr Machata | ade3b97 | 2012-12-17 03:45:30 +0100 | [diff] [blame] | 292 | PLT_FAIL, |
| 293 | PLT_OK, |
| 294 | PLT_DEFAULT, |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 295 | }; |
| 296 | |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 297 | /* The following callback has to be implemented in backend if arch.h |
| 298 | * defines ARCH_HAVE_ADD_PLT_ENTRY. |
| 299 | * |
| 300 | * This is called for every PLT relocation R in ELF file LTE, that |
| 301 | * ltrace is about to add to a library constructed in process PROC. |
| 302 | * The corresponding PLT entry is for symbol called NAME, and it's |
| 303 | * I-th relocation in the file. |
| 304 | * |
| Petr Machata | ade3b97 | 2012-12-17 03:45:30 +0100 | [diff] [blame] | 305 | * If this function returns PLT_DEFAULT, PLT address is obtained by |
| 306 | * calling arch_plt_sym_val, and symbol is allocated. If PLT_OK or |
| 307 | * PLT_DEFAULT are returned, the chain of symbols passed back in RET |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 308 | * is added to library under construction. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 309 | enum plt_status arch_elf_add_plt_entry(struct process *proc, struct ltelf *lte, |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 310 | const char *name, GElf_Rela *rela, |
| 311 | size_t i, struct library_symbol **ret); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 312 | |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 313 | /* This callback needs to be implemented if arch.h defines |
| 314 | * ARCH_HAVE_DYNLINK_DONE. It is called after the dynamic linker is |
| Petr Machata | 9af3f3a | 2012-12-04 17:42:14 +0100 | [diff] [blame] | 315 | * done with the process start-up. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 316 | void arch_dynlink_done(struct process *proc); |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 317 | |
| Edgar E. Iglesias | 3a1806d | 2012-09-27 17:02:40 +0200 | [diff] [blame] | 318 | /* This callback needs to be implemented if arch.h defines |
| 319 | * ARCH_HAVE_SYMBOL_RET. It is called after a traced call returns. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 320 | void arch_symbol_ret(struct process *proc, struct library_symbol *libsym); |
| Edgar E. Iglesias | 3a1806d | 2012-09-27 17:02:40 +0200 | [diff] [blame] | 321 | |
| Edgar E. Iglesias | 11c3c3e | 2012-10-09 12:16:52 +0200 | [diff] [blame] | 322 | |
| 323 | /* This callback needs to be implemented if arch.h defines |
| 324 | * ARCH_HAVE_FIND_DL_DEBUG. |
| 325 | * It is called by generic code to find the address of the dynamic |
| 326 | * linkers debug structure. |
| 327 | * DYN_ADDR holds the address of the dynamic section. |
| 328 | * If the debug area is found, return 0 and fill in the address in *RET. |
| 329 | * If the debug area is not found, return a negative value. */ |
| Petr Machata | 929bd57 | 2012-12-17 03:20:34 +0100 | [diff] [blame] | 330 | int arch_find_dl_debug(struct process *proc, arch_addr_t dyn_addr, |
| Edgar E. Iglesias | 11c3c3e | 2012-10-09 12:16:52 +0200 | [diff] [blame] | 331 | arch_addr_t *ret); |
| 332 | |
| Petr Machata | 9af3f3a | 2012-12-04 17:42:14 +0100 | [diff] [blame] | 333 | /* This is called to obtain a list of directories to search when |
| 334 | * loading config files. The callback sets *RETP to a pointer to the |
| 335 | * first element of a NULL-terminated array of directory names. It's |
| 336 | * legitimate to set *RETP to NULL to indicate there are no |
| 337 | * directories. The function returns 0 on success or a negative value |
| 338 | * on a failure. |
| 339 | * |
| 340 | * If PRIVATE is set, the list in *RETP should contain only user's own |
| 341 | * directories (presumably under HOME if there's any such thing on the |
| 342 | * given OS). Otherwise only system directories should be reported. |
| 343 | * |
| 344 | * The directories don't have to exist. Directories passed in -F are |
| 345 | * handled separately by the caller and this callback shouldn't |
| 346 | * concern itself with it. */ |
| 347 | int os_get_config_dirs(int private, const char ***retp); |
| 348 | |
| Petr Machata | 364753a | 2012-12-06 18:28:17 +0100 | [diff] [blame] | 349 | /* This is called to obtain the name of legacy config file, if any. |
| 350 | * Returns 0 on success, in which case *RETP should be set to the file |
| 351 | * name (it is legitimate to set this to NULL), or a negative value on |
| 352 | * failure. It is OK if the file is not present. */ |
| 353 | int os_get_ltrace_conf_filename(const char **retp); |
| 354 | |
| Petr Machata | 311358a | 2012-09-22 15:24:06 +0200 | [diff] [blame] | 355 | /* If arch.h defines ARCH_HAVE_FETCH_ARG, the following callbacks have |
| 356 | * to be implemented: arch_fetch_arg_init, arch_fetch_arg_clone, |
| 357 | * arch_fetch_arg_done, arch_fetch_arg_next and arch_fetch_retval. |
| 358 | * See fetch.h for details. */ |
| 359 | |
| 360 | /* If arch.h defines both ARCH_HAVE_FETCH_ARG and |
| 361 | * ARCH_HAVE_FETCH_PACK, the following callbacks have to be |
| 362 | * implemented: arch_fetch_param_pack_start, |
| 363 | * arch_fetch_param_pack_end. See fetch.h for details. */ |
| 364 | |
| Petr Machata | 693dfad | 2013-01-14 22:10:51 +0100 | [diff] [blame] | 365 | enum sw_singlestep_status { |
| 366 | SWS_FAIL, |
| 367 | SWS_OK, |
| 368 | SWS_HW, |
| 369 | }; |
| 370 | struct sw_singlestep_data; |
| 371 | |
| 372 | /* The following callback has to be implemented in backend if arch.h |
| 373 | * defines ARCH_HAVE_SW_SINGLESTEP. |
| 374 | * |
| 375 | * This is called before the OS backend requests hardware singlestep. |
| 376 | * arch_sw_singlestep should consider whether a singlestep needs to be |
| 377 | * done in software. If not, it returns SWS_HW. Otherwise it needs |
| 378 | * to add one or several breakpoints by calling ADD_CB. When it is |
| 379 | * done, it continues the process as appropriate, and answers either |
| 380 | * SWS_OK, or SWS_FAIL, depending on how it went. |
| 381 | * |
| 382 | * PROC is the process that should perform the singlestep, BP the |
| 383 | * breakpoint that we are singlestepping over. ADD_CB is a callback |
| 384 | * to request adding breakpoints that should trap the process after |
| 385 | * it's continued. The arguments to ADD_CB are the address where the |
| 386 | * breakpoint should be added, and DATA. ADD_CB returns 0 on success |
| 387 | * or a negative value on failure. It is expected that |
| 388 | * arch_sw_singlestep returns SWS_FAIL if ADD_CB returns error. */ |
| 389 | enum sw_singlestep_status arch_sw_singlestep(struct process *proc, |
| 390 | struct breakpoint *bp, |
| 391 | int (*add_cb)(arch_addr_t addr, |
| 392 | struct sw_singlestep_data *), |
| 393 | struct sw_singlestep_data *data); |
| 394 | |
| Petr Machata | 6426260 | 2012-01-07 03:41:36 +0100 | [diff] [blame] | 395 | #endif /* BACKEND_H */ |