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