1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Common definitions for remote server for GDB. 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Copyright (C) 1993, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 2006 4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Free Software Foundation, Inc. 5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This file is part of GDB. 7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov It has been modified to integrate it in valgrind 8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This program is free software; you can redistribute it and/or modify 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov it under the terms of the GNU General Public License as published by 11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov the Free Software Foundation; either version 2 of the License, or 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (at your option) any later version. 13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This program is distributed in the hope that it will be useful, 15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov but WITHOUT ANY WARRANTY; without even the implied warranty of 16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GNU General Public License for more details. 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov You should have received a copy of the GNU General Public License 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov along with this program; if not, write to the Free Software 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Foundation, Inc., 51 Franklin Street, Fifth Floor, 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Boston, MA 02110-1301, USA. */ 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef SERVER_H 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define SERVER_H 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_basics.h" 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_vki.h" 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_xarray.h" 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_clientstate.h" 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_debuglog.h" 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_errormgr.h" 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcassert.h" 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcfile.h" 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcprint.h" 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_mallocfree.h" 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_syscall.h" 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_libcproc.h" 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_tooliface.h" 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_libcassert.h" 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_libcbase.h" 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_options.h" 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_gdbserver.h" 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_libcsetjmp.h" 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_threadstate.h" 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_aspacemgr.h" 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_vki.h" 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "valgrind.h" 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------- interface m_gdbserver <=> low level gdbserver */ 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Initializes gdbserver. After a call to gdbserver_init, vgdb 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov can contact the gdbserver embedded in valgrind. 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov The rest of the low level gdbserver interface can only 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov be called */ 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void gdbserver_init (void); 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void server_main (void); 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* To be called to indicate that gdbserver usage is finished. 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Resources (e.g. FIFOs) will be destroyed. */ 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void gdbserver_terminate (void); 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Output string s to the gdb debugging this process or to vgdb. 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Do not call this directly. Rather use VG_(monitor_print) 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov to output something to gdb, use normal valgrind messaging 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (e.g. VG_(umsg)) to send output that can either go 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov to gdb or to log. */ 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void monitor_output (char *s); 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* returns 0 if there is no connection or no event on the connection 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov with gdb. 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov returns 1 if there are some data which has been received from gdb 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov and that must (still) be handled. 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov returns 2 if remote_desc_activity detected the connection has been 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov lost and should be reopened. 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov msg is used for debug logging.*/ 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern int remote_desc_activity(char *msg); 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* output some status of gdbserver communication */ 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void remote_utils_output_status(void); 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* True if there is a connection with gdb. */ 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern Bool remote_connected(void); 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Finish the connection with gdb and reset_valgrind_sink. 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Keeps the FIFOs and shared mem so as to allow connection 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov to be reopened. */ 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void remote_finish(FinishReason reason); 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* If Valgrind sink was changed by gdbserver: 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Resets the valgrind sink to before the changes done by gdbserver, 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov and does VG_(umsg). If info != NULL, info added in VG_(usmg). */ 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void reset_valgrind_sink(char* info); 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* For ARM usage. 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Guesses if pc is a thumb pc. 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov In this case, returns pc with the thumb bit set (bit0) 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else just returns pc. 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov The guess is based on the following set of check: 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if bit0 set => thumb 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else if bit1 set => thumb 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else uses the debuginfo to guess. 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov If debug info not found for this pc, assumes arm */ 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern Addr thumb_pc (Addr pc); 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* when invoked by vgdb using ptrace, contains the tid chosen 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by vgdb (if vgdb gives a tid different of 0: a 0 tid by 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vgdb means use the running_tid if there is one running 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov or tid 1 otherwise). */ 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern ThreadId vgdb_interrupted_tid; 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------ end of interface to low level gdbserver */ 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define dlog(level, ...) \ 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov do { if (UNLIKELY(VG_(debugLog_getLevel)() >= level)) \ 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(debugLog) (level, "gdbsrv",__VA_ARGS__); } \ 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov while (0) 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* vki only defines VKI_POLLIN but even not on all OS. 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Below is from linux bits/poll.h */ 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VKI_POLLIN 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLIN 0x0001 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLPRI 0x0002 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLOUT 0x0004 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLERR 0x0008 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLHUP 0x0010 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLNVAL 0x0020 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* a bunch of macros to avoid libc usage in valgrind-ified gdbserver */ 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strcmp(s1,s2) VG_(strcmp) ((Char *)(s1),(Char *)(s2)) 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strncmp(s1,s2,nmax) VG_(strncmp) ((Char *)(s1),(Char *)(s2),nmax) 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strcat(s1,s2) VG_(strcat) ((Char *)(s1),(Char *)(s2)) 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strcpy(s1,s2) VG_(strcpy) ((Char *)(s1),(Char *)(s2)) 141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strncpy(s1,s2,nmax) VG_(strncpy) ((Char *)(s1),(Char *)(s2),nmax) 142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strlen(s) VG_(strlen) ((Char *)(s)) 143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strtok(p,s) (char *) VG_(strtok) ((Char *)(p),(Char *)(s)) 144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strtok_r(p,s,ss) (char *) VG_(strtok_r) ((Char *)(p),(Char *)(s),(Char **)(ss)) 145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strchr(s,c) (char *) VG_(strchr) ((Char *)(s),c) 146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* strtol and strtoul supports base 16 or else assumes it is base 10 */ 147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strtol(s,r,b) ((b) == 16 ? \ 148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(strtoll16) ((Char *)(s),(Char **)(r)) \ 149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : VG_(strtoll10) ((Char *)(s),(Char **)(r))) 150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strtoul(s,r,b) ((b) == 16 ? \ 151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(strtoull16) ((Char *)(s),(Char **)(r)) \ 152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : VG_(strtoull10) ((Char *)(s),(Char **)(r))) 153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define malloc(sz) VG_(arena_malloc) (VG_AR_CORE, "gdbsrv", sz) 155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define calloc(n,sz) VG_(arena_calloc) (VG_AR_CORE, "gdbsrv", n, sz) 156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define realloc(p,size) VG_(arena_realloc) (VG_AR_CORE, "gdbsrv", p, size) 157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strdup(s) (char *) VG_(arena_strdup) (VG_AR_CORE, "gdbsrv", (Char *)(s)) 158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define free(b) VG_(arena_free) (VG_AR_CORE, b) 159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef ATTR_NORETURN 161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) 162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ATTR_NORETURN __attribute__ ((noreturn)) 163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else 164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ATTR_NORETURN /* nothing */ 165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef ATTR_FORMAT 169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 4)) 170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ATTR_FORMAT(type, x, y) __attribute__ ((format(type, x, y))) 171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else 172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ATTR_FORMAT(type, x, y) /* nothing */ 173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A type used for binary buffers. */ 177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef unsigned char gdb_byte; 178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef Addr CORE_ADDR; 180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Generic information for tracking a list of ``inferiors'' - threads, 182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov processes, etc. */ 183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list 184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct inferior_list_entry *head; 186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct inferior_list_entry *tail; 187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}; 188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list_entry 189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long id; 191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct inferior_list_entry *next; 192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}; 193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Opaque type for user-visible threads. */ 195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct thread_info; 196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "regcache.h" 198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "gdb/signals.h" 199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* signal handling with gdbserver: before delivering a signal, 201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov call gdbserver_signal_encountered then give control to 202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov gdbserver by calling call_gdbserver. 203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov On return, call gdbserver_deliver_signal to effectively 204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov deliver the signal or not. */ 205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void gdbserver_signal_encountered (Int vki_sigNo); 206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* between these two calls, call call_gdbserver */ 207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* If gdbserver_deliver_signal True, then gdb did not ask 208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov to ignore the signal, so signal can be delivered to the guest. */ 209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Bool gdbserver_deliver_signal (Int vki_sigNo); 210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* To optimise signal handling, gdb can instruct gdbserver to 212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng not stop on some signals. In the below, a 1 indicates the gdb_nr signal 213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov has to be passed directly to the guest, without asking gdb. 214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov A 0 indicates gdb has to be consulted to see if signal has 215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov or has not to be passed. The gdb consultation is to 216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov be done using the above two functions. */ 217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern int pass_signals[]; /* indexed by gdb signal nr */ 218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "target.h" 221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Target-specific functions */ 223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* From inferiors.c. */ 225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern struct inferior_list all_threads; 227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid add_inferior_to_list (struct inferior_list *list, 228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct inferior_list_entry *new_inferior); 229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid for_each_inferior (struct inferior_list *list, 230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void (*action) (struct inferior_list_entry *)); 231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern struct thread_info *current_inferior; 232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remove_inferior (struct inferior_list *list, 233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct inferior_list_entry *entry); 234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remove_thread (struct thread_info *thread); 235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid add_thread (unsigned long thread_id, void *target_data, unsigned int); 236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned int thread_id_to_gdb_id (unsigned long); 237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned int thread_to_gdb_id (struct thread_info *); 238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned long gdb_id_to_thread_id (unsigned int); 239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct thread_info *gdb_id_to_thread (unsigned int); 240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid clear_inferiors (void); 241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list_entry *find_inferior (struct inferior_list *, 242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int (*func) (struct 243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov inferior_list_entry *, 244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void *), 245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void *arg); 246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list_entry *find_inferior_id (struct inferior_list *list, 247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long id); 248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid *inferior_target_data (struct thread_info *); 249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid set_inferior_target_data (struct thread_info *, void *); 250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid *inferior_regcache_data (struct thread_info *); 251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid set_inferior_regcache_data (struct thread_info *, void *); 252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid change_inferior_id (struct inferior_list *list, 253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long new_id); 254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Public variables in server.c */ 256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long cont_thread; 258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long general_thread; 259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long step_thread; 260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long thread_from_wait; 261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long old_thread_from_wait; 262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern VG_MINIMAL_JMP_BUF(toplevel); 264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* From remote-utils.c */ 266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern Bool noack_mode; 268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint putpkt (char *buf); 269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint putpkt_binary (char *buf, int len); 270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint getpkt (char *buf); 271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remote_open (char *name); 272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remote_close (void); 273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid sync_gdb_connection (void); 275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid write_ok (char *buf); 276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid write_enn (char *buf); 277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid convert_ascii_to_int (char *from, unsigned char *to, int n); 278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid convert_int_to_ascii (unsigned char *from, char *to, int n); 279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid prepare_resume_reply (char *buf, char status, unsigned char sig); 280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid decode_address (CORE_ADDR *addrp, const char *start, int len); 282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid decode_m_packet (char *from, CORE_ADDR * mem_addr_ptr, 283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned int *len_ptr); 284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid decode_M_packet (char *from, CORE_ADDR * mem_addr_ptr, 285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned int *len_ptr, unsigned char *to); 286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint decode_X_packet (char *from, int packet_len, CORE_ADDR * mem_addr_ptr, 287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned int *len_ptr, unsigned char *to); 288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint unhexify (char *bin, const char *hex, int count); 290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint hexify (char *hex, const char *bin, int count); 291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* heximage builds an image of bin according to byte order of the architecture 292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Useful for register and int image */ 293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengchar* heximage (char *buf, char *bin, int count); 294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* convert from CORE_ADDR to void* */ 296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid* C2v(CORE_ADDR addr); 297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint remote_escape_output (const gdb_byte *buffer, int len, 300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov gdb_byte *out_buf, int *out_len, 301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int out_maxlen); 302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Functions from ``signals.c''. */ 304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovenum target_signal target_signal_from_host (int hostsig); 305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint target_signal_to_host_p (enum target_signal oursig); 306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint target_signal_to_host (enum target_signal oursig); 307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovchar *target_signal_to_name (enum target_signal); 308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Functions from utils.c */ 310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* error is like VG_(umsg), then VG_MINIMAL_LONGJMP to gdbserver toplevel. */ 312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid error (const char *string,...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2); 313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* first output a description of the error inside sr, then like VG_(umsg). */ 314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid sr_perror (SysRes sr,char *string,...) ATTR_FORMAT (printf, 2, 3); 315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* fatal is like VG_(umsg), then exit(1). */ 316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid fatal (const char *string,...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2); 317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* warning is like VG_(umsg). */ 318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid warning (const char *string,...) ATTR_FORMAT (printf, 1, 2); 319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Functions from the register cache definition. */ 321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid init_registers (void); 323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Maximum number of bytes to read/write at once. The value here 325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov is chosen to fill up a packet (the headers account for the 32). */ 326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define MAXBUFBYTES(N) (((N)-32)/2) 327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* PBUFSIZ : Buffers size for transferring memory, registers, etc. 329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Must be big enough to hold all the registers, at least. 330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Must be at least big as 2*DATASIZ + 5: 331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1 : packet begin ($ or %) 332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov + 2*DATASIZ : encoded string 333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov + 1 : packet end (#) 334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov + 2 : packet checksum 335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov + 1 : \0 336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Max value gdb likes is 16384. 338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Note that what is sent/received to/from gdb does 340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov not have a trailing null byte. We are adding 1 here to allow 341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov null terminating the strings e.g. for printf. 342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov => packet Packet OVERHead SIZe is 5:*/ 344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* keep PBUFSIZ value in sync with vgdb.c */ 346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define PBUFSIZ 16384 347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define POVERHSIZ 5 348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Max size of a string encoded in a packet. Hex Encoding can 350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov multiply the size by 2 (trailing null byte not sent). */ 351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define DATASIZ ((PBUFSIZ-POVERHSIZ)/2) 352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Version information, from version.c. */ 354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern const char version[]; 355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif /* SERVER_H */ 357