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/* True if gdbserver is single stepping the valgrind process */
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern Bool valgrind_single_stepping(void);
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Set Valgrind in single stepping mode or not according to Bool. */
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void valgrind_set_single_stepping(Bool);
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* gets the addr at which a (possible) break must be ignored once.
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   If there is no such break to be ignored once, 0 is returned.
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This is needed for the following case:
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The user sets a break at address AAA.
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The break is encountered. Then the user does stepi
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (i.e. step one instruction).
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   In such a case, the already encountered break must be ignored
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to ensure the stepi will advance by one instruction: a "break"
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   is implemented in valgrind by some helper code just after the
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   instruction mark at which the break is set. This helper code
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   verifies if either there is a break at the current PC
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   or if we are in stepping mode. If we are in stepping mode,
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the already encountered break must be ignored once to advance
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to the next instruction.
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ??? need to check if this is *really* needed. */
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern Addr valgrind_get_ignore_break_once(void);
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* When addr > 0, ensures the next stop reply packet informs
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   gdb about the encountered watchpoint.
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Use addr 0x0 to reset. */
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void VG_(set_watchpoint_stop_address) (Addr addr);
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* when invoked by vgdb using ptrace, contains the tid chosen
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   by vgdb (if vgdb gives a tid different of 0: a 0 tid by
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vgdb means use the running_tid if there is one running
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   or tid 1 otherwise). */
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern ThreadId vgdb_interrupted_tid;
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------ end of interface to low level gdbserver */
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define dlog(level, ...) \
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do { if (UNLIKELY(VG_(debugLog_getLevel)() >= level))  \
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(debugLog) (level, "gdbsrv",__VA_ARGS__); }   \
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (0)
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* vki only defines VKI_POLLIN but even not on all OS.
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Below is from linux bits/poll.h */
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VKI_POLLIN
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLIN            0x0001
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLPRI           0x0002
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLOUT           0x0004
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLERR           0x0008
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLHUP           0x0010
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VKI_POLLNVAL          0x0020
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* a bunch of macros to avoid libc usage in valgrind-ified gdbserver */
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strcmp(s1,s2)         VG_(strcmp) ((Char *)(s1),(Char *)(s2))
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strncmp(s1,s2,nmax)   VG_(strncmp) ((Char *)(s1),(Char *)(s2),nmax)
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strcat(s1,s2)         VG_(strcat) ((Char *)(s1),(Char *)(s2))
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strcpy(s1,s2)         VG_(strcpy) ((Char *)(s1),(Char *)(s2))
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strncpy(s1,s2,nmax)   VG_(strncpy) ((Char *)(s1),(Char *)(s2),nmax)
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strlen(s)             VG_(strlen) ((Char *)(s))
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strtok(p,s)           (char *) VG_(strtok) ((Char *)(p),(Char *)(s))
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strtok_r(p,s,ss)      (char *) VG_(strtok_r) ((Char *)(p),(Char *)(s),(Char **)(ss))
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strchr(s,c)           (char *) VG_(strchr) ((Char *)(s),c)
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* strtol and strtoul supports base 16 or else assumes it is base 10 */
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strtol(s,r,b)         ((b) == 16 ? \
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               VG_(strtoll16) ((Char *)(s),(Char **)(r)) \
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               : VG_(strtoll10) ((Char *)(s),(Char **)(r)))
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strtoul(s,r,b)        ((b) == 16 ? \
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               VG_(strtoull16) ((Char *)(s),(Char **)(r)) \
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               : VG_(strtoull10) ((Char *)(s),(Char **)(r)))
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define malloc(sz)            VG_(arena_malloc)  (VG_AR_CORE, "gdbsrv", sz)
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define calloc(n,sz)          VG_(arena_calloc)  (VG_AR_CORE, "gdbsrv", n, sz)
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define realloc(p,size)       VG_(arena_realloc) (VG_AR_CORE, "gdbsrv", p, size)
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define strdup(s)             (char *) VG_(arena_strdup)  (VG_AR_CORE, "gdbsrv", (Char *)(s))
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define free(b)               VG_(arena_free)    (VG_AR_CORE, b)
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef ATTR_NORETURN
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ATTR_NORETURN __attribute__ ((noreturn))
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ATTR_NORETURN           /* nothing */
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef ATTR_FORMAT
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 4))
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ATTR_FORMAT(type, x, y) __attribute__ ((format(type, x, y)))
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ATTR_FORMAT(type, x, y) /* nothing */
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A type used for binary buffers.  */
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef unsigned char gdb_byte;
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef Addr CORE_ADDR;
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Generic information for tracking a list of ``inferiors'' - threads,
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   processes, etc.  */
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry *head;
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry *tail;
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list_entry
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   unsigned long id;
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry *next;
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Opaque type for user-visible threads.  */
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct thread_info;
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "regcache.h"
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "gdb/signals.h"
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* signal handling with gdbserver: before delivering a signal,
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call gdbserver_signal_encountered then give control to
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   gdbserver by calling call_gdbserver.
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   On return, call gdbserver_deliver_signal to effectively
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   deliver the signal or not. */
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void gdbserver_signal_encountered (Int sigNo);
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* between these two calls, call call_gdbserver */
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* If gdbserver_deliver_signal True, then gdb did not ask
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to ignore the signal, so signal can be delivered to the guest. */
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern Bool gdbserver_deliver_signal (Int sigNo);
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* To optimise signal handling, gdb can instruct gdbserver to
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   not stop on some signals. In the below, a 1 indicates the signal
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   has to be passed directly to the guest, without asking gdb.
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   A 0 indicates gdb has to be consulted to see if signal has
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   or has not to be passed. The gdb consultation is to
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   be done using the above two functions. */
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern int pass_signals[];
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "target.h"
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Target-specific functions */
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid initialize_low (void);
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* initialize or re-initialize the register set of the low target.
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if shadow_mode, then (re-)define the normal and valgrind shadow registers
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   else (re-)define only the normal registers. */
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid initialize_shadow_low (Bool shadow_mode);
258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* From inferiors.c.  */
260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern struct inferior_list all_threads;
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid add_inferior_to_list (struct inferior_list *list,
263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			   struct inferior_list_entry *new_inferior);
264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid for_each_inferior (struct inferior_list *list,
265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			void (*action) (struct inferior_list_entry *));
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern struct thread_info *current_inferior;
267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remove_inferior (struct inferior_list *list,
268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		      struct inferior_list_entry *entry);
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remove_thread (struct thread_info *thread);
270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid add_thread (unsigned long thread_id, void *target_data, unsigned int);
271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned int thread_id_to_gdb_id (unsigned long);
272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned int thread_to_gdb_id (struct thread_info *);
273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned long gdb_id_to_thread_id (unsigned int);
274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct thread_info *gdb_id_to_thread (unsigned int);
275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid clear_inferiors (void);
276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list_entry *find_inferior (struct inferior_list *,
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           int (*func) (struct
278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                        inferior_list_entry *,
279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                        void *),
280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           void *arg);
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list_entry *find_inferior_id (struct inferior_list *list,
282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov					      unsigned long id);
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid *inferior_target_data (struct thread_info *);
284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid set_inferior_target_data (struct thread_info *, void *);
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid *inferior_regcache_data (struct thread_info *);
286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid set_inferior_regcache_data (struct thread_info *, void *);
287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid change_inferior_id (struct inferior_list *list,
288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			 unsigned long new_id);
289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Public variables in server.c */
291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long cont_thread;
293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long general_thread;
294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long step_thread;
295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long thread_from_wait;
296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern unsigned long old_thread_from_wait;
297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern VG_MINIMAL_JMP_BUF(toplevel);
299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* From remote-utils.c */
301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern Bool noack_mode;
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint putpkt (char *buf);
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint putpkt_binary (char *buf, int len);
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint getpkt (char *buf);
306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remote_open (char *name);
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remote_close (void);
308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid sync_gdb_connection (void);
310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid write_ok (char *buf);
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid write_enn (char *buf);
312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid convert_ascii_to_int (char *from, unsigned char *to, int n);
313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid convert_int_to_ascii (unsigned char *from, char *to, int n);
314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid prepare_resume_reply (char *buf, char status, unsigned char sig);
315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid decode_address (CORE_ADDR *addrp, const char *start, int len);
317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid decode_m_packet (char *from, CORE_ADDR * mem_addr_ptr,
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		      unsigned int *len_ptr);
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid decode_M_packet (char *from, CORE_ADDR * mem_addr_ptr,
320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		      unsigned int *len_ptr, unsigned char *to);
321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint decode_X_packet (char *from, int packet_len, CORE_ADDR * mem_addr_ptr,
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     unsigned int *len_ptr, unsigned char *to);
323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint unhexify (char *bin, const char *hex, int count);
325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint hexify (char *hex, const char *bin, int count);
326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint remote_escape_output (const gdb_byte *buffer, int len,
327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			  gdb_byte *out_buf, int *out_len,
328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			  int out_maxlen);
329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Functions from ``signals.c''.  */
331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovenum target_signal target_signal_from_host (int hostsig);
332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint target_signal_to_host_p (enum target_signal oursig);
333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint target_signal_to_host (enum target_signal oursig);
334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovchar *target_signal_to_name (enum target_signal);
335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Functions from utils.c */
337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* error is like VG_(umsg), then VG_MINIMAL_LONGJMP to gdbserver toplevel. */
339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid error (const char *string,...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2);
340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* first output a description of the error inside sr, then like VG_(umsg). */
341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid sr_perror (SysRes sr,char *string,...) ATTR_FORMAT (printf, 2, 3);
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* fatal is like VG_(umsg), then exit(1). */
343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid fatal (const char *string,...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2);
344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* warning is like VG_(umsg). */
345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid warning (const char *string,...) ATTR_FORMAT (printf, 1, 2);
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Functions from the register cache definition.  */
348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid init_registers (void);
350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Maximum number of bytes to read/write at once.  The value here
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   is chosen to fill up a packet (the headers account for the 32).  */
353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define MAXBUFBYTES(N) (((N)-32)/2)
354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* PBUFSIZ : Buffers size for transferring memory, registers, etc.
356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Must be big enough to hold all the registers, at least.
357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Must be at least big as 2*DATASIZ + 5:
358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      1         : packet begin ($ or %)
359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    + 2*DATASIZ : encoded string
360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    + 1         : packet end (#)
361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    + 2         : packet checksum
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    + 1         : \0
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    Max value gdb likes is 16384.
365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    Note that what is sent/received to/from gdb does
367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    not have a trailing null byte. We are adding 1 here to allow
368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    null terminating the strings e.g. for printf.
369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    => packet Packet OVERHead SIZe is 5:*/
371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* keep PBUFSIZ value in sync with vgdb.c */
373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define PBUFSIZ 16384
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define POVERHSIZ 5
375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Max size of a string encoded in a packet. Hex Encoding can
377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   multiply the size by 2 (trailing null byte not sent). */
378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define DATASIZ ((PBUFSIZ-POVERHSIZ)/2)
379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Version information, from version.c.  */
381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern const char version[];
382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif /* SERVER_H */
384