1/* Target operations for the remote server for GDB. 2 Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. 3 4 Contributed by MontaVista Software. 5 6 This file is part of GDB. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20 21#ifndef TARGET_H 22#define TARGET_H 23 24/* This structure describes how to resume a particular thread (or 25 all threads) based on the client's request. If thread is -1, then 26 this entry applies to all threads. These are generally passed around 27 as an array, and terminated by a thread == -1 entry. */ 28 29struct thread_resume 30{ 31 unsigned long thread; 32 33 /* If non-zero, leave this thread stopped. */ 34 int leave_stopped; 35 36 /* If non-zero, we want to single-step. */ 37 int step; 38 39 /* If non-zero, send this signal when we resume. */ 40 int sig; 41}; 42 43struct target_ops 44{ 45 /* Start a new process. 46 47 PROGRAM is a path to the program to execute. 48 ARGS is a standard NULL-terminated array of arguments, 49 to be passed to the inferior as ``argv''. 50 51 Returns the new PID on success, -1 on failure. Registers the new 52 process with the process list. */ 53 54 int (*create_inferior) (char *program, char **args); 55 56 /* Attach to a running process. 57 58 PID is the process ID to attach to, specified by the user 59 or a higher layer. 60 61 Returns -1 if attaching is unsupported, 0 on success, and calls 62 error() otherwise. */ 63 64 int (*attach) (unsigned long pid); 65 66 /* Kill all inferiors. */ 67 68 void (*kill) (void); 69 70 /* Detach from all inferiors. 71 Return -1 on failure, and 0 on success. */ 72 73 int (*detach) (void); 74 75 /* Wait for inferiors to end. */ 76 77 void (*join) (void); 78 79 /* Return 1 iff the thread with process ID PID is alive. */ 80 81 int (*thread_alive) (unsigned long pid); 82 83 /* Resume the inferior process. */ 84 85 void (*resume) (struct thread_resume *resume_info); 86 87 /* Wait for the inferior process to change state. 88 89 STATUS will be filled in with a response code to send to GDB. 90 91 Returns the signal which caused the process to stop, in the 92 remote protocol numbering (e.g. TARGET_SIGNAL_STOP), or the 93 exit code as an integer if *STATUS is 'W'. */ 94 95 unsigned char (*wait) (char *status); 96 97 /* Fetch registers from the inferior process. 98 99 If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO. */ 100 101 void (*fetch_registers) (int regno); 102 103 /* Store registers to the inferior process. 104 105 If REGNO is -1, store all registers; otherwise, store at least REGNO. */ 106 107 void (*store_registers) (int regno); 108 109 /* Read memory from the inferior process. This should generally be 110 called through read_inferior_memory, which handles breakpoint shadowing. 111 112 Read LEN bytes at MEMADDR into a buffer at MYADDR. 113 114 Returns 0 on success and errno on failure. */ 115 116 int (*read_memory) (CORE_ADDR memaddr, unsigned char *myaddr, int len); 117 118 /* Write memory to the inferior process. This should generally be 119 called through write_inferior_memory, which handles breakpoint shadowing. 120 121 Write LEN bytes from the buffer at MYADDR to MEMADDR. 122 123 Returns 0 on success and errno on failure. */ 124 125 int (*write_memory) (CORE_ADDR memaddr, const unsigned char *myaddr, 126 int len); 127 128 /* Query GDB for the values of any symbols we're interested in. 129 This function is called whenever we receive a "qSymbols::" 130 query, which corresponds to every time more symbols (might) 131 become available. NULL if we aren't interested in any 132 symbols. */ 133 134 void (*look_up_symbols) (void); 135 136 /* Send an interrupt request to the inferior process, 137 however is appropriate. */ 138 139 void (*request_interrupt) (void); 140 141 /* Read auxiliary vector data from the inferior process. 142 143 Read LEN bytes at OFFSET into a buffer at MYADDR. */ 144 145 int (*read_auxv) (CORE_ADDR offset, unsigned char *myaddr, 146 unsigned int len); 147 148 /* Insert and remove a hardware watchpoint. 149 Returns 0 on success, -1 on failure and 1 on unsupported. 150 The type is coded as follows: 151 2 = write watchpoint 152 3 = read watchpoint 153 4 = access watchpoint 154 */ 155 156 int (*insert_watchpoint) (char type, CORE_ADDR addr, int len); 157 int (*remove_watchpoint) (char type, CORE_ADDR addr, int len); 158 159 /* Returns 1 if target was stopped due to a watchpoint hit, 0 otherwise. */ 160 161 int (*stopped_by_watchpoint) (void); 162 163 /* Returns the address associated with the watchpoint that hit, if any; 164 returns 0 otherwise. */ 165 166 CORE_ADDR (*stopped_data_address) (void); 167 168 /* Reports the text, data offsets of the executable. This is 169 needed for uclinux where the executable is relocated during load 170 time. */ 171 172 int (*read_offsets) (CORE_ADDR *text, CORE_ADDR *data); 173 174 /* Fetch the address associated with a specific thread local storage 175 area, determined by the specified THREAD, OFFSET, and LOAD_MODULE. 176 Stores it in *ADDRESS and returns zero on success; otherwise returns 177 an error code. A return value of -1 means this system does not 178 support the operation. */ 179 180 int (*get_tls_address) (struct thread_info *thread, CORE_ADDR offset, 181 CORE_ADDR load_module, CORE_ADDR *address); 182 183 /* Return a string identifying the current architecture, or NULL if 184 this operation is not supported. */ 185 const char *(*arch_string) (void); 186 187 /* Read/Write from/to spufs using qXfer packets. */ 188 int (*qxfer_spu) (const char *annex, unsigned char *readbuf, 189 unsigned const char *writebuf, CORE_ADDR offset, int len); 190}; 191 192extern struct target_ops *the_target; 193 194void set_target_ops (struct target_ops *); 195 196#define create_inferior(program, args) \ 197 (*the_target->create_inferior) (program, args) 198 199#define myattach(pid) \ 200 (*the_target->attach) (pid) 201 202#define kill_inferior() \ 203 (*the_target->kill) () 204 205#define detach_inferior() \ 206 (*the_target->detach) () 207 208#define mythread_alive(pid) \ 209 (*the_target->thread_alive) (pid) 210 211#define fetch_inferior_registers(regno) \ 212 (*the_target->fetch_registers) (regno) 213 214#define store_inferior_registers(regno) \ 215 (*the_target->store_registers) (regno) 216 217#define join_inferior() \ 218 (*the_target->join) () 219 220unsigned char mywait (char *statusp, int connected_wait); 221 222int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len); 223 224int write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr, 225 int len); 226 227void set_desired_inferior (int id); 228 229#endif /* TARGET_H */ 230