* remote.c (remote_start_remote): Replace PTR with void pointer.
[deliverable/binutils-gdb.git] / gdb / remote.c
CommitLineData
c906108c 1/* Remote target communications for serial-line targets in custom GDB protocol
8926118c
AC
2
3 Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
4 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
c906108c 5
c5aa993b
JM
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c5aa993b 22
96baa820 23/* See the GDB User Guide for details of the GDB remote protocol. */
c5aa993b 24
c906108c
SS
25#include "defs.h"
26#include "gdb_string.h"
27#include <ctype.h>
28#include <fcntl.h>
c906108c
SS
29#include "inferior.h"
30#include "bfd.h"
31#include "symfile.h"
32#include "target.h"
c5aa993b 33/*#include "terminal.h" */
c906108c
SS
34#include "gdbcmd.h"
35#include "objfiles.h"
36#include "gdb-stabs.h"
37#include "gdbthread.h"
c2c6d25f 38#include "remote.h"
4e052eda 39#include "regcache.h"
fd0407d6 40#include "value.h"
1ff9c3d6 41#include "gdb_assert.h"
c906108c 42
7a292a7a 43#include <ctype.h>
9846de1b 44#include <sys/time.h>
c906108c
SS
45#ifdef USG
46#include <sys/types.h>
47#endif
48
43ff13b4 49#include "event-loop.h"
c2c6d25f 50#include "event-top.h"
2acceee2 51#include "inf-loop.h"
43ff13b4 52
c906108c
SS
53#include <signal.h>
54#include "serial.h"
55
6240bebf
MS
56#include "gdbcore.h" /* for exec_bfd */
57
c906108c 58/* Prototypes for local functions */
6426a772
JM
59static void cleanup_sigint_signal_handler (void *dummy);
60static void initialize_sigint_signal_handler (void);
d9fcf2fb 61static int getpkt_sane (char *buf, long sizeof_buf, int forever);
6426a772 62
a14ed312
KB
63static void handle_remote_sigint (int);
64static void handle_remote_sigint_twice (int);
65static void async_remote_interrupt (gdb_client_data);
66void async_remote_interrupt_twice (gdb_client_data);
43ff13b4 67
a14ed312 68static void build_remote_gdbarch_data (void);
0f71a2f6 69
917317f4 70static int remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len);
c906108c 71
a14ed312 72static int remote_read_bytes (CORE_ADDR memaddr, char *myaddr, int len);
c906108c 73
a14ed312 74static void remote_files_info (struct target_ops *ignore);
c906108c 75
a14ed312
KB
76static int remote_xfer_memory (CORE_ADDR memaddr, char *myaddr,
77 int len, int should_write,
29e57380 78 struct mem_attrib *attrib,
a14ed312 79 struct target_ops *target);
c906108c 80
a14ed312 81static void remote_prepare_to_store (void);
c906108c 82
a14ed312 83static void remote_fetch_registers (int regno);
c906108c 84
39f77062
KB
85static void remote_resume (ptid_t ptid, int step,
86 enum target_signal siggnal);
87static void remote_async_resume (ptid_t ptid, int step,
a14ed312 88 enum target_signal siggnal);
ae44c0c4 89static int remote_start_remote (void *);
c906108c 90
a14ed312
KB
91static void remote_open (char *name, int from_tty);
92static void remote_async_open (char *name, int from_tty);
c906108c 93
a14ed312
KB
94static void extended_remote_open (char *name, int from_tty);
95static void extended_remote_async_open (char *name, int from_tty);
c906108c 96
a14ed312
KB
97static void remote_open_1 (char *, int, struct target_ops *, int extended_p);
98static void remote_async_open_1 (char *, int, struct target_ops *,
99 int extended_p);
c906108c 100
a14ed312 101static void remote_close (int quitting);
c906108c 102
a14ed312 103static void remote_store_registers (int regno);
c906108c 104
a14ed312
KB
105static void remote_mourn (void);
106static void remote_async_mourn (void);
c906108c 107
a14ed312 108static void extended_remote_restart (void);
c906108c 109
a14ed312 110static void extended_remote_mourn (void);
c906108c 111
a14ed312
KB
112static void extended_remote_create_inferior (char *, char *, char **);
113static void extended_remote_async_create_inferior (char *, char *, char **);
c906108c 114
a14ed312 115static void remote_mourn_1 (struct target_ops *);
c906108c 116
c2d11a7d 117static void remote_send (char *buf, long sizeof_buf);
c906108c 118
a14ed312 119static int readchar (int timeout);
c906108c 120
39f77062
KB
121static ptid_t remote_wait (ptid_t ptid,
122 struct target_waitstatus *status);
123static ptid_t remote_async_wait (ptid_t ptid,
124 struct target_waitstatus *status);
c906108c 125
a14ed312
KB
126static void remote_kill (void);
127static void remote_async_kill (void);
c906108c 128
a14ed312 129static int tohex (int nib);
c906108c 130
a14ed312
KB
131static void remote_detach (char *args, int from_tty);
132static void remote_async_detach (char *args, int from_tty);
c906108c 133
a14ed312 134static void remote_interrupt (int signo);
c906108c 135
a14ed312 136static void remote_interrupt_twice (int signo);
7a292a7a 137
a14ed312 138static void interrupt_query (void);
c906108c 139
a14ed312 140static void set_thread (int, int);
c906108c 141
39f77062 142static int remote_thread_alive (ptid_t);
c906108c 143
a14ed312 144static void get_offsets (void);
c906108c 145
c2d11a7d 146static long read_frame (char *buf, long sizeof_buf);
c906108c 147
a14ed312 148static int remote_insert_breakpoint (CORE_ADDR, char *);
c906108c 149
a14ed312 150static int remote_remove_breakpoint (CORE_ADDR, char *);
c906108c 151
a14ed312 152static int hexnumlen (ULONGEST num);
c906108c 153
a14ed312 154static void init_remote_ops (void);
c906108c 155
a14ed312 156static void init_extended_remote_ops (void);
c906108c 157
a14ed312 158static void init_remote_cisco_ops (void);
0f71a2f6
JM
159
160static struct target_ops remote_cisco_ops;
161
a14ed312 162static void remote_stop (void);
c906108c 163
a14ed312 164static int ishex (int ch, int *val);
c906108c 165
a14ed312 166static int stubhex (int ch);
c906108c 167
a14ed312 168static int remote_query (int /*char */ , char *, char *, int *);
c906108c 169
a14ed312 170static int hexnumstr (char *, ULONGEST);
c906108c 171
a14ed312 172static int hexnumnstr (char *, ULONGEST, int);
2df3850c 173
a14ed312 174static CORE_ADDR remote_address_masked (CORE_ADDR);
c906108c 175
a14ed312 176static void print_packet (char *);
c906108c 177
a14ed312 178static unsigned long crc32 (unsigned char *, int, unsigned int);
c906108c 179
a14ed312 180static void compare_sections_command (char *, int);
c906108c 181
a14ed312 182static void packet_command (char *, int);
c906108c 183
a14ed312 184static int stub_unpack_int (char *buff, int fieldlength);
c906108c 185
39f77062 186static ptid_t remote_current_thread (ptid_t oldptid);
c906108c 187
a14ed312 188static void remote_find_new_threads (void);
c906108c 189
a14ed312 190static void record_currthread (int currthread);
c906108c 191
30559e10 192static int fromhex (int a);
c906108c 193
dc8acb97 194static int hex2bin (const char *hex, char *bin, int count);
c906108c 195
dc8acb97 196static int bin2hex (const char *bin, char *hex, int count);
234fa6d1 197
a14ed312 198static int putpkt_binary (char *buf, int cnt);
c906108c 199
a14ed312 200static void check_binary_download (CORE_ADDR addr);
c906108c 201
5a2468f5 202struct packet_config;
5a2468f5 203
a14ed312 204static void show_packet_config_cmd (struct packet_config *config);
5a2468f5 205
d471ea57 206static void update_packet_config (struct packet_config *config);
5a2468f5 207
c906108c
SS
208/* Define the target subroutine names */
209
a14ed312 210void open_remote_target (char *, int, struct target_ops *, int);
c906108c 211
a14ed312 212void _initialize_remote (void);
c906108c 213
694f61fb 214/* Description of the remote protocol. Strictly speaking, when the
d01949b6
AC
215 target is open()ed, remote.c should create a per-target description
216 of the remote protocol using that target's architecture.
217 Unfortunatly, the target stack doesn't include local state. For
218 the moment keep the information in the target's architecture
219 object. Sigh.. */
220
ad10f812
AC
221struct packet_reg
222{
223 long offset; /* Offset into G packet. */
224 long regnum; /* GDB's internal register number. */
225 LONGEST pnum; /* Remote protocol register number. */
b323314b 226 int in_g_packet; /* Always part of G packet. */
ad10f812
AC
227 /* long size in bytes; == REGISTER_RAW_SIZE (regnum); at present. */
228 /* char *name; == REGISTER_NAME (regnum); at present. */
229};
230
d01949b6
AC
231struct remote_state
232{
ad10f812
AC
233 /* Description of the remote protocol registers. */
234 long sizeof_g_packet;
b323314b
AC
235
236 /* Description of the remote protocol registers indexed by REGNUM
237 (making an array of NUM_REGS + NUM_PSEUDO_REGS in size). */
238 struct packet_reg *regs;
ad10f812 239
d01949b6
AC
240 /* This is the size (in chars) of the first response to the ``g''
241 packet. It is used as a heuristic when determining the maximum
242 size of memory-read and memory-write packets. A target will
243 typically only reserve a buffer large enough to hold the ``g''
244 packet. The size does not include packet overhead (headers and
245 trailers). */
246 long actual_register_packet_size;
247
248 /* This is the maximum size (in chars) of a non read/write packet.
249 It is also used as a cap on the size of read/write packets. */
250 long remote_packet_size;
251};
252
253/* Handle for retreving the remote protocol data from gdbarch. */
254static struct gdbarch_data *remote_gdbarch_data_handle;
255
256static struct remote_state *
257get_remote_state ()
258{
451fbdda 259 return gdbarch_data (current_gdbarch, remote_gdbarch_data_handle);
d01949b6
AC
260}
261
262static void *
263init_remote_state (struct gdbarch *gdbarch)
264{
265 int regnum;
266 struct remote_state *rs = xmalloc (sizeof (struct remote_state));
267
ad10f812
AC
268 /* Start out by having the remote protocol mimic the existing
269 behavour - just copy in the description of the register cache. */
270 rs->sizeof_g_packet = REGISTER_BYTES; /* OK use. */
271
b323314b
AC
272 /* Assume a 1:1 regnum<->pnum table. */
273 rs->regs = xcalloc (NUM_REGS + NUM_PSEUDO_REGS, sizeof (struct packet_reg));
274 for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
ad10f812 275 {
b323314b
AC
276 struct packet_reg *r = &rs->regs[regnum];
277 r->pnum = regnum;
278 r->regnum = regnum;
279 r->offset = REGISTER_BYTE (regnum);
280 r->in_g_packet = (regnum < NUM_REGS);
ad10f812
AC
281 /* ...size = REGISTER_RAW_SIZE (regnum); */
282 /* ...name = REGISTER_NAME (regnum); */
283 }
284
d01949b6
AC
285 /* Default maximum number of characters in a packet body. Many
286 remote stubs have a hardwired buffer size of 400 bytes
287 (c.f. BUFMAX in m68k-stub.c and i386-stub.c). BUFMAX-1 is used
288 as the maximum packet-size to ensure that the packet and an extra
289 NUL character can always fit in the buffer. This stops GDB
290 trashing stubs that try to squeeze an extra NUL into what is
291 already a full buffer (As of 1999-12-04 that was most stubs. */
292 rs->remote_packet_size = 400 - 1;
293
ad10f812
AC
294 /* Should rs->sizeof_g_packet needs more space than the
295 default, adjust the size accordingly. Remember that each byte is
296 encoded as two characters. 32 is the overhead for the packet
297 header / footer. NOTE: cagney/1999-10-26: I suspect that 8
d01949b6
AC
298 (``$NN:G...#NN'') is a better guess, the below has been padded a
299 little. */
ad10f812
AC
300 if (rs->sizeof_g_packet > ((rs->remote_packet_size - 32) / 2))
301 rs->remote_packet_size = (rs->sizeof_g_packet * 2 + 32);
d01949b6
AC
302
303 /* This one is filled in when a ``g'' packet is received. */
304 rs->actual_register_packet_size = 0;
305
306 return rs;
307}
308
309static void
310free_remote_state (struct gdbarch *gdbarch, void *pointer)
311{
ad10f812 312 struct remote_state *data = pointer;
b323314b 313 xfree (data->regs);
ad10f812
AC
314 xfree (data);
315}
316
317static struct packet_reg *
318packet_reg_from_regnum (struct remote_state *rs, long regnum)
319{
b323314b
AC
320 if (regnum < 0 && regnum >= NUM_REGS + NUM_PSEUDO_REGS)
321 return NULL;
322 else
ad10f812 323 {
b323314b
AC
324 struct packet_reg *r = &rs->regs[regnum];
325 gdb_assert (r->regnum == regnum);
326 return r;
ad10f812 327 }
ad10f812
AC
328}
329
330static struct packet_reg *
331packet_reg_from_pnum (struct remote_state *rs, LONGEST pnum)
332{
b323314b
AC
333 int i;
334 for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
ad10f812 335 {
b323314b
AC
336 struct packet_reg *r = &rs->regs[i];
337 if (r->pnum == pnum)
338 return r;
ad10f812
AC
339 }
340 return NULL;
d01949b6
AC
341}
342
c906108c
SS
343/* */
344
345static struct target_ops remote_ops;
346
347static struct target_ops extended_remote_ops;
348
43ff13b4
JM
349/* Temporary target ops. Just like the remote_ops and
350 extended_remote_ops, but with asynchronous support. */
351static struct target_ops remote_async_ops;
352
353static struct target_ops extended_async_remote_ops;
354
6426a772
JM
355/* FIXME: cagney/1999-09-23: Even though getpkt was called with
356 ``forever'' still use the normal timeout mechanism. This is
357 currently used by the ASYNC code to guarentee that target reads
358 during the initial connect always time-out. Once getpkt has been
359 modified to return a timeout indication and, in turn
360 remote_wait()/wait_for_inferior() have gained a timeout parameter
361 this can go away. */
362static int wait_forever_enabled_p = 1;
363
364
c906108c
SS
365/* This variable chooses whether to send a ^C or a break when the user
366 requests program interruption. Although ^C is usually what remote
367 systems expect, and that is the default here, sometimes a break is
368 preferable instead. */
369
370static int remote_break;
371
c906108c
SS
372/* Descriptor for I/O to remote machine. Initialize it to NULL so that
373 remote_open knows that we don't have a file open when the program
374 starts. */
819cc324 375static struct serial *remote_desc = NULL;
c906108c 376
0f71a2f6
JM
377/* This is set by the target (thru the 'S' message)
378 to denote that the target is in kernel mode. */
379static int cisco_kernel_mode = 0;
380
c906108c
SS
381/* This variable sets the number of bits in an address that are to be
382 sent in a memory ("M" or "m") packet. Normally, after stripping
383 leading zeros, the entire address would be sent. This variable
384 restricts the address to REMOTE_ADDRESS_SIZE bits. HISTORY: The
385 initial implementation of remote.c restricted the address sent in
386 memory packets to ``host::sizeof long'' bytes - (typically 32
387 bits). Consequently, for 64 bit targets, the upper 32 bits of an
388 address was never sent. Since fixing this bug may cause a break in
389 some remote targets this variable is principly provided to
390 facilitate backward compatibility. */
391
392static int remote_address_size;
393
6426a772
JM
394/* Tempoary to track who currently owns the terminal. See
395 target_async_terminal_* for more details. */
396
397static int remote_async_terminal_ours_p;
398
11cf8741 399\f
11cf8741 400/* User configurable variables for the number of characters in a
ad10f812
AC
401 memory read/write packet. MIN ((rs->remote_packet_size),
402 rs->sizeof_g_packet) is the default. Some targets need smaller
403 values (fifo overruns, et.al.) and some users need larger values
404 (speed up transfers). The variables ``preferred_*'' (the user
405 request), ``current_*'' (what was actually set) and ``forced_*''
406 (Positive - a soft limit, negative - a hard limit). */
11cf8741
JM
407
408struct memory_packet_config
409{
410 char *name;
411 long size;
412 int fixed_p;
413};
414
415/* Compute the current size of a read/write packet. Since this makes
416 use of ``actual_register_packet_size'' the computation is dynamic. */
417
418static long
419get_memory_packet_size (struct memory_packet_config *config)
420{
d01949b6 421 struct remote_state *rs = get_remote_state ();
11cf8741
JM
422 /* NOTE: The somewhat arbitrary 16k comes from the knowledge (folk
423 law?) that some hosts don't cope very well with large alloca()
424 calls. Eventually the alloca() code will be replaced by calls to
425 xmalloc() and make_cleanups() allowing this restriction to either
426 be lifted or removed. */
427#ifndef MAX_REMOTE_PACKET_SIZE
428#define MAX_REMOTE_PACKET_SIZE 16384
429#endif
430 /* NOTE: 16 is just chosen at random. */
431#ifndef MIN_REMOTE_PACKET_SIZE
432#define MIN_REMOTE_PACKET_SIZE 16
433#endif
434 long what_they_get;
435 if (config->fixed_p)
436 {
437 if (config->size <= 0)
438 what_they_get = MAX_REMOTE_PACKET_SIZE;
439 else
440 what_they_get = config->size;
441 }
442 else
443 {
d01949b6 444 what_they_get = (rs->remote_packet_size);
11cf8741
JM
445 /* Limit the packet to the size specified by the user. */
446 if (config->size > 0
447 && what_they_get > config->size)
448 what_they_get = config->size;
449 /* Limit it to the size of the targets ``g'' response. */
d01949b6
AC
450 if ((rs->actual_register_packet_size) > 0
451 && what_they_get > (rs->actual_register_packet_size))
452 what_they_get = (rs->actual_register_packet_size);
11cf8741
JM
453 }
454 if (what_they_get > MAX_REMOTE_PACKET_SIZE)
455 what_they_get = MAX_REMOTE_PACKET_SIZE;
456 if (what_they_get < MIN_REMOTE_PACKET_SIZE)
457 what_they_get = MIN_REMOTE_PACKET_SIZE;
458 return what_they_get;
459}
460
461/* Update the size of a read/write packet. If they user wants
462 something really big then do a sanity check. */
463
464static void
465set_memory_packet_size (char *args, struct memory_packet_config *config)
466{
467 int fixed_p = config->fixed_p;
468 long size = config->size;
469 if (args == NULL)
470 error ("Argument required (integer, `fixed' or `limited').");
471 else if (strcmp (args, "hard") == 0
472 || strcmp (args, "fixed") == 0)
473 fixed_p = 1;
474 else if (strcmp (args, "soft") == 0
475 || strcmp (args, "limit") == 0)
476 fixed_p = 0;
477 else
478 {
479 char *end;
480 size = strtoul (args, &end, 0);
481 if (args == end)
482 error ("Invalid %s (bad syntax).", config->name);
483#if 0
484 /* Instead of explicitly capping the size of a packet to
485 MAX_REMOTE_PACKET_SIZE or dissallowing it, the user is
486 instead allowed to set the size to something arbitrarily
487 large. */
488 if (size > MAX_REMOTE_PACKET_SIZE)
489 error ("Invalid %s (too large).", config->name);
490#endif
491 }
492 /* Extra checks? */
493 if (fixed_p && !config->fixed_p)
494 {
495 if (! query ("The target may not be able to correctly handle a %s\n"
496 "of %ld bytes. Change the packet size? ",
497 config->name, size))
498 error ("Packet size not changed.");
499 }
500 /* Update the config. */
501 config->fixed_p = fixed_p;
502 config->size = size;
503}
504
505static void
506show_memory_packet_size (struct memory_packet_config *config)
507{
508 printf_filtered ("The %s is %ld. ", config->name, config->size);
509 if (config->fixed_p)
510 printf_filtered ("Packets are fixed at %ld bytes.\n",
511 get_memory_packet_size (config));
512 else
513 printf_filtered ("Packets are limited to %ld bytes.\n",
514 get_memory_packet_size (config));
515}
516
517static struct memory_packet_config memory_write_packet_config =
518{
519 "memory-write-packet-size",
520};
521
522static void
523set_memory_write_packet_size (char *args, int from_tty)
524{
525 set_memory_packet_size (args, &memory_write_packet_config);
526}
527
528static void
529show_memory_write_packet_size (char *args, int from_tty)
530{
531 show_memory_packet_size (&memory_write_packet_config);
532}
533
534static long
535get_memory_write_packet_size (void)
536{
537 return get_memory_packet_size (&memory_write_packet_config);
538}
539
540static struct memory_packet_config memory_read_packet_config =
541{
542 "memory-read-packet-size",
543};
544
545static void
546set_memory_read_packet_size (char *args, int from_tty)
547{
548 set_memory_packet_size (args, &memory_read_packet_config);
549}
550
551static void
552show_memory_read_packet_size (char *args, int from_tty)
553{
554 show_memory_packet_size (&memory_read_packet_config);
555}
556
557static long
558get_memory_read_packet_size (void)
559{
d01949b6 560 struct remote_state *rs = get_remote_state ();
11cf8741
JM
561 long size = get_memory_packet_size (&memory_read_packet_config);
562 /* FIXME: cagney/1999-11-07: Functions like getpkt() need to get an
563 extra buffer size argument before the memory read size can be
d01949b6
AC
564 increased beyond (rs->remote_packet_size). */
565 if (size > (rs->remote_packet_size))
566 size = (rs->remote_packet_size);
11cf8741
JM
567 return size;
568}
569
11cf8741 570\f
5a2468f5
JM
571/* Generic configuration support for packets the stub optionally
572 supports. Allows the user to specify the use of the packet as well
573 as allowing GDB to auto-detect support in the remote stub. */
574
575enum packet_support
576 {
577 PACKET_SUPPORT_UNKNOWN = 0,
578 PACKET_ENABLE,
579 PACKET_DISABLE
580 };
581
5a2468f5
JM
582struct packet_config
583 {
5a2468f5
JM
584 char *name;
585 char *title;
8e248173 586 enum cmd_auto_boolean detect;
5a2468f5
JM
587 enum packet_support support;
588 };
589
d471ea57
AC
590/* Analyze a packet's return value and update the packet config
591 accordingly. */
592
593enum packet_result
594{
595 PACKET_ERROR,
596 PACKET_OK,
597 PACKET_UNKNOWN
598};
599
5a2468f5 600static void
d471ea57 601update_packet_config (struct packet_config *config)
5a2468f5 602{
d471ea57
AC
603 switch (config->detect)
604 {
605 case CMD_AUTO_BOOLEAN_TRUE:
606 config->support = PACKET_ENABLE;
607 break;
608 case CMD_AUTO_BOOLEAN_FALSE:
609 config->support = PACKET_DISABLE;
610 break;
611 case CMD_AUTO_BOOLEAN_AUTO:
612 config->support = PACKET_SUPPORT_UNKNOWN;
613 break;
614 }
5a2468f5
JM
615}
616
617static void
fba45db2 618show_packet_config_cmd (struct packet_config *config)
5a2468f5
JM
619{
620 char *support = "internal-error";
621 switch (config->support)
622 {
623 case PACKET_ENABLE:
624 support = "enabled";
625 break;
626 case PACKET_DISABLE:
627 support = "disabled";
628 break;
629 case PACKET_SUPPORT_UNKNOWN:
630 support = "unknown";
631 break;
632 }
633 switch (config->detect)
634 {
8e248173 635 case CMD_AUTO_BOOLEAN_AUTO:
5a2468f5
JM
636 printf_filtered ("Support for remote protocol `%s' (%s) packet is auto-detected, currently %s.\n",
637 config->name, config->title, support);
638 break;
8e248173
AC
639 case CMD_AUTO_BOOLEAN_TRUE:
640 case CMD_AUTO_BOOLEAN_FALSE:
641 printf_filtered ("Support for remote protocol `%s' (%s) packet is currently %s.\n",
5a2468f5 642 config->name, config->title, support);
8e248173 643 break;
5a2468f5
JM
644 }
645}
646
647static void
d471ea57
AC
648add_packet_config_cmd (struct packet_config *config,
649 char *name,
650 char *title,
651 void (*set_func) (char *args, int from_tty,
652 struct cmd_list_element *
653 c),
654 void (*show_func) (char *name,
655 int from_tty),
656 struct cmd_list_element **set_remote_list,
657 struct cmd_list_element **show_remote_list,
658 int legacy)
659{
660 struct cmd_list_element *set_cmd;
661 struct cmd_list_element *show_cmd;
5a2468f5
JM
662 char *set_doc;
663 char *show_doc;
d471ea57 664 char *cmd_name;
5a2468f5
JM
665 config->name = name;
666 config->title = title;
8e248173
AC
667 config->detect = CMD_AUTO_BOOLEAN_AUTO;
668 config->support = PACKET_SUPPORT_UNKNOWN;
76995688
AC
669 xasprintf (&set_doc, "Set use of remote protocol `%s' (%s) packet",
670 name, title);
671 xasprintf (&show_doc, "Show current use of remote protocol `%s' (%s) packet",
672 name, title);
d471ea57 673 /* set/show TITLE-packet {auto,on,off} */
76995688 674 xasprintf (&cmd_name, "%s-packet", title);
d471ea57
AC
675 set_cmd = add_set_auto_boolean_cmd (cmd_name, class_obscure,
676 &config->detect, set_doc,
677 set_remote_list);
9f60d481 678 set_cmd_sfunc (set_cmd, set_func);
d471ea57
AC
679 show_cmd = add_cmd (cmd_name, class_obscure, show_func, show_doc,
680 show_remote_list);
681 /* set/show remote NAME-packet {auto,on,off} -- legacy */
682 if (legacy)
683 {
684 char *legacy_name;
76995688 685 xasprintf (&legacy_name, "%s-packet", name);
d471ea57
AC
686 add_alias_cmd (legacy_name, cmd_name, class_obscure, 0,
687 set_remote_list);
688 add_alias_cmd (legacy_name, cmd_name, class_obscure, 0,
689 show_remote_list);
690 }
5a2468f5
JM
691}
692
d471ea57
AC
693static enum packet_result
694packet_ok (const char *buf, struct packet_config *config)
5a2468f5 695{
d471ea57 696 if (buf[0] != '\0')
5a2468f5 697 {
d471ea57
AC
698 /* The stub recognized the packet request. Check that the
699 operation succeeded. */
700 switch (config->support)
701 {
702 case PACKET_SUPPORT_UNKNOWN:
703 if (remote_debug)
704 fprintf_unfiltered (gdb_stdlog,
705 "Packet %s (%s) is supported\n",
706 config->name, config->title);
707 config->support = PACKET_ENABLE;
708 break;
709 case PACKET_DISABLE:
8e65ff28
AC
710 internal_error (__FILE__, __LINE__,
711 "packet_ok: attempt to use a disabled packet");
d471ea57
AC
712 break;
713 case PACKET_ENABLE:
714 break;
715 }
716 if (buf[0] == 'O' && buf[1] == 'K' && buf[2] == '\0')
717 /* "OK" - definitly OK. */
718 return PACKET_OK;
719 if (buf[0] == 'E'
720 && isxdigit (buf[1]) && isxdigit (buf[2])
721 && buf[3] == '\0')
722 /* "Enn" - definitly an error. */
723 return PACKET_ERROR;
724 /* The packet may or may not be OK. Just assume it is */
725 return PACKET_OK;
726 }
727 else
728 {
729 /* The stub does not support the packet. */
730 switch (config->support)
731 {
732 case PACKET_ENABLE:
733 if (config->detect == CMD_AUTO_BOOLEAN_AUTO)
734 /* If the stub previously indicated that the packet was
735 supported then there is a protocol error.. */
736 error ("Protocol error: %s (%s) conflicting enabled responses.",
737 config->name, config->title);
738 else
739 /* The user set it wrong. */
740 error ("Enabled packet %s (%s) not recognized by stub",
741 config->name, config->title);
742 break;
743 case PACKET_SUPPORT_UNKNOWN:
744 if (remote_debug)
745 fprintf_unfiltered (gdb_stdlog,
746 "Packet %s (%s) is NOT supported\n",
747 config->name, config->title);
748 config->support = PACKET_DISABLE;
749 break;
750 case PACKET_DISABLE:
751 break;
752 }
753 return PACKET_UNKNOWN;
5a2468f5
JM
754 }
755}
756
dc8acb97
MS
757/* Should we try the 'qSymbol' (target symbol lookup service) request? */
758static struct packet_config remote_protocol_qSymbol;
759
760static void
761set_remote_protocol_qSymbol_packet_cmd (char *args, int from_tty,
762 struct cmd_list_element *c)
763{
764 update_packet_config (&remote_protocol_qSymbol);
765}
766
767static void
768show_remote_protocol_qSymbol_packet_cmd (char *args, int from_tty)
769{
770 show_packet_config_cmd (&remote_protocol_qSymbol);
771}
772
44eaed12
C
773/* Should we try the 'e' (step over range) request? */
774static struct packet_config remote_protocol_e;
775
776static void
777set_remote_protocol_e_packet_cmd (char *args, int from_tty,
778 struct cmd_list_element *c)
779{
780 update_packet_config (&remote_protocol_e);
781}
782
783static void
784show_remote_protocol_e_packet_cmd (char *args, int from_tty)
785{
786 show_packet_config_cmd (&remote_protocol_e);
787}
788
789
790/* Should we try the 'E' (step over range / w signal #) request? */
791static struct packet_config remote_protocol_E;
792
793static void
794set_remote_protocol_E_packet_cmd (char *args, int from_tty,
795 struct cmd_list_element *c)
796{
797 update_packet_config (&remote_protocol_E);
798}
799
800static void
801show_remote_protocol_E_packet_cmd (char *args, int from_tty)
802{
803 show_packet_config_cmd (&remote_protocol_E);
804}
805
806
5a2468f5
JM
807/* Should we try the 'P' (set register) request? */
808
809static struct packet_config remote_protocol_P;
810
811static void
fba45db2
KB
812set_remote_protocol_P_packet_cmd (char *args, int from_tty,
813 struct cmd_list_element *c)
5a2468f5 814{
d471ea57 815 update_packet_config (&remote_protocol_P);
5a2468f5
JM
816}
817
818static void
fba45db2 819show_remote_protocol_P_packet_cmd (char *args, int from_tty)
5a2468f5
JM
820{
821 show_packet_config_cmd (&remote_protocol_P);
822}
823
d471ea57
AC
824/* Should we try one of the 'Z' requests? */
825
826enum Z_packet_type
827{
828 Z_PACKET_SOFTWARE_BP,
829 Z_PACKET_HARDWARE_BP,
830 Z_PACKET_WRITE_WP,
831 Z_PACKET_READ_WP,
832 Z_PACKET_ACCESS_WP,
833 NR_Z_PACKET_TYPES
834};
96baa820 835
d471ea57
AC
836static struct packet_config remote_protocol_Z[NR_Z_PACKET_TYPES];
837
838/* FIXME: Instead of having all these boiler plate functions, the
839 command callback should include a context argument. */
840
841static void
842set_remote_protocol_Z_software_bp_packet_cmd (char *args, int from_tty,
843 struct cmd_list_element *c)
844{
845 update_packet_config (&remote_protocol_Z[Z_PACKET_SOFTWARE_BP]);
846}
847
848static void
849show_remote_protocol_Z_software_bp_packet_cmd (char *args, int from_tty)
850{
851 show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_SOFTWARE_BP]);
852}
853
854static void
855set_remote_protocol_Z_hardware_bp_packet_cmd (char *args, int from_tty,
856 struct cmd_list_element *c)
857{
858 update_packet_config (&remote_protocol_Z[Z_PACKET_HARDWARE_BP]);
859}
860
861static void
862show_remote_protocol_Z_hardware_bp_packet_cmd (char *args, int from_tty)
863{
864 show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_HARDWARE_BP]);
865}
866
867static void
868set_remote_protocol_Z_write_wp_packet_cmd (char *args, int from_tty,
869 struct cmd_list_element *c)
870{
871 update_packet_config (&remote_protocol_Z[Z_PACKET_WRITE_WP]);
872}
873
874static void
875show_remote_protocol_Z_write_wp_packet_cmd (char *args, int from_tty)
876{
877 show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_WRITE_WP]);
878}
879
880static void
881set_remote_protocol_Z_read_wp_packet_cmd (char *args, int from_tty,
882 struct cmd_list_element *c)
883{
884 update_packet_config (&remote_protocol_Z[Z_PACKET_READ_WP]);
885}
886
887static void
888show_remote_protocol_Z_read_wp_packet_cmd (char *args, int from_tty)
889{
890 show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_READ_WP]);
891}
892
893static void
894set_remote_protocol_Z_access_wp_packet_cmd (char *args, int from_tty,
895 struct cmd_list_element *c)
896{
897 update_packet_config (&remote_protocol_Z[Z_PACKET_ACCESS_WP]);
898}
899
900static void
901show_remote_protocol_Z_access_wp_packet_cmd (char *args, int from_tty)
902{
903 show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_ACCESS_WP]);
904}
905
906/* For compatibility with older distributions. Provide a ``set remote
907 Z-packet ...'' command that updates all the Z packet types. */
908
909static enum cmd_auto_boolean remote_Z_packet_detect;
96baa820
JM
910
911static void
fba45db2
KB
912set_remote_protocol_Z_packet_cmd (char *args, int from_tty,
913 struct cmd_list_element *c)
96baa820 914{
d471ea57
AC
915 int i;
916 for (i = 0; i < NR_Z_PACKET_TYPES; i++)
917 {
918 remote_protocol_Z[i].detect = remote_Z_packet_detect;
919 update_packet_config (&remote_protocol_Z[i]);
920 }
96baa820
JM
921}
922
923static void
fba45db2 924show_remote_protocol_Z_packet_cmd (char *args, int from_tty)
96baa820 925{
d471ea57
AC
926 int i;
927 for (i = 0; i < NR_Z_PACKET_TYPES; i++)
928 {
929 show_packet_config_cmd (&remote_protocol_Z[i]);
930 }
96baa820
JM
931}
932
933/* Should we try the 'X' (remote binary download) packet?
934
935 This variable (available to the user via "set remote X-packet")
936 dictates whether downloads are sent in binary (via the 'X' packet).
937 We assume that the stub can, and attempt to do it. This will be
938 cleared if the stub does not understand it. This switch is still
939 needed, though in cases when the packet is supported in the stub,
940 but the connection does not allow it (i.e., 7-bit serial connection
941 only). */
942
943static struct packet_config remote_protocol_binary_download;
944
9d1f7ab2
MS
945/* Should we try the 'ThreadInfo' query packet?
946
947 This variable (NOT available to the user: auto-detect only!)
948 determines whether GDB will use the new, simpler "ThreadInfo"
949 query or the older, more complex syntax for thread queries.
950 This is an auto-detect variable (set to true at each connect,
951 and set to false when the target fails to recognize it). */
952
953static int use_threadinfo_query;
954static int use_threadextra_query;
955
96baa820
JM
956static void
957set_remote_protocol_binary_download_cmd (char *args,
958 int from_tty,
959 struct cmd_list_element *c)
960{
d471ea57 961 update_packet_config (&remote_protocol_binary_download);
96baa820
JM
962}
963
964static void
965show_remote_protocol_binary_download_cmd (char *args,
966 int from_tty)
967{
968 show_packet_config_cmd (&remote_protocol_binary_download);
969}
970
c906108c 971
43ff13b4 972/* Tokens for use by the asynchronous signal handlers for SIGINT */
ae44c0c4
AC
973static void *sigint_remote_twice_token;
974static void *sigint_remote_token;
43ff13b4 975
c906108c
SS
976/* These are pointers to hook functions that may be set in order to
977 modify resume/wait behavior for a particular architecture. */
978
507f3c78
KB
979void (*target_resume_hook) (void);
980void (*target_wait_loop_hook) (void);
c906108c
SS
981\f
982
c5aa993b 983
c906108c
SS
984/* These are the threads which we last sent to the remote system.
985 -1 for all or -2 for not sent yet. */
986static int general_thread;
cce74817 987static int continue_thread;
c906108c
SS
988
989/* Call this function as a result of
990 1) A halt indication (T packet) containing a thread id
991 2) A direct query of currthread
992 3) Successful execution of set thread
993 */
994
995static void
fba45db2 996record_currthread (int currthread)
c906108c 997{
c906108c 998 general_thread = currthread;
cce74817 999
c906108c
SS
1000 /* If this is a new thread, add it to GDB's thread list.
1001 If we leave it up to WFI to do this, bad things will happen. */
39f77062 1002 if (!in_thread_list (pid_to_ptid (currthread)))
0f71a2f6 1003 {
39f77062 1004 add_thread (pid_to_ptid (currthread));
8b93c638 1005 ui_out_text (uiout, "[New ");
39f77062 1006 ui_out_text (uiout, target_pid_to_str (pid_to_ptid (currthread)));
8b93c638 1007 ui_out_text (uiout, "]\n");
0f71a2f6 1008 }
c906108c
SS
1009}
1010
1011#define MAGIC_NULL_PID 42000
1012
1013static void
fba45db2 1014set_thread (int th, int gen)
c906108c 1015{
d01949b6
AC
1016 struct remote_state *rs = get_remote_state ();
1017 char *buf = alloca (rs->remote_packet_size);
cce74817 1018 int state = gen ? general_thread : continue_thread;
c906108c
SS
1019
1020 if (state == th)
1021 return;
1022
1023 buf[0] = 'H';
1024 buf[1] = gen ? 'g' : 'c';
1025 if (th == MAGIC_NULL_PID)
1026 {
1027 buf[2] = '0';
1028 buf[3] = '\0';
1029 }
1030 else if (th < 0)
1031 sprintf (&buf[2], "-%x", -th);
1032 else
1033 sprintf (&buf[2], "%x", th);
1034 putpkt (buf);
d01949b6 1035 getpkt (buf, (rs->remote_packet_size), 0);
c906108c 1036 if (gen)
c5aa993b 1037 general_thread = th;
c906108c 1038 else
cce74817 1039 continue_thread = th;
c906108c
SS
1040}
1041\f
1042/* Return nonzero if the thread TH is still alive on the remote system. */
1043
1044static int
39f77062 1045remote_thread_alive (ptid_t ptid)
c906108c 1046{
39f77062 1047 int tid = PIDGET (ptid);
cce74817 1048 char buf[16];
c906108c 1049
cce74817
JM
1050 if (tid < 0)
1051 sprintf (buf, "T-%08x", -tid);
c906108c 1052 else
cce74817 1053 sprintf (buf, "T%08x", tid);
c906108c 1054 putpkt (buf);
c2d11a7d 1055 getpkt (buf, sizeof (buf), 0);
c906108c
SS
1056 return (buf[0] == 'O' && buf[1] == 'K');
1057}
1058
1059/* About these extended threadlist and threadinfo packets. They are
1060 variable length packets but, the fields within them are often fixed
1061 length. They are redundent enough to send over UDP as is the
1062 remote protocol in general. There is a matching unit test module
1063 in libstub. */
1064
cce74817
JM
1065#define OPAQUETHREADBYTES 8
1066
1067/* a 64 bit opaque identifier */
1068typedef unsigned char threadref[OPAQUETHREADBYTES];
1069
1070/* WARNING: This threadref data structure comes from the remote O.S., libstub
1071 protocol encoding, and remote.c. it is not particularly changable */
1072
1073/* Right now, the internal structure is int. We want it to be bigger.
1074 Plan to fix this.
c5aa993b 1075 */
cce74817 1076
c5aa993b 1077typedef int gdb_threadref; /* internal GDB thread reference */
cce74817 1078
9d1f7ab2 1079/* gdb_ext_thread_info is an internal GDB data structure which is
cce74817
JM
1080 equivalint to the reply of the remote threadinfo packet */
1081
1082struct gdb_ext_thread_info
c5aa993b
JM
1083 {
1084 threadref threadid; /* External form of thread reference */
1085 int active; /* Has state interesting to GDB? , regs, stack */
1086 char display[256]; /* Brief state display, name, blocked/syspended */
1087 char shortname[32]; /* To be used to name threads */
1088 char more_display[256]; /* Long info, statistics, queue depth, whatever */
1089 };
cce74817
JM
1090
1091/* The volume of remote transfers can be limited by submitting
1092 a mask containing bits specifying the desired information.
1093 Use a union of these values as the 'selection' parameter to
1094 get_thread_info. FIXME: Make these TAG names more thread specific.
c5aa993b 1095 */
cce74817
JM
1096
1097#define TAG_THREADID 1
1098#define TAG_EXISTS 2
1099#define TAG_DISPLAY 4
1100#define TAG_THREADNAME 8
c5aa993b 1101#define TAG_MOREDISPLAY 16
cce74817 1102
c906108c
SS
1103#define BUF_THREAD_ID_SIZE (OPAQUETHREADBYTES*2)
1104
a14ed312 1105char *unpack_varlen_hex (char *buff, int *result);
cce74817 1106
a14ed312 1107static char *unpack_nibble (char *buf, int *val);
cce74817 1108
a14ed312 1109static char *pack_nibble (char *buf, int nibble);
cce74817 1110
a14ed312 1111static char *pack_hex_byte (char *pkt, int /*unsigned char */ byte);
cce74817 1112
a14ed312 1113static char *unpack_byte (char *buf, int *value);
cce74817 1114
a14ed312 1115static char *pack_int (char *buf, int value);
cce74817 1116
a14ed312 1117static char *unpack_int (char *buf, int *value);
cce74817 1118
a14ed312 1119static char *unpack_string (char *src, char *dest, int length);
cce74817 1120
a14ed312 1121static char *pack_threadid (char *pkt, threadref * id);
cce74817 1122
a14ed312 1123static char *unpack_threadid (char *inbuf, threadref * id);
cce74817 1124
a14ed312 1125void int_to_threadref (threadref * id, int value);
cce74817 1126
a14ed312 1127static int threadref_to_int (threadref * ref);
cce74817 1128
a14ed312 1129static void copy_threadref (threadref * dest, threadref * src);
cce74817 1130
a14ed312 1131static int threadmatch (threadref * dest, threadref * src);
cce74817 1132
a14ed312 1133static char *pack_threadinfo_request (char *pkt, int mode, threadref * id);
cce74817 1134
a14ed312
KB
1135static int remote_unpack_thread_info_response (char *pkt,
1136 threadref * expectedref,
1137 struct gdb_ext_thread_info
1138 *info);
cce74817
JM
1139
1140
a14ed312
KB
1141static int remote_get_threadinfo (threadref * threadid, int fieldset, /*TAG mask */
1142 struct gdb_ext_thread_info *info);
cce74817 1143
a14ed312
KB
1144static int adapt_remote_get_threadinfo (gdb_threadref * ref,
1145 int selection,
1146 struct gdb_ext_thread_info *info);
cce74817 1147
a14ed312
KB
1148static char *pack_threadlist_request (char *pkt, int startflag,
1149 int threadcount,
1150 threadref * nextthread);
cce74817 1151
a14ed312
KB
1152static int parse_threadlist_response (char *pkt,
1153 int result_limit,
1154 threadref * original_echo,
1155 threadref * resultlist, int *doneflag);
cce74817 1156
a14ed312
KB
1157static int remote_get_threadlist (int startflag,
1158 threadref * nextthread,
1159 int result_limit,
1160 int *done,
1161 int *result_count, threadref * threadlist);
cce74817 1162
c5aa993b 1163typedef int (*rmt_thread_action) (threadref * ref, void *context);
cce74817 1164
a14ed312
KB
1165static int remote_threadlist_iterator (rmt_thread_action stepfunction,
1166 void *context, int looplimit);
cce74817 1167
a14ed312 1168static int remote_newthread_step (threadref * ref, void *context);
cce74817 1169
c906108c
SS
1170/* encode 64 bits in 16 chars of hex */
1171
1172static const char hexchars[] = "0123456789abcdef";
1173
1174static int
fba45db2 1175ishex (int ch, int *val)
c906108c
SS
1176{
1177 if ((ch >= 'a') && (ch <= 'f'))
1178 {
1179 *val = ch - 'a' + 10;
1180 return 1;
1181 }
1182 if ((ch >= 'A') && (ch <= 'F'))
1183 {
1184 *val = ch - 'A' + 10;
1185 return 1;
1186 }
1187 if ((ch >= '0') && (ch <= '9'))
1188 {
1189 *val = ch - '0';
1190 return 1;
1191 }
1192 return 0;
1193}
1194
1195static int
fba45db2 1196stubhex (int ch)
c906108c
SS
1197{
1198 if (ch >= 'a' && ch <= 'f')
1199 return ch - 'a' + 10;
1200 if (ch >= '0' && ch <= '9')
1201 return ch - '0';
1202 if (ch >= 'A' && ch <= 'F')
1203 return ch - 'A' + 10;
1204 return -1;
1205}
1206
1207static int
fba45db2 1208stub_unpack_int (char *buff, int fieldlength)
c906108c
SS
1209{
1210 int nibble;
1211 int retval = 0;
1212
1213 while (fieldlength)
1214 {
1215 nibble = stubhex (*buff++);
1216 retval |= nibble;
1217 fieldlength--;
1218 if (fieldlength)
1219 retval = retval << 4;
1220 }
1221 return retval;
1222}
1223
1224char *
fba45db2
KB
1225unpack_varlen_hex (char *buff, /* packet to parse */
1226 int *result)
c906108c
SS
1227{
1228 int nibble;
1229 int retval = 0;
1230
1231 while (ishex (*buff, &nibble))
1232 {
1233 buff++;
1234 retval = retval << 4;
1235 retval |= nibble & 0x0f;
1236 }
1237 *result = retval;
1238 return buff;
1239}
1240
1241static char *
fba45db2 1242unpack_nibble (char *buf, int *val)
c906108c
SS
1243{
1244 ishex (*buf++, val);
1245 return buf;
1246}
1247
1248static char *
fba45db2 1249pack_nibble (char *buf, int nibble)
c906108c
SS
1250{
1251 *buf++ = hexchars[(nibble & 0x0f)];
1252 return buf;
1253}
1254
1255static char *
fba45db2 1256pack_hex_byte (char *pkt, int byte)
c906108c
SS
1257{
1258 *pkt++ = hexchars[(byte >> 4) & 0xf];
1259 *pkt++ = hexchars[(byte & 0xf)];
1260 return pkt;
1261}
1262
1263static char *
fba45db2 1264unpack_byte (char *buf, int *value)
c906108c
SS
1265{
1266 *value = stub_unpack_int (buf, 2);
1267 return buf + 2;
1268}
1269
1270static char *
fba45db2 1271pack_int (char *buf, int value)
c906108c
SS
1272{
1273 buf = pack_hex_byte (buf, (value >> 24) & 0xff);
1274 buf = pack_hex_byte (buf, (value >> 16) & 0xff);
1275 buf = pack_hex_byte (buf, (value >> 8) & 0x0ff);
1276 buf = pack_hex_byte (buf, (value & 0xff));
1277 return buf;
1278}
1279
1280static char *
fba45db2 1281unpack_int (char *buf, int *value)
c906108c
SS
1282{
1283 *value = stub_unpack_int (buf, 8);
1284 return buf + 8;
1285}
1286
c5aa993b 1287#if 0 /* currently unused, uncomment when needed */
a14ed312 1288static char *pack_string (char *pkt, char *string);
c906108c
SS
1289
1290static char *
fba45db2 1291pack_string (char *pkt, char *string)
c906108c
SS
1292{
1293 char ch;
1294 int len;
1295
1296 len = strlen (string);
1297 if (len > 200)
1298 len = 200; /* Bigger than most GDB packets, junk??? */
1299 pkt = pack_hex_byte (pkt, len);
1300 while (len-- > 0)
1301 {
1302 ch = *string++;
1303 if ((ch == '\0') || (ch == '#'))
1304 ch = '*'; /* Protect encapsulation */
1305 *pkt++ = ch;
1306 }
1307 return pkt;
1308}
1309#endif /* 0 (unused) */
1310
1311static char *
fba45db2 1312unpack_string (char *src, char *dest, int length)
c906108c
SS
1313{
1314 while (length--)
1315 *dest++ = *src++;
1316 *dest = '\0';
1317 return src;
1318}
1319
1320static char *
fba45db2 1321pack_threadid (char *pkt, threadref *id)
c906108c
SS
1322{
1323 char *limit;
1324 unsigned char *altid;
1325
1326 altid = (unsigned char *) id;
1327 limit = pkt + BUF_THREAD_ID_SIZE;
1328 while (pkt < limit)
1329 pkt = pack_hex_byte (pkt, *altid++);
1330 return pkt;
1331}
1332
1333
1334static char *
fba45db2 1335unpack_threadid (char *inbuf, threadref *id)
c906108c
SS
1336{
1337 char *altref;
1338 char *limit = inbuf + BUF_THREAD_ID_SIZE;
1339 int x, y;
1340
1341 altref = (char *) id;
1342
1343 while (inbuf < limit)
1344 {
1345 x = stubhex (*inbuf++);
1346 y = stubhex (*inbuf++);
1347 *altref++ = (x << 4) | y;
1348 }
1349 return inbuf;
1350}
1351
1352/* Externally, threadrefs are 64 bits but internally, they are still
1353 ints. This is due to a mismatch of specifications. We would like
1354 to use 64bit thread references internally. This is an adapter
1355 function. */
1356
1357void
fba45db2 1358int_to_threadref (threadref *id, int value)
c906108c
SS
1359{
1360 unsigned char *scan;
1361
1362 scan = (unsigned char *) id;
1363 {
1364 int i = 4;
1365 while (i--)
1366 *scan++ = 0;
1367 }
1368 *scan++ = (value >> 24) & 0xff;
1369 *scan++ = (value >> 16) & 0xff;
1370 *scan++ = (value >> 8) & 0xff;
1371 *scan++ = (value & 0xff);
1372}
1373
1374static int
fba45db2 1375threadref_to_int (threadref *ref)
c906108c
SS
1376{
1377 int i, value = 0;
1378 unsigned char *scan;
1379
1380 scan = (char *) ref;
1381 scan += 4;
1382 i = 4;
1383 while (i-- > 0)
1384 value = (value << 8) | ((*scan++) & 0xff);
1385 return value;
1386}
1387
1388static void
fba45db2 1389copy_threadref (threadref *dest, threadref *src)
c906108c
SS
1390{
1391 int i;
1392 unsigned char *csrc, *cdest;
1393
1394 csrc = (unsigned char *) src;
1395 cdest = (unsigned char *) dest;
1396 i = 8;
1397 while (i--)
1398 *cdest++ = *csrc++;
1399}
1400
1401static int
fba45db2 1402threadmatch (threadref *dest, threadref *src)
c906108c
SS
1403{
1404 /* things are broken right now, so just assume we got a match */
1405#if 0
1406 unsigned char *srcp, *destp;
1407 int i, result;
1408 srcp = (char *) src;
1409 destp = (char *) dest;
1410
1411 result = 1;
1412 while (i-- > 0)
1413 result &= (*srcp++ == *destp++) ? 1 : 0;
1414 return result;
1415#endif
1416 return 1;
1417}
1418
1419/*
c5aa993b
JM
1420 threadid:1, # always request threadid
1421 context_exists:2,
1422 display:4,
1423 unique_name:8,
1424 more_display:16
1425 */
c906108c
SS
1426
1427/* Encoding: 'Q':8,'P':8,mask:32,threadid:64 */
1428
1429static char *
fba45db2 1430pack_threadinfo_request (char *pkt, int mode, threadref *id)
c906108c
SS
1431{
1432 *pkt++ = 'q'; /* Info Query */
1433 *pkt++ = 'P'; /* process or thread info */
1434 pkt = pack_int (pkt, mode); /* mode */
1435 pkt = pack_threadid (pkt, id); /* threadid */
1436 *pkt = '\0'; /* terminate */
1437 return pkt;
1438}
1439
1440/* These values tag the fields in a thread info response packet */
1441/* Tagging the fields allows us to request specific fields and to
1442 add more fields as time goes by */
1443
c5aa993b
JM
1444#define TAG_THREADID 1 /* Echo the thread identifier */
1445#define TAG_EXISTS 2 /* Is this process defined enough to
1446 fetch registers and its stack */
1447#define TAG_DISPLAY 4 /* A short thing maybe to put on a window */
1448#define TAG_THREADNAME 8 /* string, maps 1-to-1 with a thread is */
1449#define TAG_MOREDISPLAY 16 /* Whatever the kernel wants to say about
1450 the process */
c906108c
SS
1451
1452static int
fba45db2
KB
1453remote_unpack_thread_info_response (char *pkt, threadref *expectedref,
1454 struct gdb_ext_thread_info *info)
c906108c 1455{
d01949b6 1456 struct remote_state *rs = get_remote_state ();
c906108c
SS
1457 int mask, length;
1458 unsigned int tag;
1459 threadref ref;
d01949b6 1460 char *limit = pkt + (rs->remote_packet_size); /* plausable parsing limit */
c906108c
SS
1461 int retval = 1;
1462
1463 /* info->threadid = 0; FIXME: implement zero_threadref */
1464 info->active = 0;
1465 info->display[0] = '\0';
1466 info->shortname[0] = '\0';
1467 info->more_display[0] = '\0';
1468
1469 /* Assume the characters indicating the packet type have been stripped */
1470 pkt = unpack_int (pkt, &mask); /* arg mask */
1471 pkt = unpack_threadid (pkt, &ref);
1472
1473 if (mask == 0)
1474 warning ("Incomplete response to threadinfo request\n");
1475 if (!threadmatch (&ref, expectedref))
1476 { /* This is an answer to a different request */
1477 warning ("ERROR RMT Thread info mismatch\n");
1478 return 0;
1479 }
1480 copy_threadref (&info->threadid, &ref);
1481
1482 /* Loop on tagged fields , try to bail if somthing goes wrong */
1483
c5aa993b 1484 while ((pkt < limit) && mask && *pkt) /* packets are terminated with nulls */
c906108c
SS
1485 {
1486 pkt = unpack_int (pkt, &tag); /* tag */
1487 pkt = unpack_byte (pkt, &length); /* length */
1488 if (!(tag & mask)) /* tags out of synch with mask */
1489 {
1490 warning ("ERROR RMT: threadinfo tag mismatch\n");
1491 retval = 0;
1492 break;
1493 }
1494 if (tag == TAG_THREADID)
1495 {
1496 if (length != 16)
1497 {
1498 warning ("ERROR RMT: length of threadid is not 16\n");
1499 retval = 0;
1500 break;
1501 }
1502 pkt = unpack_threadid (pkt, &ref);
1503 mask = mask & ~TAG_THREADID;
1504 continue;
1505 }
1506 if (tag == TAG_EXISTS)
1507 {
1508 info->active = stub_unpack_int (pkt, length);
1509 pkt += length;
1510 mask = mask & ~(TAG_EXISTS);
1511 if (length > 8)
1512 {
1513 warning ("ERROR RMT: 'exists' length too long\n");
1514 retval = 0;
1515 break;
1516 }
1517 continue;
1518 }
1519 if (tag == TAG_THREADNAME)
1520 {
1521 pkt = unpack_string (pkt, &info->shortname[0], length);
1522 mask = mask & ~TAG_THREADNAME;
1523 continue;
1524 }
1525 if (tag == TAG_DISPLAY)
1526 {
1527 pkt = unpack_string (pkt, &info->display[0], length);
1528 mask = mask & ~TAG_DISPLAY;
1529 continue;
1530 }
1531 if (tag == TAG_MOREDISPLAY)
1532 {
1533 pkt = unpack_string (pkt, &info->more_display[0], length);
1534 mask = mask & ~TAG_MOREDISPLAY;
1535 continue;
1536 }
1537 warning ("ERROR RMT: unknown thread info tag\n");
1538 break; /* Not a tag we know about */
1539 }
1540 return retval;
1541}
1542
1543static int
fba45db2
KB
1544remote_get_threadinfo (threadref *threadid, int fieldset, /* TAG mask */
1545 struct gdb_ext_thread_info *info)
c906108c 1546{
d01949b6 1547 struct remote_state *rs = get_remote_state ();
c906108c 1548 int result;
d01949b6 1549 char *threadinfo_pkt = alloca (rs->remote_packet_size);
c906108c
SS
1550
1551 pack_threadinfo_request (threadinfo_pkt, fieldset, threadid);
1552 putpkt (threadinfo_pkt);
d01949b6 1553 getpkt (threadinfo_pkt, (rs->remote_packet_size), 0);
c906108c
SS
1554 result = remote_unpack_thread_info_response (threadinfo_pkt + 2, threadid,
1555 info);
1556 return result;
1557}
1558
1559/* Unfortunately, 61 bit thread-ids are bigger than the internal
1560 representation of a threadid. */
1561
1562static int
fba45db2
KB
1563adapt_remote_get_threadinfo (gdb_threadref *ref, int selection,
1564 struct gdb_ext_thread_info *info)
c906108c
SS
1565{
1566 threadref lclref;
1567
1568 int_to_threadref (&lclref, *ref);
1569 return remote_get_threadinfo (&lclref, selection, info);
1570}
1571
1572/* Format: i'Q':8,i"L":8,initflag:8,batchsize:16,lastthreadid:32 */
1573
1574static char *
fba45db2
KB
1575pack_threadlist_request (char *pkt, int startflag, int threadcount,
1576 threadref *nextthread)
c906108c
SS
1577{
1578 *pkt++ = 'q'; /* info query packet */
1579 *pkt++ = 'L'; /* Process LIST or threadLIST request */
1580 pkt = pack_nibble (pkt, startflag); /* initflag 1 bytes */
1581 pkt = pack_hex_byte (pkt, threadcount); /* threadcount 2 bytes */
1582 pkt = pack_threadid (pkt, nextthread); /* 64 bit thread identifier */
1583 *pkt = '\0';
1584 return pkt;
1585}
1586
1587/* Encoding: 'q':8,'M':8,count:16,done:8,argthreadid:64,(threadid:64)* */
1588
1589static int
fba45db2
KB
1590parse_threadlist_response (char *pkt, int result_limit,
1591 threadref *original_echo, threadref *resultlist,
1592 int *doneflag)
c906108c 1593{
d01949b6 1594 struct remote_state *rs = get_remote_state ();
c906108c
SS
1595 char *limit;
1596 int count, resultcount, done;
1597
1598 resultcount = 0;
1599 /* Assume the 'q' and 'M chars have been stripped. */
d01949b6 1600 limit = pkt + ((rs->remote_packet_size) - BUF_THREAD_ID_SIZE); /* done parse past here */
c906108c
SS
1601 pkt = unpack_byte (pkt, &count); /* count field */
1602 pkt = unpack_nibble (pkt, &done);
1603 /* The first threadid is the argument threadid. */
1604 pkt = unpack_threadid (pkt, original_echo); /* should match query packet */
1605 while ((count-- > 0) && (pkt < limit))
1606 {
1607 pkt = unpack_threadid (pkt, resultlist++);
1608 if (resultcount++ >= result_limit)
1609 break;
1610 }
1611 if (doneflag)
1612 *doneflag = done;
1613 return resultcount;
1614}
1615
1616static int
fba45db2
KB
1617remote_get_threadlist (int startflag, threadref *nextthread, int result_limit,
1618 int *done, int *result_count, threadref *threadlist)
c906108c 1619{
d01949b6 1620 struct remote_state *rs = get_remote_state ();
c906108c 1621 static threadref echo_nextthread;
d01949b6
AC
1622 char *threadlist_packet = alloca (rs->remote_packet_size);
1623 char *t_response = alloca (rs->remote_packet_size);
c906108c
SS
1624 int result = 1;
1625
1626 /* Trancate result limit to be smaller than the packet size */
d01949b6
AC
1627 if ((((result_limit + 1) * BUF_THREAD_ID_SIZE) + 10) >= (rs->remote_packet_size))
1628 result_limit = ((rs->remote_packet_size) / BUF_THREAD_ID_SIZE) - 2;
c906108c
SS
1629
1630 pack_threadlist_request (threadlist_packet,
1631 startflag, result_limit, nextthread);
1632 putpkt (threadlist_packet);
d01949b6 1633 getpkt (t_response, (rs->remote_packet_size), 0);
c906108c
SS
1634
1635 *result_count =
1636 parse_threadlist_response (t_response + 2, result_limit, &echo_nextthread,
1637 threadlist, done);
1638
1639 if (!threadmatch (&echo_nextthread, nextthread))
1640 {
1641 /* FIXME: This is a good reason to drop the packet */
1642 /* Possably, there is a duplicate response */
1643 /* Possabilities :
1644 retransmit immediatly - race conditions
1645 retransmit after timeout - yes
1646 exit
1647 wait for packet, then exit
1648 */
1649 warning ("HMM: threadlist did not echo arg thread, dropping it\n");
1650 return 0; /* I choose simply exiting */
1651 }
1652 if (*result_count <= 0)
1653 {
1654 if (*done != 1)
1655 {
1656 warning ("RMT ERROR : failed to get remote thread list\n");
1657 result = 0;
1658 }
1659 return result; /* break; */
1660 }
1661 if (*result_count > result_limit)
1662 {
1663 *result_count = 0;
1664 warning ("RMT ERROR: threadlist response longer than requested\n");
1665 return 0;
1666 }
1667 return result;
1668}
1669
1670/* This is the interface between remote and threads, remotes upper interface */
1671
1672/* remote_find_new_threads retrieves the thread list and for each
1673 thread in the list, looks up the thread in GDB's internal list,
1674 ading the thread if it does not already exist. This involves
1675 getting partial thread lists from the remote target so, polling the
1676 quit_flag is required. */
1677
1678
1679/* About this many threadisds fit in a packet. */
1680
1681#define MAXTHREADLISTRESULTS 32
1682
1683static int
fba45db2
KB
1684remote_threadlist_iterator (rmt_thread_action stepfunction, void *context,
1685 int looplimit)
c906108c
SS
1686{
1687 int done, i, result_count;
1688 int startflag = 1;
1689 int result = 1;
1690 int loopcount = 0;
1691 static threadref nextthread;
1692 static threadref resultthreadlist[MAXTHREADLISTRESULTS];
1693
1694 done = 0;
1695 while (!done)
1696 {
1697 if (loopcount++ > looplimit)
1698 {
1699 result = 0;
1700 warning ("Remote fetch threadlist -infinite loop-\n");
1701 break;
1702 }
1703 if (!remote_get_threadlist (startflag, &nextthread, MAXTHREADLISTRESULTS,
1704 &done, &result_count, resultthreadlist))
1705 {
1706 result = 0;
1707 break;
1708 }
1709 /* clear for later iterations */
1710 startflag = 0;
1711 /* Setup to resume next batch of thread references, set nextthread. */
1712 if (result_count >= 1)
1713 copy_threadref (&nextthread, &resultthreadlist[result_count - 1]);
1714 i = 0;
1715 while (result_count--)
1716 if (!(result = (*stepfunction) (&resultthreadlist[i++], context)))
1717 break;
1718 }
1719 return result;
1720}
1721
1722static int
fba45db2 1723remote_newthread_step (threadref *ref, void *context)
c906108c 1724{
39f77062 1725 ptid_t ptid;
c906108c 1726
39f77062
KB
1727 ptid = pid_to_ptid (threadref_to_int (ref));
1728
1729 if (!in_thread_list (ptid))
1730 add_thread (ptid);
c906108c
SS
1731 return 1; /* continue iterator */
1732}
1733
1734#define CRAZY_MAX_THREADS 1000
1735
39f77062
KB
1736static ptid_t
1737remote_current_thread (ptid_t oldpid)
c906108c 1738{
d01949b6
AC
1739 struct remote_state *rs = get_remote_state ();
1740 char *buf = alloca (rs->remote_packet_size);
c906108c
SS
1741
1742 putpkt ("qC");
d01949b6 1743 getpkt (buf, (rs->remote_packet_size), 0);
c906108c 1744 if (buf[0] == 'Q' && buf[1] == 'C')
39f77062 1745 return pid_to_ptid (strtol (&buf[2], NULL, 16));
c906108c
SS
1746 else
1747 return oldpid;
1748}
1749
9d1f7ab2
MS
1750/* Find new threads for info threads command.
1751 * Original version, using John Metzler's thread protocol.
1752 */
cce74817
JM
1753
1754static void
fba45db2 1755remote_find_new_threads (void)
c906108c 1756{
c5aa993b
JM
1757 remote_threadlist_iterator (remote_newthread_step, 0,
1758 CRAZY_MAX_THREADS);
39f77062
KB
1759 if (PIDGET (inferior_ptid) == MAGIC_NULL_PID) /* ack ack ack */
1760 inferior_ptid = remote_current_thread (inferior_ptid);
c906108c
SS
1761}
1762
9d1f7ab2
MS
1763/*
1764 * Find all threads for info threads command.
1765 * Uses new thread protocol contributed by Cisco.
1766 * Falls back and attempts to use the older method (above)
1767 * if the target doesn't respond to the new method.
1768 */
1769
0f71a2f6
JM
1770static void
1771remote_threads_info (void)
1772{
d01949b6
AC
1773 struct remote_state *rs = get_remote_state ();
1774 char *buf = alloca (rs->remote_packet_size);
085dd6e6 1775 char *bufp;
0f71a2f6
JM
1776 int tid;
1777
1778 if (remote_desc == 0) /* paranoia */
1779 error ("Command can only be used when connected to the remote target.");
1780
9d1f7ab2
MS
1781 if (use_threadinfo_query)
1782 {
1783 putpkt ("qfThreadInfo");
1784 bufp = buf;
d01949b6 1785 getpkt (bufp, (rs->remote_packet_size), 0);
9d1f7ab2
MS
1786 if (bufp[0] != '\0') /* q packet recognized */
1787 {
1788 while (*bufp++ == 'm') /* reply contains one or more TID */
1789 {
1790 do
1791 {
1792 tid = strtol (bufp, &bufp, 16);
39f77062
KB
1793 if (tid != 0 && !in_thread_list (pid_to_ptid (tid)))
1794 add_thread (pid_to_ptid (tid));
9d1f7ab2
MS
1795 }
1796 while (*bufp++ == ','); /* comma-separated list */
1797 putpkt ("qsThreadInfo");
1798 bufp = buf;
d01949b6 1799 getpkt (bufp, (rs->remote_packet_size), 0);
9d1f7ab2
MS
1800 }
1801 return; /* done */
1802 }
1803 }
1804
1805 /* Else fall back to old method based on jmetzler protocol. */
1806 use_threadinfo_query = 0;
1807 remote_find_new_threads ();
1808 return;
1809}
1810
1811/*
1812 * Collect a descriptive string about the given thread.
1813 * The target may say anything it wants to about the thread
1814 * (typically info about its blocked / runnable state, name, etc.).
1815 * This string will appear in the info threads display.
1816 *
1817 * Optional: targets are not required to implement this function.
1818 */
1819
1820static char *
1821remote_threads_extra_info (struct thread_info *tp)
1822{
d01949b6 1823 struct remote_state *rs = get_remote_state ();
9d1f7ab2
MS
1824 int result;
1825 int set;
1826 threadref id;
1827 struct gdb_ext_thread_info threadinfo;
1828 static char display_buf[100]; /* arbitrary... */
d01949b6 1829 char *bufp = alloca (rs->remote_packet_size);
9d1f7ab2
MS
1830 int n = 0; /* position in display_buf */
1831
1832 if (remote_desc == 0) /* paranoia */
8e65ff28
AC
1833 internal_error (__FILE__, __LINE__,
1834 "remote_threads_extra_info");
9d1f7ab2
MS
1835
1836 if (use_threadextra_query)
1837 {
39f77062 1838 sprintf (bufp, "qThreadExtraInfo,%x", PIDGET (tp->ptid));
9d1f7ab2 1839 putpkt (bufp);
d01949b6 1840 getpkt (bufp, (rs->remote_packet_size), 0);
9d1f7ab2
MS
1841 if (bufp[0] != 0)
1842 {
30559e10
MS
1843 n = min (strlen (bufp) / 2, sizeof (display_buf));
1844 result = hex2bin (bufp, display_buf, n);
1845 display_buf [result] = '\0';
9d1f7ab2
MS
1846 return display_buf;
1847 }
0f71a2f6 1848 }
9d1f7ab2
MS
1849
1850 /* If the above query fails, fall back to the old method. */
1851 use_threadextra_query = 0;
1852 set = TAG_THREADID | TAG_EXISTS | TAG_THREADNAME
1853 | TAG_MOREDISPLAY | TAG_DISPLAY;
39f77062 1854 int_to_threadref (&id, PIDGET (tp->ptid));
9d1f7ab2
MS
1855 if (remote_get_threadinfo (&id, set, &threadinfo))
1856 if (threadinfo.active)
0f71a2f6 1857 {
9d1f7ab2
MS
1858 if (*threadinfo.shortname)
1859 n += sprintf(&display_buf[0], " Name: %s,", threadinfo.shortname);
1860 if (*threadinfo.display)
1861 n += sprintf(&display_buf[n], " State: %s,", threadinfo.display);
1862 if (*threadinfo.more_display)
1863 n += sprintf(&display_buf[n], " Priority: %s",
1864 threadinfo.more_display);
1865
1866 if (n > 0)
c5aa993b 1867 {
9d1f7ab2
MS
1868 /* for purely cosmetic reasons, clear up trailing commas */
1869 if (',' == display_buf[n-1])
1870 display_buf[n-1] = ' ';
1871 return display_buf;
c5aa993b 1872 }
0f71a2f6 1873 }
9d1f7ab2 1874 return NULL;
0f71a2f6 1875}
9d1f7ab2 1876
c906108c 1877\f
c5aa993b 1878
c906108c
SS
1879/* Restart the remote side; this is an extended protocol operation. */
1880
1881static void
fba45db2 1882extended_remote_restart (void)
c906108c 1883{
d01949b6
AC
1884 struct remote_state *rs = get_remote_state ();
1885 char *buf = alloca (rs->remote_packet_size);
c906108c
SS
1886
1887 /* Send the restart command; for reasons I don't understand the
1888 remote side really expects a number after the "R". */
1889 buf[0] = 'R';
1890 sprintf (&buf[1], "%x", 0);
1891 putpkt (buf);
1892
1893 /* Now query for status so this looks just like we restarted
1894 gdbserver from scratch. */
1895 putpkt ("?");
d01949b6 1896 getpkt (buf, (rs->remote_packet_size), 0);
c906108c
SS
1897}
1898\f
1899/* Clean up connection to a remote debugger. */
1900
1901/* ARGSUSED */
1902static void
fba45db2 1903remote_close (int quitting)
c906108c
SS
1904{
1905 if (remote_desc)
2cd58942 1906 serial_close (remote_desc);
c906108c
SS
1907 remote_desc = NULL;
1908}
1909
1910/* Query the remote side for the text, data and bss offsets. */
1911
1912static void
fba45db2 1913get_offsets (void)
c906108c 1914{
d01949b6
AC
1915 struct remote_state *rs = get_remote_state ();
1916 char *buf = alloca (rs->remote_packet_size);
085dd6e6 1917 char *ptr;
c906108c
SS
1918 int lose;
1919 CORE_ADDR text_addr, data_addr, bss_addr;
1920 struct section_offsets *offs;
1921
1922 putpkt ("qOffsets");
1923
d01949b6 1924 getpkt (buf, (rs->remote_packet_size), 0);
c906108c
SS
1925
1926 if (buf[0] == '\000')
1927 return; /* Return silently. Stub doesn't support
1928 this command. */
1929 if (buf[0] == 'E')
1930 {
1931 warning ("Remote failure reply: %s", buf);
1932 return;
1933 }
1934
1935 /* Pick up each field in turn. This used to be done with scanf, but
1936 scanf will make trouble if CORE_ADDR size doesn't match
1937 conversion directives correctly. The following code will work
1938 with any size of CORE_ADDR. */
1939 text_addr = data_addr = bss_addr = 0;
1940 ptr = buf;
1941 lose = 0;
1942
1943 if (strncmp (ptr, "Text=", 5) == 0)
1944 {
1945 ptr += 5;
1946 /* Don't use strtol, could lose on big values. */
1947 while (*ptr && *ptr != ';')
1948 text_addr = (text_addr << 4) + fromhex (*ptr++);
1949 }
1950 else
1951 lose = 1;
1952
1953 if (!lose && strncmp (ptr, ";Data=", 6) == 0)
1954 {
1955 ptr += 6;
1956 while (*ptr && *ptr != ';')
1957 data_addr = (data_addr << 4) + fromhex (*ptr++);
1958 }
1959 else
1960 lose = 1;
1961
1962 if (!lose && strncmp (ptr, ";Bss=", 5) == 0)
1963 {
1964 ptr += 5;
1965 while (*ptr && *ptr != ';')
1966 bss_addr = (bss_addr << 4) + fromhex (*ptr++);
1967 }
1968 else
1969 lose = 1;
1970
1971 if (lose)
1972 error ("Malformed response to offset query, %s", buf);
1973
1974 if (symfile_objfile == NULL)
1975 return;
1976
d4f3574e
SS
1977 offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
1978 memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
c906108c 1979
a4c8257b 1980 offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_addr;
c906108c
SS
1981
1982 /* This is a temporary kludge to force data and bss to use the same offsets
1983 because that's what nlmconv does now. The real solution requires changes
1984 to the stub and remote.c that I don't have time to do right now. */
1985
a4c8257b
EZ
1986 offs->offsets[SECT_OFF_DATA (symfile_objfile)] = data_addr;
1987 offs->offsets[SECT_OFF_BSS (symfile_objfile)] = data_addr;
c906108c
SS
1988
1989 objfile_relocate (symfile_objfile, offs);
1990}
1991
0f71a2f6
JM
1992/*
1993 * Cisco version of section offsets:
1994 *
1995 * Instead of having GDB query the target for the section offsets,
1996 * Cisco lets the target volunteer the information! It's also in
1997 * a different format, so here are the functions that will decode
1998 * a section offset packet from a Cisco target.
1999 */
2000
2001/*
2002 * Function: remote_cisco_section_offsets
2003 *
2004 * Returns: zero for success, non-zero for failure
2005 */
2006
c5aa993b 2007static int
c2d11a7d
JM
2008remote_cisco_section_offsets (bfd_vma text_addr,
2009 bfd_vma data_addr,
2010 bfd_vma bss_addr,
2011 bfd_signed_vma *text_offs,
2012 bfd_signed_vma *data_offs,
2013 bfd_signed_vma *bss_offs)
0f71a2f6
JM
2014{
2015 bfd_vma text_base, data_base, bss_base;
2016 struct minimal_symbol *start;
2017 asection *sect;
c5aa993b 2018 bfd *abfd;
0f71a2f6 2019 int len;
0f71a2f6
JM
2020
2021 if (symfile_objfile == NULL)
c5aa993b 2022 return -1; /* no can do nothin' */
0f71a2f6
JM
2023
2024 start = lookup_minimal_symbol ("_start", NULL, NULL);
2025 if (start == NULL)
c5aa993b 2026 return -1; /* Can't find "_start" symbol */
0f71a2f6
JM
2027
2028 data_base = bss_base = 0;
2029 text_base = SYMBOL_VALUE_ADDRESS (start);
2030
2031 abfd = symfile_objfile->obfd;
c5aa993b 2032 for (sect = abfd->sections;
0f71a2f6
JM
2033 sect != 0;
2034 sect = sect->next)
2035 {
ce359b09 2036 const char *p = bfd_get_section_name (abfd, sect);
0f71a2f6
JM
2037 len = strlen (p);
2038 if (strcmp (p + len - 4, "data") == 0) /* ends in "data" */
2039 if (data_base == 0 ||
2040 data_base > bfd_get_section_vma (abfd, sect))
2041 data_base = bfd_get_section_vma (abfd, sect);
2042 if (strcmp (p + len - 3, "bss") == 0) /* ends in "bss" */
c5aa993b 2043 if (bss_base == 0 ||
0f71a2f6
JM
2044 bss_base > bfd_get_section_vma (abfd, sect))
2045 bss_base = bfd_get_section_vma (abfd, sect);
2046 }
2047 *text_offs = text_addr - text_base;
2048 *data_offs = data_addr - data_base;
c5aa993b 2049 *bss_offs = bss_addr - bss_base;
0f71a2f6
JM
2050 if (remote_debug)
2051 {
2052 char tmp[128];
2053
2054 sprintf (tmp, "VMA: text = 0x");
2055 sprintf_vma (tmp + strlen (tmp), text_addr);
c5aa993b 2056 sprintf (tmp + strlen (tmp), " data = 0x");
0f71a2f6 2057 sprintf_vma (tmp + strlen (tmp), data_addr);
c5aa993b 2058 sprintf (tmp + strlen (tmp), " bss = 0x");
0f71a2f6
JM
2059 sprintf_vma (tmp + strlen (tmp), bss_addr);
2060 fprintf_filtered (gdb_stdlog, tmp);
2061 fprintf_filtered (gdb_stdlog,
d4f3574e
SS
2062 "Reloc offset: text = 0x%s data = 0x%s bss = 0x%s\n",
2063 paddr_nz (*text_offs),
2064 paddr_nz (*data_offs),
2065 paddr_nz (*bss_offs));
0f71a2f6
JM
2066 }
2067
2068 return 0;
2069}
2070
2071/*
2072 * Function: remote_cisco_objfile_relocate
2073 *
2074 * Relocate the symbol file for a remote target.
2075 */
2076
96baa820 2077void
fba45db2
KB
2078remote_cisco_objfile_relocate (bfd_signed_vma text_off, bfd_signed_vma data_off,
2079 bfd_signed_vma bss_off)
0f71a2f6
JM
2080{
2081 struct section_offsets *offs;
2082
c5aa993b 2083 if (text_off != 0 || data_off != 0 || bss_off != 0)
0f71a2f6
JM
2084 {
2085 /* FIXME: This code assumes gdb-stabs.h is being used; it's
c5aa993b
JM
2086 broken for xcoff, dwarf, sdb-coff, etc. But there is no
2087 simple canonical representation for this stuff. */
0f71a2f6 2088
d4f3574e
SS
2089 offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
2090 memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
0f71a2f6 2091
a4c8257b
EZ
2092 offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_off;
2093 offs->offsets[SECT_OFF_DATA (symfile_objfile)] = data_off;
2094 offs->offsets[SECT_OFF_BSS (symfile_objfile)] = bss_off;
0f71a2f6
JM
2095
2096 /* First call the standard objfile_relocate. */
2097 objfile_relocate (symfile_objfile, offs);
2098
2099 /* Now we need to fix up the section entries already attached to
c5aa993b
JM
2100 the exec target. These entries will control memory transfers
2101 from the exec file. */
0f71a2f6
JM
2102
2103 exec_set_section_offsets (text_off, data_off, bss_off);
2104 }
2105}
2106
c906108c
SS
2107/* Stub for catch_errors. */
2108
0f71a2f6 2109static int
c2d11a7d 2110remote_start_remote_dummy (void *dummy)
0f71a2f6
JM
2111{
2112 start_remote (); /* Initialize gdb process mechanisms */
2113 return 1;
2114}
2115
c906108c 2116static int
ae44c0c4 2117remote_start_remote (void *dummy)
c906108c 2118{
8edbea78 2119 immediate_quit++; /* Allow user to interrupt it */
c906108c
SS
2120
2121 /* Ack any packet which the remote side has already sent. */
2cd58942 2122 serial_write (remote_desc, "+", 1);
c906108c
SS
2123
2124 /* Let the stub know that we want it to return the thread. */
2125 set_thread (-1, 0);
2126
39f77062 2127 inferior_ptid = remote_current_thread (inferior_ptid);
c906108c
SS
2128
2129 get_offsets (); /* Get text, data & bss offsets */
2130
2131 putpkt ("?"); /* initiate a query from remote machine */
8edbea78 2132 immediate_quit--;
c906108c 2133
0f71a2f6 2134 return remote_start_remote_dummy (dummy);
c906108c
SS
2135}
2136
2137/* Open a connection to a remote debugger.
2138 NAME is the filename used for communication. */
2139
2140static void
fba45db2 2141remote_open (char *name, int from_tty)
c906108c
SS
2142{
2143 remote_open_1 (name, from_tty, &remote_ops, 0);
2144}
2145
43ff13b4
JM
2146/* Just like remote_open, but with asynchronous support. */
2147static void
fba45db2 2148remote_async_open (char *name, int from_tty)
43ff13b4
JM
2149{
2150 remote_async_open_1 (name, from_tty, &remote_async_ops, 0);
2151}
2152
c906108c
SS
2153/* Open a connection to a remote debugger using the extended
2154 remote gdb protocol. NAME is the filename used for communication. */
2155
2156static void
fba45db2 2157extended_remote_open (char *name, int from_tty)
c906108c 2158{
c5aa993b 2159 remote_open_1 (name, from_tty, &extended_remote_ops, 1 /*extended_p */ );
c906108c
SS
2160}
2161
43ff13b4
JM
2162/* Just like extended_remote_open, but with asynchronous support. */
2163static void
fba45db2 2164extended_remote_async_open (char *name, int from_tty)
43ff13b4 2165{
c5aa993b 2166 remote_async_open_1 (name, from_tty, &extended_async_remote_ops, 1 /*extended_p */ );
43ff13b4
JM
2167}
2168
c906108c
SS
2169/* Generic code for opening a connection to a remote target. */
2170
d471ea57
AC
2171static void
2172init_all_packet_configs (void)
2173{
2174 int i;
44eaed12
C
2175 update_packet_config (&remote_protocol_e);
2176 update_packet_config (&remote_protocol_E);
d471ea57 2177 update_packet_config (&remote_protocol_P);
dc8acb97 2178 update_packet_config (&remote_protocol_qSymbol);
d471ea57
AC
2179 for (i = 0; i < NR_Z_PACKET_TYPES; i++)
2180 update_packet_config (&remote_protocol_Z[i]);
2181 /* Force remote_write_bytes to check whether target supports binary
2182 downloading. */
2183 update_packet_config (&remote_protocol_binary_download);
2184}
2185
dc8acb97
MS
2186/* Symbol look-up. */
2187
2188static void
2189remote_check_symbols (struct objfile *objfile)
2190{
d01949b6 2191 struct remote_state *rs = get_remote_state ();
dc8acb97
MS
2192 char *msg, *reply, *tmp;
2193 struct minimal_symbol *sym;
2194 int end;
2195
2196 if (remote_protocol_qSymbol.support == PACKET_DISABLE)
2197 return;
2198
d01949b6
AC
2199 msg = alloca (rs->remote_packet_size);
2200 reply = alloca (rs->remote_packet_size);
dc8acb97
MS
2201
2202 /* Invite target to request symbol lookups. */
2203
2204 putpkt ("qSymbol::");
d01949b6 2205 getpkt (reply, (rs->remote_packet_size), 0);
dc8acb97
MS
2206 packet_ok (reply, &remote_protocol_qSymbol);
2207
2208 while (strncmp (reply, "qSymbol:", 8) == 0)
2209 {
2210 tmp = &reply[8];
2211 end = hex2bin (tmp, msg, strlen (tmp) / 2);
2212 msg[end] = '\0';
2213 sym = lookup_minimal_symbol (msg, NULL, NULL);
2214 if (sym == NULL)
2215 sprintf (msg, "qSymbol::%s", &reply[8]);
2216 else
2217 sprintf (msg, "qSymbol:%s:%s",
2218 paddr_nz (SYMBOL_VALUE_ADDRESS (sym)),
2219 &reply[8]);
2220 putpkt (msg);
d01949b6 2221 getpkt (reply, (rs->remote_packet_size), 0);
dc8acb97
MS
2222 }
2223}
2224
9db8d71f
DJ
2225static struct serial *
2226remote_serial_open (char *name)
2227{
2228 static int udp_warning = 0;
2229
2230 /* FIXME: Parsing NAME here is a hack. But we want to warn here instead
2231 of in ser-tcp.c, because it is the remote protocol assuming that the
2232 serial connection is reliable and not the serial connection promising
2233 to be. */
2234 if (!udp_warning && strncmp (name, "udp:", 4) == 0)
2235 {
2236 warning ("The remote protocol may be unreliable over UDP.");
2237 warning ("Some events may be lost, rendering further debugging "
2238 "impossible.");
2239 udp_warning = 1;
2240 }
2241
2242 return serial_open (name);
2243}
2244
c906108c 2245static void
fba45db2
KB
2246remote_open_1 (char *name, int from_tty, struct target_ops *target,
2247 int extended_p)
c906108c 2248{
d01949b6 2249 struct remote_state *rs = get_remote_state ();
c906108c 2250 if (name == 0)
22e04375
AC
2251 error ("To open a remote debug connection, you need to specify what\n"
2252 "serial device is attached to the remote system\n"
2253 "(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).");
c906108c 2254
6426a772
JM
2255 /* See FIXME above */
2256 wait_forever_enabled_p = 1;
2257
c906108c
SS
2258 target_preopen (from_tty);
2259
2260 unpush_target (target);
2261
9db8d71f 2262 remote_desc = remote_serial_open (name);
c906108c
SS
2263 if (!remote_desc)
2264 perror_with_name (name);
2265
2266 if (baud_rate != -1)
2267 {
2cd58942 2268 if (serial_setbaudrate (remote_desc, baud_rate))
c906108c 2269 {
2cd58942 2270 serial_close (remote_desc);
c906108c
SS
2271 perror_with_name (name);
2272 }
2273 }
2274
2cd58942 2275 serial_raw (remote_desc);
c906108c
SS
2276
2277 /* If there is something sitting in the buffer we might take it as a
2278 response to a command, which would be bad. */
2cd58942 2279 serial_flush_input (remote_desc);
c906108c
SS
2280
2281 if (from_tty)
2282 {
2283 puts_filtered ("Remote debugging using ");
2284 puts_filtered (name);
2285 puts_filtered ("\n");
2286 }
c5aa993b 2287 push_target (target); /* Switch to using remote target now */
c906108c 2288
d471ea57 2289 init_all_packet_configs ();
96baa820 2290
c5aa993b 2291 general_thread = -2;
cce74817 2292 continue_thread = -2;
c906108c 2293
9d1f7ab2
MS
2294 /* Probe for ability to use "ThreadInfo" query, as required. */
2295 use_threadinfo_query = 1;
2296 use_threadextra_query = 1;
2297
c906108c
SS
2298 /* Without this, some commands which require an active target (such
2299 as kill) won't work. This variable serves (at least) double duty
2300 as both the pid of the target process (if it has such), and as a
2301 flag indicating that a target is active. These functions should
2302 be split out into seperate variables, especially since GDB will
2303 someday have a notion of debugging several processes. */
2304
39f77062 2305 inferior_ptid = pid_to_ptid (MAGIC_NULL_PID);
f78f6cf1
MS
2306#ifdef SOLIB_CREATE_INFERIOR_HOOK
2307 /* First delete any symbols previously loaded from shared libraries. */
2308 no_shared_libraries (NULL, 0);
2309#endif
2310
c906108c
SS
2311 /* Start the remote connection; if error (0), discard this target.
2312 In particular, if the user quits, be sure to discard it
2313 (we'd be in an inconsistent state otherwise). */
c5aa993b
JM
2314 if (!catch_errors (remote_start_remote, NULL,
2315 "Couldn't establish connection to remote target\n",
c906108c
SS
2316 RETURN_MASK_ALL))
2317 {
2318 pop_target ();
2319 return;
2320 }
2321
2322 if (extended_p)
2323 {
6240bebf 2324 /* Tell the remote that we are using the extended protocol. */
d01949b6 2325 char *buf = alloca (rs->remote_packet_size);
c906108c 2326 putpkt ("!");
d01949b6 2327 getpkt (buf, (rs->remote_packet_size), 0);
c906108c 2328 }
f78f6cf1 2329#ifdef SOLIB_CREATE_INFERIOR_HOOK
6240bebf
MS
2330 /* FIXME: need a master target_open vector from which all
2331 remote_opens can be called, so that stuff like this can
2332 go there. Failing that, the following code must be copied
2333 to the open function for any remote target that wants to
2334 support svr4 shared libraries. */
f78f6cf1
MS
2335
2336 /* Set up to detect and load shared libraries. */
6240bebf 2337 if (exec_bfd) /* No use without an exec file. */
dc8acb97
MS
2338 {
2339 SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid));
2340 remote_check_symbols (symfile_objfile);
2341 }
6240bebf 2342#endif
c906108c
SS
2343}
2344
43ff13b4
JM
2345/* Just like remote_open but with asynchronous support. */
2346static void
fba45db2
KB
2347remote_async_open_1 (char *name, int from_tty, struct target_ops *target,
2348 int extended_p)
43ff13b4 2349{
d01949b6 2350 struct remote_state *rs = get_remote_state ();
43ff13b4 2351 if (name == 0)
22e04375
AC
2352 error ("To open a remote debug connection, you need to specify what\n"
2353 "serial device is attached to the remote system\n"
2354 "(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).");
43ff13b4
JM
2355
2356 target_preopen (from_tty);
2357
2358 unpush_target (target);
2359
9db8d71f 2360 remote_desc = remote_serial_open (name);
43ff13b4
JM
2361 if (!remote_desc)
2362 perror_with_name (name);
2363
2364 if (baud_rate != -1)
2365 {
2cd58942 2366 if (serial_setbaudrate (remote_desc, baud_rate))
43ff13b4 2367 {
2cd58942 2368 serial_close (remote_desc);
43ff13b4
JM
2369 perror_with_name (name);
2370 }
2371 }
2372
2cd58942 2373 serial_raw (remote_desc);
43ff13b4
JM
2374
2375 /* If there is something sitting in the buffer we might take it as a
2376 response to a command, which would be bad. */
2cd58942 2377 serial_flush_input (remote_desc);
43ff13b4
JM
2378
2379 if (from_tty)
2380 {
2381 puts_filtered ("Remote debugging using ");
2382 puts_filtered (name);
2383 puts_filtered ("\n");
2384 }
2385
c5aa993b 2386 push_target (target); /* Switch to using remote target now */
43ff13b4 2387
d471ea57 2388 init_all_packet_configs ();
43ff13b4 2389
c5aa993b 2390 general_thread = -2;
43ff13b4
JM
2391 continue_thread = -2;
2392
9d1f7ab2
MS
2393 /* Probe for ability to use "ThreadInfo" query, as required. */
2394 use_threadinfo_query = 1;
2395 use_threadextra_query = 1;
2396
43ff13b4
JM
2397 /* Without this, some commands which require an active target (such
2398 as kill) won't work. This variable serves (at least) double duty
2399 as both the pid of the target process (if it has such), and as a
2400 flag indicating that a target is active. These functions should
2401 be split out into seperate variables, especially since GDB will
2402 someday have a notion of debugging several processes. */
39f77062 2403 inferior_ptid = pid_to_ptid (MAGIC_NULL_PID);
6426a772
JM
2404
2405 /* With this target we start out by owning the terminal. */
2406 remote_async_terminal_ours_p = 1;
2407
2408 /* FIXME: cagney/1999-09-23: During the initial connection it is
2409 assumed that the target is already ready and able to respond to
e26cc349 2410 requests. Unfortunately remote_start_remote() eventually calls
6426a772
JM
2411 wait_for_inferior() with no timeout. wait_forever_enabled_p gets
2412 around this. Eventually a mechanism that allows
2413 wait_for_inferior() to expect/get timeouts will be
2414 implemented. */
2415 wait_forever_enabled_p = 0;
2416
f78f6cf1
MS
2417#ifdef SOLIB_CREATE_INFERIOR_HOOK
2418 /* First delete any symbols previously loaded from shared libraries. */
2419 no_shared_libraries (NULL, 0);
2420#endif
2421
43ff13b4
JM
2422 /* Start the remote connection; if error (0), discard this target.
2423 In particular, if the user quits, be sure to discard it
2424 (we'd be in an inconsistent state otherwise). */
c5aa993b
JM
2425 if (!catch_errors (remote_start_remote, NULL,
2426 "Couldn't establish connection to remote target\n",
43ff13b4
JM
2427 RETURN_MASK_ALL))
2428 {
43ff13b4 2429 pop_target ();
6426a772 2430 wait_forever_enabled_p = 1;
43ff13b4
JM
2431 return;
2432 }
2433
6426a772
JM
2434 wait_forever_enabled_p = 1;
2435
2436 if (extended_p)
43ff13b4 2437 {
6240bebf 2438 /* Tell the remote that we are using the extended protocol. */
d01949b6 2439 char *buf = alloca (rs->remote_packet_size);
6426a772 2440 putpkt ("!");
d01949b6 2441 getpkt (buf, (rs->remote_packet_size), 0);
43ff13b4 2442 }
f78f6cf1 2443#ifdef SOLIB_CREATE_INFERIOR_HOOK
6240bebf
MS
2444 /* FIXME: need a master target_open vector from which all
2445 remote_opens can be called, so that stuff like this can
2446 go there. Failing that, the following code must be copied
2447 to the open function for any remote target that wants to
2448 support svr4 shared libraries. */
f78f6cf1
MS
2449
2450 /* Set up to detect and load shared libraries. */
6240bebf 2451 if (exec_bfd) /* No use without an exec file. */
dc8acb97
MS
2452 {
2453 SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid));
2454 remote_check_symbols (symfile_objfile);
2455 }
6240bebf 2456#endif
43ff13b4
JM
2457}
2458
c906108c
SS
2459/* This takes a program previously attached to and detaches it. After
2460 this is done, GDB can be used to debug some other program. We
2461 better not have left any breakpoints in the target program or it'll
2462 die when it hits one. */
2463
2464static void
fba45db2 2465remote_detach (char *args, int from_tty)
c906108c 2466{
d01949b6
AC
2467 struct remote_state *rs = get_remote_state ();
2468 char *buf = alloca (rs->remote_packet_size);
c906108c
SS
2469
2470 if (args)
2471 error ("Argument given to \"detach\" when remotely debugging.");
2472
2473 /* Tell the remote target to detach. */
2474 strcpy (buf, "D");
d01949b6 2475 remote_send (buf, (rs->remote_packet_size));
c906108c 2476
cca728d0 2477 target_mourn_inferior ();
c906108c
SS
2478 if (from_tty)
2479 puts_filtered ("Ending remote debugging.\n");
96baa820 2480
c906108c
SS
2481}
2482
43ff13b4
JM
2483/* Same as remote_detach, but with async support. */
2484static void
fba45db2 2485remote_async_detach (char *args, int from_tty)
43ff13b4 2486{
d01949b6
AC
2487 struct remote_state *rs = get_remote_state ();
2488 char *buf = alloca (rs->remote_packet_size);
43ff13b4
JM
2489
2490 if (args)
2491 error ("Argument given to \"detach\" when remotely debugging.");
2492
2493 /* Tell the remote target to detach. */
2494 strcpy (buf, "D");
d01949b6 2495 remote_send (buf, (rs->remote_packet_size));
43ff13b4
JM
2496
2497 /* Unregister the file descriptor from the event loop. */
ed9a39eb 2498 if (target_is_async_p ())
2cd58942 2499 serial_async (remote_desc, NULL, 0);
43ff13b4 2500
cca728d0 2501 target_mourn_inferior ();
43ff13b4
JM
2502 if (from_tty)
2503 puts_filtered ("Ending remote debugging.\n");
2504}
2505
c906108c
SS
2506/* Convert hex digit A to a number. */
2507
30559e10 2508static int
fba45db2 2509fromhex (int a)
c906108c
SS
2510{
2511 if (a >= '0' && a <= '9')
2512 return a - '0';
2513 else if (a >= 'a' && a <= 'f')
2514 return a - 'a' + 10;
2515 else if (a >= 'A' && a <= 'F')
2516 return a - 'A' + 10;
c5aa993b 2517 else
c906108c
SS
2518 error ("Reply contains invalid hex digit %d", a);
2519}
2520
30559e10
MS
2521static int
2522hex2bin (const char *hex, char *bin, int count)
2523{
2524 int i;
2525
30559e10
MS
2526 for (i = 0; i < count; i++)
2527 {
2528 if (hex[0] == 0 || hex[1] == 0)
2529 {
2530 /* Hex string is short, or of uneven length.
2531 Return the count that has been converted so far. */
2532 return i;
2533 }
2534 *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]);
2535 hex += 2;
2536 }
2537 return i;
2538}
2539
c906108c
SS
2540/* Convert number NIB to a hex digit. */
2541
2542static int
fba45db2 2543tohex (int nib)
c906108c
SS
2544{
2545 if (nib < 10)
c5aa993b 2546 return '0' + nib;
c906108c 2547 else
c5aa993b 2548 return 'a' + nib - 10;
c906108c 2549}
30559e10
MS
2550
2551static int
234fa6d1 2552bin2hex (const char *bin, char *hex, int count)
30559e10
MS
2553{
2554 int i;
2555 /* May use a length, or a nul-terminated string as input. */
2556 if (count == 0)
2557 count = strlen (bin);
2558
2559 for (i = 0; i < count; i++)
2560 {
2561 *hex++ = tohex ((*bin >> 4) & 0xf);
2562 *hex++ = tohex (*bin++ & 0xf);
2563 }
2564 *hex = 0;
2565 return i;
2566}
c906108c
SS
2567\f
2568/* Tell the remote machine to resume. */
2569
2570static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
2571
2572static int last_sent_step;
2573
2574static void
39f77062 2575remote_resume (ptid_t ptid, int step, enum target_signal siggnal)
c906108c 2576{
d01949b6
AC
2577 struct remote_state *rs = get_remote_state ();
2578 char *buf = alloca (rs->remote_packet_size);
39f77062 2579 int pid = PIDGET (ptid);
44eaed12 2580 char *p;
c906108c
SS
2581
2582 if (pid == -1)
2583 set_thread (0, 0); /* run any thread */
2584 else
2585 set_thread (pid, 0); /* run this thread */
2586
c906108c
SS
2587 last_sent_signal = siggnal;
2588 last_sent_step = step;
2589
2590 /* A hook for when we need to do something at the last moment before
2591 resumption. */
2592 if (target_resume_hook)
2593 (*target_resume_hook) ();
2594
44eaed12
C
2595
2596 /* The s/S/c/C packets do not return status. So if the target does
2597 not support the S or C packets, the debug agent returns an empty
2598 string which is detected in remote_wait(). This protocol defect
2599 is fixed in the e/E packets. */
2600
2601 if (step && step_range_end)
2602 {
2603 /* If the target does not support the 'E' packet, we try the 'S'
2604 packet. Ideally we would fall back to the 'e' packet if that
2605 too is not supported. But that would require another copy of
2606 the code to issue the 'e' packet (and fall back to 's' if not
2607 supported) in remote_wait(). */
2608
2609 if (siggnal != TARGET_SIGNAL_0)
2610 {
2611 if (remote_protocol_E.support != PACKET_DISABLE)
2612 {
2613 p = buf;
2614 *p++ = 'E';
2615 *p++ = tohex (((int) siggnal >> 4) & 0xf);
2616 *p++ = tohex (((int) siggnal) & 0xf);
2617 *p++ = ',';
2618 p += hexnumstr (p, (ULONGEST) step_range_start);
2619 *p++ = ',';
2620 p += hexnumstr (p, (ULONGEST) step_range_end);
2621 *p++ = 0;
2622
2623 putpkt (buf);
d01949b6 2624 getpkt (buf, (rs->remote_packet_size), 0);
44eaed12 2625
234fa6d1 2626 if (packet_ok (buf, &remote_protocol_E) == PACKET_OK)
44eaed12
C
2627 return;
2628 }
2629 }
2630 else
2631 {
2632 if (remote_protocol_e.support != PACKET_DISABLE)
2633 {
2634 p = buf;
2635 *p++ = 'e';
2636 p += hexnumstr (p, (ULONGEST) step_range_start);
2637 *p++ = ',';
2638 p += hexnumstr (p, (ULONGEST) step_range_end);
2639 *p++ = 0;
2640
2641 putpkt (buf);
d01949b6 2642 getpkt (buf, (rs->remote_packet_size), 0);
44eaed12 2643
234fa6d1 2644 if (packet_ok (buf, &remote_protocol_e) == PACKET_OK)
44eaed12
C
2645 return;
2646 }
2647 }
2648 }
2649
c906108c
SS
2650 if (siggnal != TARGET_SIGNAL_0)
2651 {
2652 buf[0] = step ? 'S' : 'C';
c5aa993b 2653 buf[1] = tohex (((int) siggnal >> 4) & 0xf);
44eaed12 2654 buf[2] = tohex (((int) siggnal) & 0xf);
c906108c
SS
2655 buf[3] = '\0';
2656 }
2657 else
c5aa993b 2658 strcpy (buf, step ? "s" : "c");
c906108c
SS
2659
2660 putpkt (buf);
2661}
43ff13b4
JM
2662
2663/* Same as remote_resume, but with async support. */
2664static void
39f77062 2665remote_async_resume (ptid_t ptid, int step, enum target_signal siggnal)
43ff13b4 2666{
d01949b6
AC
2667 struct remote_state *rs = get_remote_state ();
2668 char *buf = alloca (rs->remote_packet_size);
39f77062 2669 int pid = PIDGET (ptid);
44eaed12 2670 char *p;
43ff13b4
JM
2671
2672 if (pid == -1)
2673 set_thread (0, 0); /* run any thread */
2674 else
2675 set_thread (pid, 0); /* run this thread */
2676
43ff13b4
JM
2677 last_sent_signal = siggnal;
2678 last_sent_step = step;
2679
2680 /* A hook for when we need to do something at the last moment before
2681 resumption. */
2682 if (target_resume_hook)
2683 (*target_resume_hook) ();
2684
44eaed12
C
2685 /* The s/S/c/C packets do not return status. So if the target does
2686 not support the S or C packets, the debug agent returns an empty
2687 string which is detected in remote_wait(). This protocol defect
2688 is fixed in the e/E packets. */
2689
2690 if (step && step_range_end)
2691 {
2692 /* If the target does not support the 'E' packet, we try the 'S'
2693 packet. Ideally we would fall back to the 'e' packet if that
2694 too is not supported. But that would require another copy of
2695 the code to issue the 'e' packet (and fall back to 's' if not
2696 supported) in remote_wait(). */
2697
2698 if (siggnal != TARGET_SIGNAL_0)
2699 {
2700 if (remote_protocol_E.support != PACKET_DISABLE)
2701 {
2702 p = buf;
2703 *p++ = 'E';
2704 *p++ = tohex (((int) siggnal >> 4) & 0xf);
2705 *p++ = tohex (((int) siggnal) & 0xf);
2706 *p++ = ',';
2707 p += hexnumstr (p, (ULONGEST) step_range_start);
2708 *p++ = ',';
2709 p += hexnumstr (p, (ULONGEST) step_range_end);
2710 *p++ = 0;
2711
2712 putpkt (buf);
d01949b6 2713 getpkt (buf, (rs->remote_packet_size), 0);
44eaed12 2714
234fa6d1 2715 if (packet_ok (buf, &remote_protocol_E) == PACKET_OK)
44eaed12
C
2716 goto register_event_loop;
2717 }
2718 }
2719 else
2720 {
2721 if (remote_protocol_e.support != PACKET_DISABLE)
2722 {
2723 p = buf;
2724 *p++ = 'e';
2725 p += hexnumstr (p, (ULONGEST) step_range_start);
2726 *p++ = ',';
2727 p += hexnumstr (p, (ULONGEST) step_range_end);
2728 *p++ = 0;
2729
2730 putpkt (buf);
d01949b6 2731 getpkt (buf, (rs->remote_packet_size), 0);
44eaed12 2732
234fa6d1 2733 if (packet_ok (buf, &remote_protocol_e) == PACKET_OK)
44eaed12
C
2734 goto register_event_loop;
2735 }
2736 }
2737 }
2738
43ff13b4
JM
2739 if (siggnal != TARGET_SIGNAL_0)
2740 {
2741 buf[0] = step ? 'S' : 'C';
c5aa993b
JM
2742 buf[1] = tohex (((int) siggnal >> 4) & 0xf);
2743 buf[2] = tohex ((int) siggnal & 0xf);
43ff13b4
JM
2744 buf[3] = '\0';
2745 }
2746 else
c5aa993b 2747 strcpy (buf, step ? "s" : "c");
44eaed12
C
2748
2749 putpkt (buf);
43ff13b4 2750
44eaed12 2751register_event_loop:
2acceee2
JM
2752 /* We are about to start executing the inferior, let's register it
2753 with the event loop. NOTE: this is the one place where all the
2754 execution commands end up. We could alternatively do this in each
2755 of the execution commands in infcmd.c.*/
2756 /* FIXME: ezannoni 1999-09-28: We may need to move this out of here
2757 into infcmd.c in order to allow inferior function calls to work
2758 NOT asynchronously. */
ed9a39eb 2759 if (event_loop_p && target_can_async_p ())
2acceee2
JM
2760 target_async (inferior_event_handler, 0);
2761 /* Tell the world that the target is now executing. */
2762 /* FIXME: cagney/1999-09-23: Is it the targets responsibility to set
2763 this? Instead, should the client of target just assume (for
2764 async targets) that the target is going to start executing? Is
2765 this information already found in the continuation block? */
ed9a39eb 2766 if (target_is_async_p ())
2acceee2 2767 target_executing = 1;
43ff13b4 2768}
c906108c 2769\f
43ff13b4
JM
2770
2771/* Set up the signal handler for SIGINT, while the target is
2772 executing, ovewriting the 'regular' SIGINT signal handler. */
2773static void
fba45db2 2774initialize_sigint_signal_handler (void)
43ff13b4 2775{
c5aa993b 2776 sigint_remote_token =
43ff13b4
JM
2777 create_async_signal_handler (async_remote_interrupt, NULL);
2778 signal (SIGINT, handle_remote_sigint);
2779}
2780
2781/* Signal handler for SIGINT, while the target is executing. */
2782static void
fba45db2 2783handle_remote_sigint (int sig)
43ff13b4
JM
2784{
2785 signal (sig, handle_remote_sigint_twice);
c5aa993b 2786 sigint_remote_twice_token =
43ff13b4
JM
2787 create_async_signal_handler (async_remote_interrupt_twice, NULL);
2788 mark_async_signal_handler_wrapper (sigint_remote_token);
2789}
2790
2791/* Signal handler for SIGINT, installed after SIGINT has already been
2792 sent once. It will take effect the second time that the user sends
2793 a ^C. */
2794static void
fba45db2 2795handle_remote_sigint_twice (int sig)
43ff13b4
JM
2796{
2797 signal (sig, handle_sigint);
c5aa993b 2798 sigint_remote_twice_token =
2df3850c 2799 create_async_signal_handler (inferior_event_handler_wrapper, NULL);
43ff13b4
JM
2800 mark_async_signal_handler_wrapper (sigint_remote_twice_token);
2801}
2802
6426a772 2803/* Perform the real interruption of the target execution, in response
43ff13b4 2804 to a ^C. */
c5aa993b 2805static void
fba45db2 2806async_remote_interrupt (gdb_client_data arg)
43ff13b4
JM
2807{
2808 if (remote_debug)
2809 fprintf_unfiltered (gdb_stdlog, "remote_interrupt called\n");
2810
2811 target_stop ();
2812}
2813
2814/* Perform interrupt, if the first attempt did not succeed. Just give
2815 up on the target alltogether. */
2df3850c 2816void
fba45db2 2817async_remote_interrupt_twice (gdb_client_data arg)
43ff13b4 2818{
2df3850c
JM
2819 if (remote_debug)
2820 fprintf_unfiltered (gdb_stdlog, "remote_interrupt_twice called\n");
6426a772
JM
2821 /* Do something only if the target was not killed by the previous
2822 cntl-C. */
2823 if (target_executing)
2824 {
2825 interrupt_query ();
2826 signal (SIGINT, handle_remote_sigint);
2827 }
43ff13b4
JM
2828}
2829
2830/* Reinstall the usual SIGINT handlers, after the target has
2831 stopped. */
6426a772
JM
2832static void
2833cleanup_sigint_signal_handler (void *dummy)
43ff13b4
JM
2834{
2835 signal (SIGINT, handle_sigint);
2836 if (sigint_remote_twice_token)
c2c6d25f 2837 delete_async_signal_handler ((struct async_signal_handler **) & sigint_remote_twice_token);
43ff13b4 2838 if (sigint_remote_token)
c2c6d25f 2839 delete_async_signal_handler ((struct async_signal_handler **) & sigint_remote_token);
43ff13b4
JM
2840}
2841
c906108c
SS
2842/* Send ^C to target to halt it. Target will respond, and send us a
2843 packet. */
507f3c78 2844static void (*ofunc) (int);
c906108c 2845
7a292a7a
SS
2846/* The command line interface's stop routine. This function is installed
2847 as a signal handler for SIGINT. The first time a user requests a
2848 stop, we call remote_stop to send a break or ^C. If there is no
2849 response from the target (it didn't stop when the user requested it),
2850 we ask the user if he'd like to detach from the target. */
c906108c 2851static void
fba45db2 2852remote_interrupt (int signo)
c906108c 2853{
7a292a7a
SS
2854 /* If this doesn't work, try more severe steps. */
2855 signal (signo, remote_interrupt_twice);
2856
2857 if (remote_debug)
0f71a2f6 2858 fprintf_unfiltered (gdb_stdlog, "remote_interrupt called\n");
7a292a7a
SS
2859
2860 target_stop ();
2861}
2862
2863/* The user typed ^C twice. */
2864
2865static void
fba45db2 2866remote_interrupt_twice (int signo)
7a292a7a
SS
2867{
2868 signal (signo, ofunc);
2869 interrupt_query ();
c906108c
SS
2870 signal (signo, remote_interrupt);
2871}
7a292a7a
SS
2872
2873/* This is the generic stop called via the target vector. When a target
2874 interrupt is requested, either by the command line or the GUI, we
2875 will eventually end up here. */
c906108c 2876static void
fba45db2 2877remote_stop (void)
c906108c 2878{
7a292a7a
SS
2879 /* Send a break or a ^C, depending on user preference. */
2880 if (remote_debug)
0f71a2f6 2881 fprintf_unfiltered (gdb_stdlog, "remote_stop called\n");
c906108c 2882
7a292a7a 2883 if (remote_break)
2cd58942 2884 serial_send_break (remote_desc);
c906108c 2885 else
2cd58942 2886 serial_write (remote_desc, "\003", 1);
c906108c
SS
2887}
2888
2889/* Ask the user what to do when an interrupt is received. */
2890
2891static void
fba45db2 2892interrupt_query (void)
c906108c
SS
2893{
2894 target_terminal_ours ();
2895
2896 if (query ("Interrupted while waiting for the program.\n\
2897Give up (and stop debugging it)? "))
2898 {
2899 target_mourn_inferior ();
b5a2688f 2900 throw_exception (RETURN_QUIT);
c906108c
SS
2901 }
2902
2903 target_terminal_inferior ();
2904}
2905
6426a772
JM
2906/* Enable/disable target terminal ownership. Most targets can use
2907 terminal groups to control terminal ownership. Remote targets are
2908 different in that explicit transfer of ownership to/from GDB/target
2909 is required. */
2910
2911static void
2912remote_async_terminal_inferior (void)
2913{
2914 /* FIXME: cagney/1999-09-27: Shouldn't need to test for
2915 sync_execution here. This function should only be called when
2916 GDB is resuming the inferior in the forground. A background
2917 resume (``run&'') should leave GDB in control of the terminal and
2918 consequently should not call this code. */
2919 if (!sync_execution)
2920 return;
2921 /* FIXME: cagney/1999-09-27: Closely related to the above. Make
2922 calls target_terminal_*() idenpotent. The event-loop GDB talking
2923 to an asynchronous target with a synchronous command calls this
2924 function from both event-top.c and infrun.c/infcmd.c. Once GDB
2925 stops trying to transfer the terminal to the target when it
2926 shouldn't this guard can go away. */
2927 if (!remote_async_terminal_ours_p)
2928 return;
2929 delete_file_handler (input_fd);
2930 remote_async_terminal_ours_p = 0;
2931 initialize_sigint_signal_handler ();
2932 /* NOTE: At this point we could also register our selves as the
2933 recipient of all input. Any characters typed could then be
2934 passed on down to the target. */
2935}
2936
2937static void
2938remote_async_terminal_ours (void)
2939{
2940 /* See FIXME in remote_async_terminal_inferior. */
2941 if (!sync_execution)
2942 return;
2943 /* See FIXME in remote_async_terminal_inferior. */
2944 if (remote_async_terminal_ours_p)
2945 return;
2946 cleanup_sigint_signal_handler (NULL);
2947 add_file_handler (input_fd, stdin_event_handler, 0);
2948 remote_async_terminal_ours_p = 1;
2949}
2950
c906108c
SS
2951/* If nonzero, ignore the next kill. */
2952
2953int kill_kludge;
2954
2955void
917317f4 2956remote_console_output (char *msg)
c906108c
SS
2957{
2958 char *p;
2959
c5aa993b 2960 for (p = msg; p[0] && p[1]; p += 2)
c906108c
SS
2961 {
2962 char tb[2];
2963 char c = fromhex (p[0]) * 16 + fromhex (p[1]);
2964 tb[0] = c;
2965 tb[1] = 0;
43ff13b4 2966 fputs_unfiltered (tb, gdb_stdtarg);
c906108c 2967 }
917317f4 2968 gdb_flush (gdb_stdtarg);
c906108c
SS
2969}
2970
0f71a2f6
JM
2971/* Wait until the remote machine stops, then return,
2972 storing status in STATUS just as `wait' would.
2973 Returns "pid", which in the case of a multi-threaded
2974 remote OS, is the thread-id. */
c906108c 2975
39f77062
KB
2976static ptid_t
2977remote_wait (ptid_t ptid, struct target_waitstatus *status)
c906108c 2978{
d01949b6
AC
2979 struct remote_state *rs = get_remote_state ();
2980 unsigned char *buf = alloca (rs->remote_packet_size);
c906108c
SS
2981 int thread_num = -1;
2982
2983 status->kind = TARGET_WAITKIND_EXITED;
2984 status->value.integer = 0;
2985
2986 while (1)
2987 {
2988 unsigned char *p;
2989
c906108c 2990 ofunc = signal (SIGINT, remote_interrupt);
d01949b6 2991 getpkt (buf, (rs->remote_packet_size), 1);
c906108c
SS
2992 signal (SIGINT, ofunc);
2993
2994 /* This is a hook for when we need to do something (perhaps the
c5aa993b 2995 collection of trace data) every time the target stops. */
c906108c
SS
2996 if (target_wait_loop_hook)
2997 (*target_wait_loop_hook) ();
2998
2999 switch (buf[0])
3000 {
3001 case 'E': /* Error of some sort */
3002 warning ("Remote failure reply: %s", buf);
3003 continue;
3004 case 'T': /* Status with PC, SP, FP, ... */
3005 {
3006 int i;
e6cbd02a 3007 char* regs = (char*) alloca (MAX_REGISTER_RAW_SIZE);
c906108c
SS
3008
3009 /* Expedited reply, containing Signal, {regno, reg} repeat */
3010 /* format is: 'Tssn...:r...;n...:r...;n...:r...;#cc', where
c5aa993b
JM
3011 ss = signal number
3012 n... = register number
3013 r... = register contents
3014 */
c906108c
SS
3015 p = &buf[3]; /* after Txx */
3016
3017 while (*p)
3018 {
3019 unsigned char *p1;
3020 char *p_temp;
97345198 3021 int fieldsize;
c906108c 3022
ad10f812
AC
3023 /* Read the ``P'' register number. */
3024 LONGEST pnum = strtol ((const char *) p, &p_temp, 16);
c5aa993b 3025 p1 = (unsigned char *) p_temp;
c906108c 3026
c5aa993b 3027 if (p1 == p) /* No register number present here */
c906108c
SS
3028 {
3029 p1 = (unsigned char *) strchr ((const char *) p, ':');
3030 if (p1 == NULL)
3031 warning ("Malformed packet(a) (missing colon): %s\n\
3032Packet: '%s'\n",
3033 p, buf);
3034 if (strncmp ((const char *) p, "thread", p1 - p) == 0)
3035 {
3036 p_temp = unpack_varlen_hex (++p1, &thread_num);
3037 record_currthread (thread_num);
3038 p = (unsigned char *) p_temp;
3039 }
3040 }
3041 else
3042 {
ad10f812 3043 struct packet_reg *reg = packet_reg_from_pnum (rs, pnum);
c906108c
SS
3044 p = p1;
3045
3046 if (*p++ != ':')
3047 warning ("Malformed packet(b) (missing colon): %s\n\
3048Packet: '%s'\n",
3049 p, buf);
3050
ad10f812
AC
3051 if (reg == NULL)
3052 warning ("Remote sent bad register number %s: %s\n\
c906108c 3053Packet: '%s'\n",
ad10f812 3054 phex_nz (pnum, 0), p, buf);
c906108c 3055
ad10f812 3056 fieldsize = hex2bin (p, regs, REGISTER_RAW_SIZE (reg->regnum));
97345198 3057 p += 2 * fieldsize;
ad10f812 3058 if (fieldsize < REGISTER_RAW_SIZE (reg->regnum))
30559e10 3059 warning ("Remote reply is too short: %s", buf);
ad10f812 3060 supply_register (reg->regnum, regs);
c906108c
SS
3061 }
3062
3063 if (*p++ != ';')
3064 {
3065 warning ("Remote register badly formatted: %s", buf);
c5aa993b 3066 warning (" here: %s", p);
c906108c
SS
3067 }
3068 }
3069 }
3070 /* fall through */
3071 case 'S': /* Old style status, just signal only */
3072 status->kind = TARGET_WAITKIND_STOPPED;
3073 status->value.sig = (enum target_signal)
3074 (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
3075
0f71a2f6
JM
3076 if (buf[3] == 'p')
3077 {
3078 /* Export Cisco kernel mode as a convenience variable
c5aa993b 3079 (so that it can be used in the GDB prompt if desired). */
0f71a2f6
JM
3080
3081 if (cisco_kernel_mode == 1)
c5aa993b 3082 set_internalvar (lookup_internalvar ("cisco_kernel_mode"),
0f71a2f6
JM
3083 value_from_string ("PDEBUG-"));
3084 cisco_kernel_mode = 0;
3085 thread_num = strtol ((const char *) &buf[4], NULL, 16);
3086 record_currthread (thread_num);
3087 }
3088 else if (buf[3] == 'k')
3089 {
3090 /* Export Cisco kernel mode as a convenience variable
c5aa993b 3091 (so that it can be used in the GDB prompt if desired). */
0f71a2f6
JM
3092
3093 if (cisco_kernel_mode == 1)
c5aa993b 3094 set_internalvar (lookup_internalvar ("cisco_kernel_mode"),
0f71a2f6
JM
3095 value_from_string ("KDEBUG-"));
3096 cisco_kernel_mode = 1;
3097 }
c906108c 3098 goto got_status;
0f71a2f6
JM
3099 case 'N': /* Cisco special: status and offsets */
3100 {
3101 bfd_vma text_addr, data_addr, bss_addr;
3102 bfd_signed_vma text_off, data_off, bss_off;
3103 unsigned char *p1;
3104
3105 status->kind = TARGET_WAITKIND_STOPPED;
3106 status->value.sig = (enum target_signal)
3107 (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
3108
c5aa993b 3109 if (symfile_objfile == NULL)
0f71a2f6 3110 {
d4f3574e 3111 warning ("Relocation packet received with no symbol file. \
0f71a2f6
JM
3112Packet Dropped");
3113 goto got_status;
3114 }
3115
3116 /* Relocate object file. Buffer format is NAATT;DD;BB
3117 * where AA is the signal number, TT is the new text
3118 * address, DD * is the new data address, and BB is the
3119 * new bss address. */
3120
3121 p = &buf[3];
3122 text_addr = strtoul (p, (char **) &p1, 16);
3123 if (p1 == p || *p1 != ';')
3124 warning ("Malformed relocation packet: Packet '%s'", buf);
3125 p = p1 + 1;
3126 data_addr = strtoul (p, (char **) &p1, 16);
3127 if (p1 == p || *p1 != ';')
3128 warning ("Malformed relocation packet: Packet '%s'", buf);
3129 p = p1 + 1;
3130 bss_addr = strtoul (p, (char **) &p1, 16);
c5aa993b 3131 if (p1 == p)
0f71a2f6
JM
3132 warning ("Malformed relocation packet: Packet '%s'", buf);
3133
3134 if (remote_cisco_section_offsets (text_addr, data_addr, bss_addr,
3135 &text_off, &data_off, &bss_off)
3136 == 0)
c5aa993b 3137 if (text_off != 0 || data_off != 0 || bss_off != 0)
0f71a2f6
JM
3138 remote_cisco_objfile_relocate (text_off, data_off, bss_off);
3139
3140 goto got_status;
3141 }
c906108c
SS
3142 case 'W': /* Target exited */
3143 {
3144 /* The remote process exited. */
3145 status->kind = TARGET_WAITKIND_EXITED;
3146 status->value.integer = (fromhex (buf[1]) << 4) + fromhex (buf[2]);
3147 goto got_status;
3148 }
3149 case 'X':
3150 status->kind = TARGET_WAITKIND_SIGNALLED;
3151 status->value.sig = (enum target_signal)
3152 (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
3153 kill_kludge = 1;
3154
3155 goto got_status;
3156 case 'O': /* Console output */
3157 remote_console_output (buf + 1);
3158 continue;
3159 case '\0':
3160 if (last_sent_signal != TARGET_SIGNAL_0)
3161 {
3162 /* Zero length reply means that we tried 'S' or 'C' and
c5aa993b 3163 the remote system doesn't support it. */
c906108c
SS
3164 target_terminal_ours_for_output ();
3165 printf_filtered
3166 ("Can't send signals to this remote system. %s not sent.\n",
3167 target_signal_to_name (last_sent_signal));
3168 last_sent_signal = TARGET_SIGNAL_0;
3169 target_terminal_inferior ();
3170
3171 strcpy ((char *) buf, last_sent_step ? "s" : "c");
3172 putpkt ((char *) buf);
3173 continue;
3174 }
3175 /* else fallthrough */
3176 default:
3177 warning ("Invalid remote reply: %s", buf);
3178 continue;
3179 }
3180 }
c5aa993b 3181got_status:
c906108c
SS
3182 if (thread_num != -1)
3183 {
39f77062 3184 return pid_to_ptid (thread_num);
c906108c 3185 }
39f77062 3186 return inferior_ptid;
c906108c
SS
3187}
3188
43ff13b4 3189/* Async version of remote_wait. */
39f77062
KB
3190static ptid_t
3191remote_async_wait (ptid_t ptid, struct target_waitstatus *status)
43ff13b4 3192{
d01949b6
AC
3193 struct remote_state *rs = get_remote_state ();
3194 unsigned char *buf = alloca (rs->remote_packet_size);
43ff13b4
JM
3195 int thread_num = -1;
3196
3197 status->kind = TARGET_WAITKIND_EXITED;
3198 status->value.integer = 0;
3199
3200 while (1)
3201 {
3202 unsigned char *p;
c5aa993b 3203
ed9a39eb 3204 if (!target_is_async_p ())
43ff13b4 3205 ofunc = signal (SIGINT, remote_interrupt);
6426a772
JM
3206 /* FIXME: cagney/1999-09-27: If we're in async mode we should
3207 _never_ wait for ever -> test on target_is_async_p().
3208 However, before we do that we need to ensure that the caller
3209 knows how to take the target into/out of async mode. */
d01949b6 3210 getpkt (buf, (rs->remote_packet_size), wait_forever_enabled_p);
ed9a39eb 3211 if (!target_is_async_p ())
43ff13b4
JM
3212 signal (SIGINT, ofunc);
3213
3214 /* This is a hook for when we need to do something (perhaps the
c5aa993b 3215 collection of trace data) every time the target stops. */
43ff13b4
JM
3216 if (target_wait_loop_hook)
3217 (*target_wait_loop_hook) ();
3218
3219 switch (buf[0])
3220 {
3221 case 'E': /* Error of some sort */
3222 warning ("Remote failure reply: %s", buf);
3223 continue;
3224 case 'T': /* Status with PC, SP, FP, ... */
3225 {
3226 int i;
e6cbd02a 3227 char* regs = (char*) alloca (MAX_REGISTER_RAW_SIZE);
43ff13b4
JM
3228
3229 /* Expedited reply, containing Signal, {regno, reg} repeat */
3230 /* format is: 'Tssn...:r...;n...:r...;n...:r...;#cc', where
c5aa993b
JM
3231 ss = signal number
3232 n... = register number
3233 r... = register contents
3234 */
43ff13b4
JM
3235 p = &buf[3]; /* after Txx */
3236
3237 while (*p)
3238 {
3239 unsigned char *p1;
3240 char *p_temp;
6c3f2dbf 3241 int fieldsize;
43ff13b4
JM
3242
3243 /* Read the register number */
ad10f812 3244 long pnum = strtol ((const char *) p, &p_temp, 16);
c5aa993b 3245 p1 = (unsigned char *) p_temp;
43ff13b4 3246
c5aa993b 3247 if (p1 == p) /* No register number present here */
43ff13b4
JM
3248 {
3249 p1 = (unsigned char *) strchr ((const char *) p, ':');
3250 if (p1 == NULL)
3251 warning ("Malformed packet(a) (missing colon): %s\n\
3252Packet: '%s'\n",
3253 p, buf);
3254 if (strncmp ((const char *) p, "thread", p1 - p) == 0)
3255 {
3256 p_temp = unpack_varlen_hex (++p1, &thread_num);
3257 record_currthread (thread_num);
3258 p = (unsigned char *) p_temp;
3259 }
3260 }
3261 else
3262 {
ad10f812 3263 struct packet_reg *reg = packet_reg_from_pnum (rs, pnum);
43ff13b4 3264 p = p1;
43ff13b4
JM
3265 if (*p++ != ':')
3266 warning ("Malformed packet(b) (missing colon): %s\n\
3267Packet: '%s'\n",
3268 p, buf);
3269
ad10f812 3270 if (reg == NULL)
43ff13b4
JM
3271 warning ("Remote sent bad register number %ld: %s\n\
3272Packet: '%s'\n",
ad10f812 3273 pnum, p, buf);
43ff13b4 3274
ad10f812 3275 fieldsize = hex2bin (p, regs, REGISTER_RAW_SIZE (reg->regnum));
6c3f2dbf 3276 p += 2 * fieldsize;
ad10f812 3277 if (fieldsize < REGISTER_RAW_SIZE (reg->regnum))
30559e10 3278 warning ("Remote reply is too short: %s", buf);
ad10f812 3279 supply_register (reg->regnum, regs);
43ff13b4
JM
3280 }
3281
3282 if (*p++ != ';')
3283 {
3284 warning ("Remote register badly formatted: %s", buf);
c5aa993b 3285 warning (" here: %s", p);
43ff13b4
JM
3286 }
3287 }
3288 }
3289 /* fall through */
3290 case 'S': /* Old style status, just signal only */
3291 status->kind = TARGET_WAITKIND_STOPPED;
3292 status->value.sig = (enum target_signal)
3293 (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
3294
3295 if (buf[3] == 'p')
3296 {
3297 /* Export Cisco kernel mode as a convenience variable
c5aa993b 3298 (so that it can be used in the GDB prompt if desired). */
43ff13b4
JM
3299
3300 if (cisco_kernel_mode == 1)
c5aa993b 3301 set_internalvar (lookup_internalvar ("cisco_kernel_mode"),
43ff13b4
JM
3302 value_from_string ("PDEBUG-"));
3303 cisco_kernel_mode = 0;
3304 thread_num = strtol ((const char *) &buf[4], NULL, 16);
3305 record_currthread (thread_num);
3306 }
3307 else if (buf[3] == 'k')
3308 {
3309 /* Export Cisco kernel mode as a convenience variable
c5aa993b 3310 (so that it can be used in the GDB prompt if desired). */
43ff13b4
JM
3311
3312 if (cisco_kernel_mode == 1)
c5aa993b 3313 set_internalvar (lookup_internalvar ("cisco_kernel_mode"),
43ff13b4
JM
3314 value_from_string ("KDEBUG-"));
3315 cisco_kernel_mode = 1;
3316 }
3317 goto got_status;
3318 case 'N': /* Cisco special: status and offsets */
3319 {
3320 bfd_vma text_addr, data_addr, bss_addr;
3321 bfd_signed_vma text_off, data_off, bss_off;
3322 unsigned char *p1;
3323
3324 status->kind = TARGET_WAITKIND_STOPPED;
3325 status->value.sig = (enum target_signal)
3326 (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
3327
c5aa993b 3328 if (symfile_objfile == NULL)
43ff13b4
JM
3329 {
3330 warning ("Relocation packet recieved with no symbol file. \
3331Packet Dropped");
3332 goto got_status;
3333 }
3334
3335 /* Relocate object file. Buffer format is NAATT;DD;BB
3336 * where AA is the signal number, TT is the new text
3337 * address, DD * is the new data address, and BB is the
3338 * new bss address. */
3339
3340 p = &buf[3];
3341 text_addr = strtoul (p, (char **) &p1, 16);
3342 if (p1 == p || *p1 != ';')
3343 warning ("Malformed relocation packet: Packet '%s'", buf);
3344 p = p1 + 1;
3345 data_addr = strtoul (p, (char **) &p1, 16);
3346 if (p1 == p || *p1 != ';')
3347 warning ("Malformed relocation packet: Packet '%s'", buf);
3348 p = p1 + 1;
3349 bss_addr = strtoul (p, (char **) &p1, 16);
c5aa993b 3350 if (p1 == p)
43ff13b4
JM
3351 warning ("Malformed relocation packet: Packet '%s'", buf);
3352
3353 if (remote_cisco_section_offsets (text_addr, data_addr, bss_addr,
3354 &text_off, &data_off, &bss_off)
3355 == 0)
c5aa993b 3356 if (text_off != 0 || data_off != 0 || bss_off != 0)
43ff13b4
JM
3357 remote_cisco_objfile_relocate (text_off, data_off, bss_off);
3358
3359 goto got_status;
3360 }
3361 case 'W': /* Target exited */
3362 {
3363 /* The remote process exited. */
3364 status->kind = TARGET_WAITKIND_EXITED;
3365 status->value.integer = (fromhex (buf[1]) << 4) + fromhex (buf[2]);
3366 goto got_status;
3367 }
3368 case 'X':
3369 status->kind = TARGET_WAITKIND_SIGNALLED;
3370 status->value.sig = (enum target_signal)
3371 (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
3372 kill_kludge = 1;
3373
3374 goto got_status;
3375 case 'O': /* Console output */
3376 remote_console_output (buf + 1);
c4093a6a
JM
3377 /* Return immediately to the event loop. The event loop will
3378 still be waiting on the inferior afterwards. */
3379 status->kind = TARGET_WAITKIND_IGNORE;
3380 goto got_status;
43ff13b4
JM
3381 case '\0':
3382 if (last_sent_signal != TARGET_SIGNAL_0)
3383 {
3384 /* Zero length reply means that we tried 'S' or 'C' and
c5aa993b 3385 the remote system doesn't support it. */
43ff13b4
JM
3386 target_terminal_ours_for_output ();
3387 printf_filtered
3388 ("Can't send signals to this remote system. %s not sent.\n",
3389 target_signal_to_name (last_sent_signal));
3390 last_sent_signal = TARGET_SIGNAL_0;
3391 target_terminal_inferior ();
3392
3393 strcpy ((char *) buf, last_sent_step ? "s" : "c");
3394 putpkt ((char *) buf);
3395 continue;
3396 }
3397 /* else fallthrough */
3398 default:
3399 warning ("Invalid remote reply: %s", buf);
3400 continue;
3401 }
3402 }
c5aa993b 3403got_status:
43ff13b4
JM
3404 if (thread_num != -1)
3405 {
39f77062 3406 return pid_to_ptid (thread_num);
43ff13b4 3407 }
39f77062 3408 return inferior_ptid;
43ff13b4
JM
3409}
3410
c906108c
SS
3411/* Number of bytes of registers this stub implements. */
3412
3413static int register_bytes_found;
3414
3415/* Read the remote registers into the block REGS. */
ad10f812 3416/* Currently we just read all the registers, so we don't use regnum. */
c906108c
SS
3417
3418/* ARGSUSED */
3419static void
ad10f812 3420remote_fetch_registers (int regnum)
c906108c 3421{
d01949b6
AC
3422 struct remote_state *rs = get_remote_state ();
3423 char *buf = alloca (rs->remote_packet_size);
c906108c
SS
3424 int i;
3425 char *p;
ad10f812 3426 char *regs = alloca (rs->sizeof_g_packet);
c906108c 3427
39f77062 3428 set_thread (PIDGET (inferior_ptid), 1);
c906108c 3429
b323314b
AC
3430 if (regnum >= 0)
3431 {
3432 struct packet_reg *reg = packet_reg_from_regnum (rs, regnum);
3433 gdb_assert (reg != NULL);
3434 if (!reg->in_g_packet)
3435 internal_error (__FILE__, __LINE__,
3436 "Attempt to fetch a non G-packet register when this "
3437 "remote.c does not support the p-packet.");
3438 }
3439
c906108c 3440 sprintf (buf, "g");
d01949b6 3441 remote_send (buf, (rs->remote_packet_size));
c906108c 3442
11cf8741
JM
3443 /* Save the size of the packet sent to us by the target. Its used
3444 as a heuristic when determining the max size of packets that the
3445 target can safely receive. */
d01949b6
AC
3446 if ((rs->actual_register_packet_size) == 0)
3447 (rs->actual_register_packet_size) = strlen (buf);
c906108c
SS
3448
3449 /* Unimplemented registers read as all bits zero. */
ad10f812 3450 memset (regs, 0, rs->sizeof_g_packet);
c906108c
SS
3451
3452 /* We can get out of synch in various cases. If the first character
3453 in the buffer is not a hex character, assume that has happened
3454 and try to fetch another packet to read. */
3455 while ((buf[0] < '0' || buf[0] > '9')
3456 && (buf[0] < 'a' || buf[0] > 'f')
3457 && buf[0] != 'x') /* New: unavailable register value */
3458 {
3459 if (remote_debug)
0f71a2f6
JM
3460 fprintf_unfiltered (gdb_stdlog,
3461 "Bad register packet; fetching a new packet\n");
d01949b6 3462 getpkt (buf, (rs->remote_packet_size), 0);
c906108c
SS
3463 }
3464
3465 /* Reply describes registers byte by byte, each byte encoded as two
3466 hex characters. Suck them all up, then supply them to the
3467 register cacheing/storage mechanism. */
3468
3469 p = buf;
ad10f812 3470 for (i = 0; i < rs->sizeof_g_packet; i++)
c906108c
SS
3471 {
3472 if (p[0] == 0)
3473 break;
3474 if (p[1] == 0)
3475 {
3476 warning ("Remote reply is of odd length: %s", buf);
3477 /* Don't change register_bytes_found in this case, and don't
3478 print a second warning. */
3479 goto supply_them;
3480 }
3481 if (p[0] == 'x' && p[1] == 'x')
c5aa993b 3482 regs[i] = 0; /* 'x' */
c906108c
SS
3483 else
3484 regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
3485 p += 2;
3486 }
3487
3488 if (i != register_bytes_found)
3489 {
3490 register_bytes_found = i;
2649061d
AC
3491 if (REGISTER_BYTES_OK_P ()
3492 && !REGISTER_BYTES_OK (i))
c906108c 3493 warning ("Remote reply is too short: %s", buf);
c906108c 3494 }
c5aa993b 3495
b323314b 3496 supply_them:
ad10f812 3497 {
b323314b
AC
3498 int i;
3499 for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
ad10f812 3500 {
b323314b
AC
3501 struct packet_reg *r = &rs->regs[i];
3502 if (r->in_g_packet)
3503 {
3504 supply_register (r->regnum, regs + r->offset);
3505 if (buf[r->offset * 2] == 'x')
3506 set_register_cached (i, -1);
3507 }
ad10f812
AC
3508 }
3509 }
c906108c
SS
3510}
3511
3512/* Prepare to store registers. Since we may send them all (using a
3513 'G' request), we have to read out the ones we don't want to change
3514 first. */
3515
c5aa993b 3516static void
fba45db2 3517remote_prepare_to_store (void)
c906108c
SS
3518{
3519 /* Make sure the entire registers array is valid. */
5a2468f5
JM
3520 switch (remote_protocol_P.support)
3521 {
3522 case PACKET_DISABLE:
3523 case PACKET_SUPPORT_UNKNOWN:
ad10f812
AC
3524 /* NOTE: This isn't rs->sizeof_g_packet because here, we are
3525 forcing the register cache to read its and not the target
3526 registers. */
3527 read_register_bytes (0, (char *) NULL, REGISTER_BYTES); /* OK use. */
5a2468f5
JM
3528 break;
3529 case PACKET_ENABLE:
3530 break;
3531 }
3532}
3533
ad10f812 3534/* Helper: Attempt to store REGNUM using the P packet. Return fail IFF
5a2468f5
JM
3535 packet was not recognized. */
3536
3537static int
ad10f812 3538store_register_using_P (int regnum)
5a2468f5 3539{
d01949b6 3540 struct remote_state *rs = get_remote_state ();
ad10f812 3541 struct packet_reg *reg = packet_reg_from_regnum (rs, regnum);
5a2468f5 3542 /* Try storing a single register. */
d01949b6 3543 char *buf = alloca (rs->remote_packet_size);
193cb69f 3544 char *regp = alloca (MAX_REGISTER_RAW_SIZE);
5a2468f5
JM
3545 char *p;
3546 int i;
3547
ad10f812 3548 sprintf (buf, "P%s=", phex_nz (reg->pnum, 0));
5a2468f5 3549 p = buf + strlen (buf);
ad10f812
AC
3550 regcache_collect (reg->regnum, regp);
3551 bin2hex (regp, p, REGISTER_RAW_SIZE (reg->regnum));
3552 remote_send (buf, rs->remote_packet_size);
5a2468f5
JM
3553
3554 return buf[0] != '\0';
c906108c
SS
3555}
3556
5a2468f5 3557
ad10f812 3558/* Store register REGNUM, or all registers if REGNUM == -1, from the contents
7302a204 3559 of the register cache buffer. FIXME: ignores errors. */
c906108c
SS
3560
3561static void
ad10f812 3562remote_store_registers (int regnum)
c906108c 3563{
d01949b6 3564 struct remote_state *rs = get_remote_state ();
193cb69f
AC
3565 char *buf;
3566 char *regs;
c906108c
SS
3567 int i;
3568 char *p;
3569
39f77062 3570 set_thread (PIDGET (inferior_ptid), 1);
c906108c 3571
ad10f812 3572 if (regnum >= 0)
c906108c 3573 {
5a2468f5 3574 switch (remote_protocol_P.support)
c906108c 3575 {
5a2468f5
JM
3576 case PACKET_DISABLE:
3577 break;
3578 case PACKET_ENABLE:
ad10f812 3579 if (store_register_using_P (regnum))
5a2468f5
JM
3580 return;
3581 else
3582 error ("Protocol error: P packet not recognized by stub");
3583 case PACKET_SUPPORT_UNKNOWN:
ad10f812 3584 if (store_register_using_P (regnum))
5a2468f5
JM
3585 {
3586 /* The stub recognized the 'P' packet. Remember this. */
3587 remote_protocol_P.support = PACKET_ENABLE;
3588 return;
3589 }
3590 else
3591 {
3592 /* The stub does not support the 'P' packet. Use 'G'
3593 instead, and don't try using 'P' in the future (it
3594 will just waste our time). */
3595 remote_protocol_P.support = PACKET_DISABLE;
3596 break;
3597 }
c906108c 3598 }
c906108c
SS
3599 }
3600
193cb69f
AC
3601 /* Extract all the registers in the regcache copying them into a
3602 local buffer. */
3603 {
b323314b 3604 int i;
ad10f812
AC
3605 regs = alloca (rs->sizeof_g_packet);
3606 memset (regs, rs->sizeof_g_packet, 0);
b323314b 3607 for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
193cb69f 3608 {
b323314b
AC
3609 struct packet_reg *r = &rs->regs[i];
3610 if (r->in_g_packet)
3611 regcache_collect (r->regnum, regs + r->offset);
193cb69f
AC
3612 }
3613 }
c906108c
SS
3614
3615 /* Command describes registers byte by byte,
3616 each byte encoded as two hex characters. */
193cb69f
AC
3617 buf = alloca (rs->remote_packet_size);
3618 p = buf;
3619 *p++ = 'G';
c906108c 3620 /* remote_prepare_to_store insures that register_bytes_found gets set. */
30559e10 3621 bin2hex (regs, p, register_bytes_found);
d01949b6 3622 remote_send (buf, (rs->remote_packet_size));
c906108c 3623}
c906108c
SS
3624\f
3625
3626/* Return the number of hex digits in num. */
3627
3628static int
fba45db2 3629hexnumlen (ULONGEST num)
c906108c
SS
3630{
3631 int i;
3632
3633 for (i = 0; num != 0; i++)
3634 num >>= 4;
3635
3636 return max (i, 1);
3637}
3638
2df3850c 3639/* Set BUF to the minimum number of hex digits representing NUM. */
c906108c
SS
3640
3641static int
fba45db2 3642hexnumstr (char *buf, ULONGEST num)
c906108c 3643{
c906108c 3644 int len = hexnumlen (num);
2df3850c
JM
3645 return hexnumnstr (buf, num, len);
3646}
3647
c906108c 3648
2df3850c 3649/* Set BUF to the hex digits representing NUM, padded to WIDTH characters. */
c906108c 3650
2df3850c 3651static int
fba45db2 3652hexnumnstr (char *buf, ULONGEST num, int width)
2df3850c
JM
3653{
3654 int i;
3655
3656 buf[width] = '\0';
3657
3658 for (i = width - 1; i >= 0; i--)
c906108c 3659 {
c5aa993b 3660 buf[i] = "0123456789abcdef"[(num & 0xf)];
c906108c
SS
3661 num >>= 4;
3662 }
3663
2df3850c 3664 return width;
c906108c
SS
3665}
3666
3667/* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */
3668
3669static CORE_ADDR
fba45db2 3670remote_address_masked (CORE_ADDR addr)
c906108c
SS
3671{
3672 if (remote_address_size > 0
3673 && remote_address_size < (sizeof (ULONGEST) * 8))
3674 {
3675 /* Only create a mask when that mask can safely be constructed
3676 in a ULONGEST variable. */
3677 ULONGEST mask = 1;
3678 mask = (mask << remote_address_size) - 1;
3679 addr &= mask;
3680 }
3681 return addr;
3682}
3683
3684/* Determine whether the remote target supports binary downloading.
3685 This is accomplished by sending a no-op memory write of zero length
3686 to the target at the specified address. It does not suffice to send
3687 the whole packet, since many stubs strip the eighth bit and subsequently
7a292a7a
SS
3688 compute a wrong checksum, which causes real havoc with remote_write_bytes.
3689
96baa820
JM
3690 NOTE: This can still lose if the serial line is not eight-bit
3691 clean. In cases like this, the user should clear "remote
3692 X-packet". */
3693
c906108c 3694static void
fba45db2 3695check_binary_download (CORE_ADDR addr)
c906108c 3696{
d01949b6 3697 struct remote_state *rs = get_remote_state ();
96baa820 3698 switch (remote_protocol_binary_download.support)
c906108c 3699 {
96baa820
JM
3700 case PACKET_DISABLE:
3701 break;
3702 case PACKET_ENABLE:
3703 break;
3704 case PACKET_SUPPORT_UNKNOWN:
3705 {
d01949b6 3706 char *buf = alloca (rs->remote_packet_size);
96baa820
JM
3707 char *p;
3708
3709 p = buf;
3710 *p++ = 'X';
3711 p += hexnumstr (p, (ULONGEST) addr);
3712 *p++ = ',';
3713 p += hexnumstr (p, (ULONGEST) 0);
3714 *p++ = ':';
3715 *p = '\0';
3716
3717 putpkt_binary (buf, (int) (p - buf));
d01949b6 3718 getpkt (buf, (rs->remote_packet_size), 0);
c906108c 3719
96baa820
JM
3720 if (buf[0] == '\0')
3721 {
3722 if (remote_debug)
3723 fprintf_unfiltered (gdb_stdlog,
3724 "binary downloading NOT suppported by target\n");
3725 remote_protocol_binary_download.support = PACKET_DISABLE;
3726 }
3727 else
3728 {
3729 if (remote_debug)
3730 fprintf_unfiltered (gdb_stdlog,
3731 "binary downloading suppported by target\n");
3732 remote_protocol_binary_download.support = PACKET_ENABLE;
3733 }
3734 break;
3735 }
c906108c
SS
3736 }
3737}
3738
3739/* Write memory data directly to the remote machine.
3740 This does not inform the data cache; the data cache uses this.
3741 MEMADDR is the address in the remote memory space.
3742 MYADDR is the address of the buffer in our space.
3743 LEN is the number of bytes.
3744
917317f4
JM
3745 Returns number of bytes transferred, or 0 (setting errno) for
3746 error. Only transfer a single packet. */
c906108c
SS
3747
3748static int
917317f4 3749remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
c906108c 3750{
917317f4 3751 unsigned char *buf;
c906108c 3752 int max_buf_size; /* Max size of packet output buffer */
917317f4
JM
3753 unsigned char *p;
3754 unsigned char *plen;
c2d11a7d 3755 long sizeof_buf;
917317f4
JM
3756 int plenlen;
3757 int todo;
3758 int nr_bytes;
c906108c
SS
3759
3760 /* Verify that the target can support a binary download */
3761 check_binary_download (memaddr);
3762
917317f4 3763 /* Determine the max packet size. */
11cf8741 3764 max_buf_size = get_memory_write_packet_size ();
c2d11a7d
JM
3765 sizeof_buf = max_buf_size + 1; /* Space for trailing NUL */
3766 buf = alloca (sizeof_buf);
c906108c 3767
7a292a7a 3768 /* Subtract header overhead from max payload size - $M<memaddr>,<len>:#nn */
c906108c
SS
3769 max_buf_size -= 2 + hexnumlen (memaddr + len - 1) + 1 + hexnumlen (len) + 4;
3770
917317f4
JM
3771 /* construct "M"<memaddr>","<len>":" */
3772 /* sprintf (buf, "M%lx,%x:", (unsigned long) memaddr, todo); */
3773 p = buf;
3774
3775 /* Append [XM]. Compute a best guess of the number of bytes
3776 actually transfered. */
3777 switch (remote_protocol_binary_download.support)
c906108c 3778 {
917317f4
JM
3779 case PACKET_ENABLE:
3780 *p++ = 'X';
3781 /* Best guess at number of bytes that will fit. */
3782 todo = min (len, max_buf_size);
3783 break;
3784 case PACKET_DISABLE:
3785 *p++ = 'M';
3786 /* num bytes that will fit */
3787 todo = min (len, max_buf_size / 2);
3788 break;
3789 case PACKET_SUPPORT_UNKNOWN:
8e65ff28
AC
3790 internal_error (__FILE__, __LINE__,
3791 "remote_write_bytes: bad internal state");
7f7e9482 3792 default:
8e65ff28 3793 internal_error (__FILE__, __LINE__, "bad switch");
917317f4
JM
3794 }
3795
3796 /* Append <memaddr> */
3797 memaddr = remote_address_masked (memaddr);
3798 p += hexnumstr (p, (ULONGEST) memaddr);
3799 *p++ = ',';
3800
3801 /* Append <len>. Retain the location/size of <len>. It may
3802 need to be adjusted once the packet body has been created. */
3803 plen = p;
3804 plenlen = hexnumstr (p, (ULONGEST) todo);
3805 p += plenlen;
3806 *p++ = ':';
3807 *p = '\0';
3808
3809 /* Append the packet body. */
3810 switch (remote_protocol_binary_download.support)
3811 {
3812 case PACKET_ENABLE:
3813 /* Binary mode. Send target system values byte by byte, in
3814 increasing byte addresses. Only escape certain critical
3815 characters. */
3816 for (nr_bytes = 0;
3817 (nr_bytes < todo) && (p - buf) < (max_buf_size - 2);
3818 nr_bytes++)
c906108c 3819 {
917317f4
JM
3820 switch (myaddr[nr_bytes] & 0xff)
3821 {
3822 case '$':
3823 case '#':
3824 case 0x7d:
3825 /* These must be escaped */
3826 *p++ = 0x7d;
3827 *p++ = (myaddr[nr_bytes] & 0xff) ^ 0x20;
3828 break;
3829 default:
3830 *p++ = myaddr[nr_bytes] & 0xff;
3831 break;
3832 }
c906108c 3833 }
917317f4 3834 if (nr_bytes < todo)
c906108c 3835 {
917317f4
JM
3836 /* Escape chars have filled up the buffer prematurely,
3837 and we have actually sent fewer bytes than planned.
3838 Fix-up the length field of the packet. Use the same
3839 number of characters as before. */
3840
3841 plen += hexnumnstr (plen, (ULONGEST) nr_bytes, plenlen);
3842 *plen = ':'; /* overwrite \0 from hexnumnstr() */
c906108c 3843 }
917317f4
JM
3844 break;
3845 case PACKET_DISABLE:
3846 /* Normal mode: Send target system values byte by byte, in
3847 increasing byte addresses. Each byte is encoded as a two hex
3848 value. */
2644f393 3849 nr_bytes = bin2hex (myaddr, p, todo);
aa6c0017 3850 p += 2 * nr_bytes;
917317f4
JM
3851 break;
3852 case PACKET_SUPPORT_UNKNOWN:
8e65ff28
AC
3853 internal_error (__FILE__, __LINE__,
3854 "remote_write_bytes: bad internal state");
7f7e9482 3855 default:
8e65ff28 3856 internal_error (__FILE__, __LINE__, "bad switch");
c906108c 3857 }
917317f4
JM
3858
3859 putpkt_binary (buf, (int) (p - buf));
c2d11a7d 3860 getpkt (buf, sizeof_buf, 0);
917317f4
JM
3861
3862 if (buf[0] == 'E')
3863 {
3864 /* There is no correspondance between what the remote protocol
3865 uses for errors and errno codes. We would like a cleaner way
3866 of representing errors (big enough to include errno codes,
3867 bfd_error codes, and others). But for now just return EIO. */
3868 errno = EIO;
3869 return 0;
3870 }
3871
3872 /* Return NR_BYTES, not TODO, in case escape chars caused us to send fewer
3873 bytes than we'd planned. */
3874 return nr_bytes;
c906108c
SS
3875}
3876
3877/* Read memory data directly from the remote machine.
3878 This does not use the data cache; the data cache uses this.
3879 MEMADDR is the address in the remote memory space.
3880 MYADDR is the address of the buffer in our space.
3881 LEN is the number of bytes.
3882
3883 Returns number of bytes transferred, or 0 for error. */
3884
917317f4
JM
3885/* NOTE: cagney/1999-10-18: This function (and its siblings in other
3886 remote targets) shouldn't attempt to read the entire buffer.
3887 Instead it should read a single packet worth of data and then
3888 return the byte size of that packet to the caller. The caller (its
3889 caller and its callers caller ;-) already contains code for
3890 handling partial reads. */
3891
c906108c 3892static int
fba45db2 3893remote_read_bytes (CORE_ADDR memaddr, char *myaddr, int len)
c906108c 3894{
11cf8741 3895 char *buf;
c906108c 3896 int max_buf_size; /* Max size of packet output buffer */
c2d11a7d 3897 long sizeof_buf;
c906108c
SS
3898 int origlen;
3899
11cf8741
JM
3900 /* Create a buffer big enough for this packet. */
3901 max_buf_size = get_memory_read_packet_size ();
c2d11a7d
JM
3902 sizeof_buf = max_buf_size + 1; /* Space for trailing NUL */
3903 buf = alloca (sizeof_buf);
c906108c
SS
3904
3905 origlen = len;
3906 while (len > 0)
3907 {
c906108c
SS
3908 char *p;
3909 int todo;
3910 int i;
3911
c5aa993b 3912 todo = min (len, max_buf_size / 2); /* num bytes that will fit */
c906108c
SS
3913
3914 /* construct "m"<memaddr>","<len>" */
3915 /* sprintf (buf, "m%lx,%x", (unsigned long) memaddr, todo); */
3916 memaddr = remote_address_masked (memaddr);
3917 p = buf;
3918 *p++ = 'm';
3919 p += hexnumstr (p, (ULONGEST) memaddr);
3920 *p++ = ',';
3921 p += hexnumstr (p, (ULONGEST) todo);
3922 *p = '\0';
3923
3924 putpkt (buf);
c2d11a7d 3925 getpkt (buf, sizeof_buf, 0);
c906108c
SS
3926
3927 if (buf[0] == 'E')
3928 {
3929 /* There is no correspondance between what the remote protocol uses
3930 for errors and errno codes. We would like a cleaner way of
3931 representing errors (big enough to include errno codes, bfd_error
3932 codes, and others). But for now just return EIO. */
3933 errno = EIO;
3934 return 0;
3935 }
3936
c5aa993b
JM
3937 /* Reply describes memory byte by byte,
3938 each byte encoded as two hex characters. */
c906108c
SS
3939
3940 p = buf;
30559e10 3941 if ((i = hex2bin (p, myaddr, todo)) < todo)
c906108c 3942 {
30559e10
MS
3943 /* Reply is short. This means that we were able to read
3944 only part of what we wanted to. */
3945 return i + (origlen - len);
c906108c
SS
3946 }
3947 myaddr += todo;
3948 memaddr += todo;
3949 len -= todo;
3950 }
3951 return origlen;
3952}
3953\f
3954/* Read or write LEN bytes from inferior memory at MEMADDR,
392a587b
JM
3955 transferring to or from debugger address BUFFER. Write to inferior if
3956 SHOULD_WRITE is nonzero. Returns length of data written or read; 0
c338868a 3957 for error. TARGET is unused. */
392a587b 3958
c906108c
SS
3959/* ARGSUSED */
3960static int
c338868a 3961remote_xfer_memory (CORE_ADDR mem_addr, char *buffer, int mem_len,
0a65a603 3962 int should_write, struct mem_attrib *attrib,
29e57380 3963 struct target_ops *target)
c906108c 3964{
392a587b
JM
3965 CORE_ADDR targ_addr;
3966 int targ_len;
4930751a
C
3967 int res;
3968
392a587b
JM
3969 REMOTE_TRANSLATE_XFER_ADDRESS (mem_addr, mem_len, &targ_addr, &targ_len);
3970 if (targ_len <= 0)
c906108c 3971 return 0;
c906108c 3972
4930751a
C
3973 if (should_write)
3974 res = remote_write_bytes (targ_addr, buffer, targ_len);
3975 else
3976 res = remote_read_bytes (targ_addr, buffer, targ_len);
3977
3978 return res;
c906108c
SS
3979}
3980
c5aa993b 3981
c906108c
SS
3982#if 0
3983/* Enable after 4.12. */
3984
3985void
c338868a
KB
3986remote_search (int len, char *data, char *mask, CORE_ADDR startaddr,
3987 int increment, CORE_ADDR lorange, CORE_ADDR hirange,
3988 CORE_ADDR *addr_found, char *data_found)
c906108c
SS
3989{
3990 if (increment == -4 && len == 4)
3991 {
3992 long mask_long, data_long;
3993 long data_found_long;
3994 CORE_ADDR addr_we_found;
d01949b6 3995 char *buf = alloca (rs->remote_packet_size);
c906108c
SS
3996 long returned_long[2];
3997 char *p;
3998
3999 mask_long = extract_unsigned_integer (mask, len);
4000 data_long = extract_unsigned_integer (data, len);
4001 sprintf (buf, "t%x:%x,%x", startaddr, data_long, mask_long);
4002 putpkt (buf);
d01949b6 4003 getpkt (buf, (rs->remote_packet_size), 0);
c906108c
SS
4004 if (buf[0] == '\0')
4005 {
4006 /* The stub doesn't support the 't' request. We might want to
4007 remember this fact, but on the other hand the stub could be
4008 switched on us. Maybe we should remember it only until
4009 the next "target remote". */
4010 generic_search (len, data, mask, startaddr, increment, lorange,
4011 hirange, addr_found, data_found);
4012 return;
4013 }
4014
4015 if (buf[0] == 'E')
4016 /* There is no correspondance between what the remote protocol uses
4017 for errors and errno codes. We would like a cleaner way of
4018 representing errors (big enough to include errno codes, bfd_error
4019 codes, and others). But for now just use EIO. */
4020 memory_error (EIO, startaddr);
4021 p = buf;
4022 addr_we_found = 0;
4023 while (*p != '\0' && *p != ',')
4024 addr_we_found = (addr_we_found << 4) + fromhex (*p++);
4025 if (*p == '\0')
4026 error ("Protocol error: short return for search");
4027
4028 data_found_long = 0;
4029 while (*p != '\0' && *p != ',')
4030 data_found_long = (data_found_long << 4) + fromhex (*p++);
4031 /* Ignore anything after this comma, for future extensions. */
4032
4033 if (addr_we_found < lorange || addr_we_found >= hirange)
4034 {
4035 *addr_found = 0;
4036 return;
4037 }
4038
4039 *addr_found = addr_we_found;
4040 *data_found = store_unsigned_integer (data_we_found, len);
4041 return;
4042 }
4043 generic_search (len, data, mask, startaddr, increment, lorange,
4044 hirange, addr_found, data_found);
4045}
4046#endif /* 0 */
4047\f
4048static void
fba45db2 4049remote_files_info (struct target_ops *ignore)
c906108c
SS
4050{
4051 puts_filtered ("Debugging a target over a serial line.\n");
4052}
4053\f
4054/* Stuff for dealing with the packets which are part of this protocol.
4055 See comment at top of file for details. */
4056
4057/* Read a single character from the remote end, masking it down to 7 bits. */
4058
4059static int
fba45db2 4060readchar (int timeout)
c906108c
SS
4061{
4062 int ch;
4063
2cd58942 4064 ch = serial_readchar (remote_desc, timeout);
c906108c 4065
2acceee2
JM
4066 if (ch >= 0)
4067 return (ch & 0x7f);
4068
4069 switch ((enum serial_rc) ch)
c906108c
SS
4070 {
4071 case SERIAL_EOF:
2acceee2 4072 target_mourn_inferior ();
c906108c 4073 error ("Remote connection closed");
2acceee2 4074 /* no return */
c906108c
SS
4075 case SERIAL_ERROR:
4076 perror_with_name ("Remote communication error");
2acceee2 4077 /* no return */
c906108c 4078 case SERIAL_TIMEOUT:
2acceee2 4079 break;
c906108c 4080 }
2acceee2 4081 return ch;
c906108c
SS
4082}
4083
4084/* Send the command in BUF to the remote machine, and read the reply
4085 into BUF. Report an error if we get an error reply. */
4086
4087static void
c2d11a7d
JM
4088remote_send (char *buf,
4089 long sizeof_buf)
c906108c
SS
4090{
4091 putpkt (buf);
c2d11a7d 4092 getpkt (buf, sizeof_buf, 0);
c906108c
SS
4093
4094 if (buf[0] == 'E')
4095 error ("Remote failure reply: %s", buf);
4096}
4097
4098/* Display a null-terminated packet on stdout, for debugging, using C
4099 string notation. */
4100
4101static void
fba45db2 4102print_packet (char *buf)
c906108c
SS
4103{
4104 puts_filtered ("\"");
43e526b9 4105 fputstr_filtered (buf, '"', gdb_stdout);
c906108c
SS
4106 puts_filtered ("\"");
4107}
4108
4109int
fba45db2 4110putpkt (char *buf)
c906108c
SS
4111{
4112 return putpkt_binary (buf, strlen (buf));
4113}
4114
4115/* Send a packet to the remote machine, with error checking. The data
d01949b6 4116 of the packet is in BUF. The string in BUF can be at most (rs->remote_packet_size) - 5
c906108c
SS
4117 to account for the $, # and checksum, and for a possible /0 if we are
4118 debugging (remote_debug) and want to print the sent packet as a string */
4119
4120static int
fba45db2 4121putpkt_binary (char *buf, int cnt)
c906108c 4122{
d01949b6 4123 struct remote_state *rs = get_remote_state ();
c906108c
SS
4124 int i;
4125 unsigned char csum = 0;
11cf8741 4126 char *buf2 = alloca (cnt + 6);
d01949b6 4127 long sizeof_junkbuf = (rs->remote_packet_size);
c2d11a7d 4128 char *junkbuf = alloca (sizeof_junkbuf);
085dd6e6 4129
c906108c
SS
4130 int ch;
4131 int tcount = 0;
4132 char *p;
4133
4134 /* Copy the packet into buffer BUF2, encapsulating it
4135 and giving it a checksum. */
4136
c906108c
SS
4137 p = buf2;
4138 *p++ = '$';
4139
4140 for (i = 0; i < cnt; i++)
4141 {
4142 csum += buf[i];
4143 *p++ = buf[i];
4144 }
4145 *p++ = '#';
4146 *p++ = tohex ((csum >> 4) & 0xf);
4147 *p++ = tohex (csum & 0xf);
4148
4149 /* Send it over and over until we get a positive ack. */
4150
4151 while (1)
4152 {
4153 int started_error_output = 0;
4154
4155 if (remote_debug)
4156 {
4157 *p = '\0';
43e526b9
JM
4158 fprintf_unfiltered (gdb_stdlog, "Sending packet: ");
4159 fputstrn_unfiltered (buf2, p - buf2, 0, gdb_stdlog);
d4f3574e 4160 fprintf_unfiltered (gdb_stdlog, "...");
0f71a2f6 4161 gdb_flush (gdb_stdlog);
c906108c 4162 }
2cd58942 4163 if (serial_write (remote_desc, buf2, p - buf2))
c906108c
SS
4164 perror_with_name ("putpkt: write failed");
4165
4166 /* read until either a timeout occurs (-2) or '+' is read */
4167 while (1)
4168 {
4169 ch = readchar (remote_timeout);
4170
c5aa993b 4171 if (remote_debug)
c906108c
SS
4172 {
4173 switch (ch)
4174 {
4175 case '+':
1216fa2c 4176 case '-':
c906108c
SS
4177 case SERIAL_TIMEOUT:
4178 case '$':
4179 if (started_error_output)
4180 {
4181 putchar_unfiltered ('\n');
4182 started_error_output = 0;
4183 }
4184 }
4185 }
4186
4187 switch (ch)
4188 {
4189 case '+':
4190 if (remote_debug)
0f71a2f6 4191 fprintf_unfiltered (gdb_stdlog, "Ack\n");
c906108c 4192 return 1;
1216fa2c
AC
4193 case '-':
4194 if (remote_debug)
4195 fprintf_unfiltered (gdb_stdlog, "Nak\n");
c906108c 4196 case SERIAL_TIMEOUT:
c5aa993b 4197 tcount++;
c906108c
SS
4198 if (tcount > 3)
4199 return 0;
4200 break; /* Retransmit buffer */
4201 case '$':
4202 {
40e3f985
FN
4203 if (remote_debug)
4204 fprintf_unfiltered (gdb_stdlog, "Packet instead of Ack, ignoring it\n");
c5aa993b
JM
4205 /* It's probably an old response, and we're out of sync.
4206 Just gobble up the packet and ignore it. */
40e3f985 4207 read_frame (junkbuf, sizeof_junkbuf);
c5aa993b 4208 continue; /* Now, go look for + */
c906108c
SS
4209 }
4210 default:
4211 if (remote_debug)
4212 {
4213 if (!started_error_output)
4214 {
4215 started_error_output = 1;
0f71a2f6 4216 fprintf_unfiltered (gdb_stdlog, "putpkt: Junk: ");
c906108c 4217 }
0f71a2f6 4218 fputc_unfiltered (ch & 0177, gdb_stdlog);
c906108c
SS
4219 }
4220 continue;
4221 }
4222 break; /* Here to retransmit */
4223 }
4224
4225#if 0
4226 /* This is wrong. If doing a long backtrace, the user should be
c5aa993b
JM
4227 able to get out next time we call QUIT, without anything as
4228 violent as interrupt_query. If we want to provide a way out of
4229 here without getting to the next QUIT, it should be based on
4230 hitting ^C twice as in remote_wait. */
c906108c
SS
4231 if (quit_flag)
4232 {
4233 quit_flag = 0;
4234 interrupt_query ();
4235 }
4236#endif
4237 }
4238}
4239
0f71a2f6
JM
4240static int remote_cisco_mode;
4241
c906108c
SS
4242/* Come here after finding the start of the frame. Collect the rest
4243 into BUF, verifying the checksum, length, and handling run-length
c2d11a7d
JM
4244 compression. No more than sizeof_buf-1 characters are read so that
4245 the buffer can be NUL terminated.
c906108c 4246
c2d11a7d
JM
4247 Returns -1 on error, number of characters in buffer (ignoring the
4248 trailing NULL) on success. (could be extended to return one of the
4249 SERIAL status indications). */
4250
4251static long
4252read_frame (char *buf,
4253 long sizeof_buf)
c906108c
SS
4254{
4255 unsigned char csum;
c2d11a7d 4256 long bc;
c906108c
SS
4257 int c;
4258
4259 csum = 0;
c2d11a7d 4260 bc = 0;
c906108c
SS
4261
4262 while (1)
4263 {
c2d11a7d 4264 /* ASSERT (bc < sizeof_buf - 1) - space for trailing NUL */
c906108c 4265 c = readchar (remote_timeout);
c906108c
SS
4266 switch (c)
4267 {
4268 case SERIAL_TIMEOUT:
4269 if (remote_debug)
0f71a2f6 4270 fputs_filtered ("Timeout in mid-packet, retrying\n", gdb_stdlog);
c2d11a7d 4271 return -1;
c906108c
SS
4272 case '$':
4273 if (remote_debug)
0f71a2f6
JM
4274 fputs_filtered ("Saw new packet start in middle of old one\n",
4275 gdb_stdlog);
c2d11a7d 4276 return -1; /* Start a new packet, count retries */
c906108c
SS
4277 case '#':
4278 {
4279 unsigned char pktcsum;
e1b09194
AC
4280 int check_0 = 0;
4281 int check_1 = 0;
c906108c 4282
c2d11a7d 4283 buf[bc] = '\0';
c906108c 4284
e1b09194
AC
4285 check_0 = readchar (remote_timeout);
4286 if (check_0 >= 0)
4287 check_1 = readchar (remote_timeout);
4288
4289 if (check_0 == SERIAL_TIMEOUT || check_1 == SERIAL_TIMEOUT)
4290 {
4291 if (remote_debug)
4292 fputs_filtered ("Timeout in checksum, retrying\n", gdb_stdlog);
4293 return -1;
4294 }
4295 else if (check_0 < 0 || check_1 < 0)
40e3f985
FN
4296 {
4297 if (remote_debug)
4298 fputs_filtered ("Communication error in checksum\n", gdb_stdlog);
4299 return -1;
4300 }
c906108c 4301
e1b09194 4302 pktcsum = (fromhex (check_0) << 4) | fromhex (check_1);
c906108c 4303 if (csum == pktcsum)
c2d11a7d 4304 return bc;
c906108c 4305
c5aa993b 4306 if (remote_debug)
c906108c 4307 {
0f71a2f6 4308 fprintf_filtered (gdb_stdlog,
c5aa993b 4309 "Bad checksum, sentsum=0x%x, csum=0x%x, buf=",
0f71a2f6
JM
4310 pktcsum, csum);
4311 fputs_filtered (buf, gdb_stdlog);
4312 fputs_filtered ("\n", gdb_stdlog);
c906108c 4313 }
c2d11a7d
JM
4314 /* Number of characters in buffer ignoring trailing
4315 NUL. */
4316 return -1;
c906108c
SS
4317 }
4318 case '*': /* Run length encoding */
c2c6d25f
JM
4319 {
4320 int repeat;
4321 csum += c;
c906108c 4322
c2c6d25f
JM
4323 if (remote_cisco_mode == 0)
4324 {
4325 c = readchar (remote_timeout);
4326 csum += c;
4327 repeat = c - ' ' + 3; /* Compute repeat count */
4328 }
4329 else
4330 {
4331 /* Cisco's run-length encoding variant uses two
4332 hex chars to represent the repeat count. */
4333
4334 c = readchar (remote_timeout);
4335 csum += c;
4336 repeat = fromhex (c) << 4;
4337 c = readchar (remote_timeout);
4338 csum += c;
4339 repeat += fromhex (c);
4340 }
c906108c 4341
c2d11a7d
JM
4342 /* The character before ``*'' is repeated. */
4343
c2c6d25f 4344 if (repeat > 0 && repeat <= 255
c2d11a7d 4345 && bc > 0
fb6e5c55 4346 && bc + repeat - 1 < sizeof_buf - 1)
c2c6d25f 4347 {
c2d11a7d
JM
4348 memset (&buf[bc], buf[bc - 1], repeat);
4349 bc += repeat;
c2c6d25f
JM
4350 continue;
4351 }
4352
c2d11a7d 4353 buf[bc] = '\0';
c2c6d25f
JM
4354 printf_filtered ("Repeat count %d too large for buffer: ", repeat);
4355 puts_filtered (buf);
4356 puts_filtered ("\n");
c2d11a7d 4357 return -1;
c2c6d25f 4358 }
c906108c 4359 default:
c2d11a7d 4360 if (bc < sizeof_buf - 1)
c906108c 4361 {
c2d11a7d 4362 buf[bc++] = c;
c906108c
SS
4363 csum += c;
4364 continue;
4365 }
4366
c2d11a7d 4367 buf[bc] = '\0';
c906108c
SS
4368 puts_filtered ("Remote packet too long: ");
4369 puts_filtered (buf);
4370 puts_filtered ("\n");
4371
c2d11a7d 4372 return -1;
c906108c
SS
4373 }
4374 }
4375}
4376
4377/* Read a packet from the remote machine, with error checking, and
c2d11a7d
JM
4378 store it in BUF. If FOREVER, wait forever rather than timing out;
4379 this is used (in synchronous mode) to wait for a target that is is
4380 executing user code to stop. */
d9fcf2fb
JM
4381/* FIXME: ezannoni 2000-02-01 this wrapper is necessary so that we
4382 don't have to change all the calls to getpkt to deal with the
4383 return value, because at the moment I don't know what the right
4384 thing to do it for those. */
c906108c 4385void
c2d11a7d
JM
4386getpkt (char *buf,
4387 long sizeof_buf,
4388 int forever)
d9fcf2fb
JM
4389{
4390 int timed_out;
4391
4392 timed_out = getpkt_sane (buf, sizeof_buf, forever);
4393}
4394
4395
4396/* Read a packet from the remote machine, with error checking, and
4397 store it in BUF. If FOREVER, wait forever rather than timing out;
4398 this is used (in synchronous mode) to wait for a target that is is
4399 executing user code to stop. If FOREVER == 0, this function is
4400 allowed to time out gracefully and return an indication of this to
4401 the caller. */
3172dc30 4402static int
d9fcf2fb
JM
4403getpkt_sane (char *buf,
4404 long sizeof_buf,
4405 int forever)
c906108c
SS
4406{
4407 int c;
4408 int tries;
4409 int timeout;
4410 int val;
4411
c5aa993b 4412 strcpy (buf, "timeout");
c906108c
SS
4413
4414 if (forever)
4415 {
c906108c 4416 timeout = watchdog > 0 ? watchdog : -1;
c906108c
SS
4417 }
4418
4419 else
4420 timeout = remote_timeout;
4421
4422#define MAX_TRIES 3
4423
4424 for (tries = 1; tries <= MAX_TRIES; tries++)
4425 {
4426 /* This can loop forever if the remote side sends us characters
c5aa993b
JM
4427 continuously, but if it pauses, we'll get a zero from readchar
4428 because of timeout. Then we'll count that as a retry. */
c906108c
SS
4429
4430 /* Note that we will only wait forever prior to the start of a packet.
c5aa993b
JM
4431 After that, we expect characters to arrive at a brisk pace. They
4432 should show up within remote_timeout intervals. */
c906108c
SS
4433
4434 do
4435 {
4436 c = readchar (timeout);
4437
4438 if (c == SERIAL_TIMEOUT)
4439 {
2acceee2 4440 if (forever) /* Watchdog went off? Kill the target. */
c906108c 4441 {
2acceee2 4442 QUIT;
c906108c
SS
4443 target_mourn_inferior ();
4444 error ("Watchdog has expired. Target detached.\n");
4445 }
c906108c 4446 if (remote_debug)
0f71a2f6 4447 fputs_filtered ("Timed out.\n", gdb_stdlog);
c906108c
SS
4448 goto retry;
4449 }
4450 }
4451 while (c != '$');
4452
4453 /* We've found the start of a packet, now collect the data. */
4454
c2d11a7d 4455 val = read_frame (buf, sizeof_buf);
c906108c 4456
c2d11a7d 4457 if (val >= 0)
c906108c
SS
4458 {
4459 if (remote_debug)
43e526b9
JM
4460 {
4461 fprintf_unfiltered (gdb_stdlog, "Packet received: ");
4462 fputstr_unfiltered (buf, 0, gdb_stdlog);
4463 fprintf_unfiltered (gdb_stdlog, "\n");
4464 }
2cd58942 4465 serial_write (remote_desc, "+", 1);
d9fcf2fb 4466 return 0;
c906108c
SS
4467 }
4468
4469 /* Try the whole thing again. */
4470 retry:
2cd58942 4471 serial_write (remote_desc, "-", 1);
c906108c
SS
4472 }
4473
4474 /* We have tried hard enough, and just can't receive the packet. Give up. */
4475
4476 printf_unfiltered ("Ignoring packet error, continuing...\n");
2cd58942 4477 serial_write (remote_desc, "+", 1);
d9fcf2fb 4478 return 1;
c906108c
SS
4479}
4480\f
4481static void
fba45db2 4482remote_kill (void)
c906108c
SS
4483{
4484 /* For some mysterious reason, wait_for_inferior calls kill instead of
4485 mourn after it gets TARGET_WAITKIND_SIGNALLED. Work around it. */
4486 if (kill_kludge)
4487 {
4488 kill_kludge = 0;
4489 target_mourn_inferior ();
4490 return;
4491 }
4492
4493 /* Use catch_errors so the user can quit from gdb even when we aren't on
4494 speaking terms with the remote system. */
c5aa993b 4495 catch_errors ((catch_errors_ftype *) putpkt, "k", "", RETURN_MASK_ERROR);
c906108c
SS
4496
4497 /* Don't wait for it to die. I'm not really sure it matters whether
4498 we do or not. For the existing stubs, kill is a noop. */
4499 target_mourn_inferior ();
4500}
4501
43ff13b4
JM
4502/* Async version of remote_kill. */
4503static void
fba45db2 4504remote_async_kill (void)
43ff13b4
JM
4505{
4506 /* Unregister the file descriptor from the event loop. */
ed9a39eb 4507 if (target_is_async_p ())
2cd58942 4508 serial_async (remote_desc, NULL, 0);
43ff13b4
JM
4509
4510 /* For some mysterious reason, wait_for_inferior calls kill instead of
4511 mourn after it gets TARGET_WAITKIND_SIGNALLED. Work around it. */
4512 if (kill_kludge)
4513 {
4514 kill_kludge = 0;
4515 target_mourn_inferior ();
4516 return;
4517 }
4518
4519 /* Use catch_errors so the user can quit from gdb even when we aren't on
4520 speaking terms with the remote system. */
c5aa993b 4521 catch_errors ((catch_errors_ftype *) putpkt, "k", "", RETURN_MASK_ERROR);
43ff13b4
JM
4522
4523 /* Don't wait for it to die. I'm not really sure it matters whether
4524 we do or not. For the existing stubs, kill is a noop. */
4525 target_mourn_inferior ();
4526}
4527
c906108c 4528static void
fba45db2 4529remote_mourn (void)
c906108c
SS
4530{
4531 remote_mourn_1 (&remote_ops);
4532}
4533
53a5351d 4534static void
fba45db2 4535remote_async_mourn (void)
53a5351d
JM
4536{
4537 remote_mourn_1 (&remote_async_ops);
4538}
4539
c906108c 4540static void
fba45db2 4541extended_remote_mourn (void)
c906108c
SS
4542{
4543 /* We do _not_ want to mourn the target like this; this will
4544 remove the extended remote target from the target stack,
4545 and the next time the user says "run" it'll fail.
4546
4547 FIXME: What is the right thing to do here? */
4548#if 0
4549 remote_mourn_1 (&extended_remote_ops);
4550#endif
4551}
4552
4553/* Worker function for remote_mourn. */
4554static void
fba45db2 4555remote_mourn_1 (struct target_ops *target)
c906108c
SS
4556{
4557 unpush_target (target);
4558 generic_mourn_inferior ();
4559}
4560
4561/* In the extended protocol we want to be able to do things like
4562 "run" and have them basically work as expected. So we need
4563 a special create_inferior function.
4564
4565 FIXME: One day add support for changing the exec file
4566 we're debugging, arguments and an environment. */
4567
4568static void
fba45db2 4569extended_remote_create_inferior (char *exec_file, char *args, char **env)
c906108c
SS
4570{
4571 /* Rip out the breakpoints; we'll reinsert them after restarting
4572 the remote server. */
4573 remove_breakpoints ();
4574
4575 /* Now restart the remote server. */
4576 extended_remote_restart ();
4577
4578 /* Now put the breakpoints back in. This way we're safe if the
4579 restart function works via a unix fork on the remote side. */
4580 insert_breakpoints ();
4581
4582 /* Clean up from the last time we were running. */
4583 clear_proceed_status ();
4584
4585 /* Let the remote process run. */
4586 proceed (-1, TARGET_SIGNAL_0, 0);
4587}
4588
43ff13b4
JM
4589/* Async version of extended_remote_create_inferior. */
4590static void
fba45db2 4591extended_remote_async_create_inferior (char *exec_file, char *args, char **env)
43ff13b4
JM
4592{
4593 /* Rip out the breakpoints; we'll reinsert them after restarting
4594 the remote server. */
4595 remove_breakpoints ();
4596
4597 /* If running asynchronously, register the target file descriptor
4598 with the event loop. */
2acceee2
JM
4599 if (event_loop_p && target_can_async_p ())
4600 target_async (inferior_event_handler, 0);
43ff13b4
JM
4601
4602 /* Now restart the remote server. */
4603 extended_remote_restart ();
4604
4605 /* Now put the breakpoints back in. This way we're safe if the
4606 restart function works via a unix fork on the remote side. */
4607 insert_breakpoints ();
4608
4609 /* Clean up from the last time we were running. */
4610 clear_proceed_status ();
4611
4612 /* Let the remote process run. */
4613 proceed (-1, TARGET_SIGNAL_0, 0);
4614}
c906108c 4615\f
c5aa993b 4616
c906108c
SS
4617/* On some machines, e.g. 68k, we may use a different breakpoint instruction
4618 than other targets; in those use REMOTE_BREAKPOINT instead of just
4619 BREAKPOINT. Also, bi-endian targets may define LITTLE_REMOTE_BREAKPOINT
4620 and BIG_REMOTE_BREAKPOINT. If none of these are defined, we just call
4621 the standard routines that are in mem-break.c. */
4622
4623/* FIXME, these ought to be done in a more dynamic fashion. For instance,
4624 the choice of breakpoint instruction affects target program design and
4625 vice versa, and by making it user-tweakable, the special code here
4626 goes away and we need fewer special GDB configurations. */
4627
4628#if defined (LITTLE_REMOTE_BREAKPOINT) && defined (BIG_REMOTE_BREAKPOINT) && !defined(REMOTE_BREAKPOINT)
4629#define REMOTE_BREAKPOINT
4630#endif
4631
4632#ifdef REMOTE_BREAKPOINT
4633
4634/* If the target isn't bi-endian, just pretend it is. */
4635#if !defined (LITTLE_REMOTE_BREAKPOINT) && !defined (BIG_REMOTE_BREAKPOINT)
4636#define LITTLE_REMOTE_BREAKPOINT REMOTE_BREAKPOINT
4637#define BIG_REMOTE_BREAKPOINT REMOTE_BREAKPOINT
4638#endif
4639
4640static unsigned char big_break_insn[] = BIG_REMOTE_BREAKPOINT;
4641static unsigned char little_break_insn[] = LITTLE_REMOTE_BREAKPOINT;
4642
4643#endif /* REMOTE_BREAKPOINT */
4644
4645/* Insert a breakpoint on targets that don't have any better breakpoint
4646 support. We read the contents of the target location and stash it,
4647 then overwrite it with a breakpoint instruction. ADDR is the target
4648 location in the target machine. CONTENTS_CACHE is a pointer to
4649 memory allocated for saving the target contents. It is guaranteed
4650 by the caller to be long enough to save sizeof BREAKPOINT bytes (this
4651 is accomplished via BREAKPOINT_MAX). */
4652
4653static int
fba45db2 4654remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
c906108c 4655{
d01949b6 4656 struct remote_state *rs = get_remote_state ();
c906108c
SS
4657#ifdef REMOTE_BREAKPOINT
4658 int val;
96baa820
JM
4659#endif
4660 int bp_size;
4661
d471ea57
AC
4662 /* Try the "Z" s/w breakpoint packet if it is not already disabled.
4663 If it succeeds, then set the support to PACKET_ENABLE. If it
4664 fails, and the user has explicitly requested the Z support then
4665 report an error, otherwise, mark it disabled and go on. */
96baa820 4666
d471ea57 4667 if (remote_protocol_Z[Z_PACKET_SOFTWARE_BP].support != PACKET_DISABLE)
96baa820 4668 {
d01949b6 4669 char *buf = alloca (rs->remote_packet_size);
e514a9d6 4670 char *p = buf;
96baa820 4671
0caabb7e 4672 addr = remote_address_masked (addr);
96baa820
JM
4673 *(p++) = 'Z';
4674 *(p++) = '0';
4675 *(p++) = ',';
0caabb7e
AC
4676 p += hexnumstr (p, (ULONGEST) addr);
4677 BREAKPOINT_FROM_PC (&addr, &bp_size);
96baa820
JM
4678 sprintf (p, ",%d", bp_size);
4679
4680 putpkt (buf);
d01949b6 4681 getpkt (buf, (rs->remote_packet_size), 0);
96baa820 4682
d471ea57 4683 switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_SOFTWARE_BP]))
96baa820 4684 {
d471ea57
AC
4685 case PACKET_ERROR:
4686 return -1;
4687 case PACKET_OK:
4688 return 0;
4689 case PACKET_UNKNOWN:
4690 break;
96baa820
JM
4691 }
4692 }
c906108c 4693
96baa820 4694#ifdef REMOTE_BREAKPOINT
c906108c
SS
4695 val = target_read_memory (addr, contents_cache, sizeof big_break_insn);
4696
4697 if (val == 0)
4698 {
d7449b42 4699 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
c906108c
SS
4700 val = target_write_memory (addr, (char *) big_break_insn,
4701 sizeof big_break_insn);
4702 else
4703 val = target_write_memory (addr, (char *) little_break_insn,
4704 sizeof little_break_insn);
4705 }
4706
4707 return val;
4708#else
4709 return memory_insert_breakpoint (addr, contents_cache);
4710#endif /* REMOTE_BREAKPOINT */
4711}
4712
4713static int
fba45db2 4714remote_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
c906108c 4715{
d01949b6 4716 struct remote_state *rs = get_remote_state ();
96baa820
JM
4717 int bp_size;
4718
d471ea57 4719 if (remote_protocol_Z[Z_PACKET_SOFTWARE_BP].support != PACKET_DISABLE)
96baa820 4720 {
d01949b6 4721 char *buf = alloca (rs->remote_packet_size);
e514a9d6 4722 char *p = buf;
96baa820
JM
4723
4724 *(p++) = 'z';
4725 *(p++) = '0';
4726 *(p++) = ',';
4727
0caabb7e
AC
4728 addr = remote_address_masked (addr);
4729 p += hexnumstr (p, (ULONGEST) addr);
4730 BREAKPOINT_FROM_PC (&addr, &bp_size);
96baa820
JM
4731 sprintf (p, ",%d", bp_size);
4732
4733 putpkt (buf);
d01949b6 4734 getpkt (buf, (rs->remote_packet_size), 0);
96baa820
JM
4735
4736 return (buf[0] == 'E');
4737 }
4738
c906108c
SS
4739#ifdef REMOTE_BREAKPOINT
4740 return target_write_memory (addr, contents_cache, sizeof big_break_insn);
4741#else
4742 return memory_remove_breakpoint (addr, contents_cache);
4743#endif /* REMOTE_BREAKPOINT */
4744}
4745
d471ea57
AC
4746static int
4747watchpoint_to_Z_packet (int type)
4748{
4749 switch (type)
4750 {
4751 case hw_write:
4752 return 2;
4753 break;
4754 case hw_read:
4755 return 3;
4756 break;
4757 case hw_access:
4758 return 4;
4759 break;
4760 default:
8e65ff28
AC
4761 internal_error (__FILE__, __LINE__,
4762 "hw_bp_to_z: bad watchpoint type %d", type);
d471ea57
AC
4763 }
4764}
4765
4766/* FIXME: This function should be static and a member of the remote
4767 target vector. */
4768
96baa820 4769int
fba45db2 4770remote_insert_watchpoint (CORE_ADDR addr, int len, int type)
96baa820 4771{
d01949b6
AC
4772 struct remote_state *rs = get_remote_state ();
4773 char *buf = alloca (rs->remote_packet_size);
e514a9d6 4774 char *p;
d471ea57 4775 enum Z_packet_type packet = watchpoint_to_Z_packet (type);
96baa820 4776
d471ea57
AC
4777 if (remote_protocol_Z[packet].support == PACKET_DISABLE)
4778 error ("Can't set hardware watchpoints without the '%s' (%s) packet\n",
4779 remote_protocol_Z[packet].name,
4780 remote_protocol_Z[packet].title);
96baa820 4781
d471ea57 4782 sprintf (buf, "Z%x,", packet);
96baa820
JM
4783 p = strchr (buf, '\0');
4784 addr = remote_address_masked (addr);
4785 p += hexnumstr (p, (ULONGEST) addr);
d4f3574e 4786 sprintf (p, ",%x", len);
96baa820
JM
4787
4788 putpkt (buf);
d01949b6 4789 getpkt (buf, (rs->remote_packet_size), 0);
96baa820 4790
d471ea57
AC
4791 switch (packet_ok (buf, &remote_protocol_Z[packet]))
4792 {
4793 case PACKET_ERROR:
4794 case PACKET_UNKNOWN:
4795 return -1;
4796 case PACKET_OK:
4797 return 0;
4798 }
8e65ff28
AC
4799 internal_error (__FILE__, __LINE__,
4800 "remote_insert_watchpoint: reached end of function");
96baa820
JM
4801}
4802
d471ea57
AC
4803/* FIXME: This function should be static and a member of the remote
4804 target vector. */
4805
96baa820 4806int
fba45db2 4807remote_remove_watchpoint (CORE_ADDR addr, int len, int type)
96baa820 4808{
d01949b6
AC
4809 struct remote_state *rs = get_remote_state ();
4810 char *buf = alloca (rs->remote_packet_size);
e514a9d6 4811 char *p;
d471ea57
AC
4812 enum Z_packet_type packet = watchpoint_to_Z_packet (type);
4813
4814 if (remote_protocol_Z[packet].support == PACKET_DISABLE)
4815 error ("Can't clear hardware watchpoints without the '%s' (%s) packet\n",
4816 remote_protocol_Z[packet].name,
4817 remote_protocol_Z[packet].title);
96baa820 4818
d471ea57 4819 sprintf (buf, "z%x,", packet);
96baa820
JM
4820 p = strchr (buf, '\0');
4821 addr = remote_address_masked (addr);
4822 p += hexnumstr (p, (ULONGEST) addr);
d4f3574e 4823 sprintf (p, ",%x", len);
96baa820 4824 putpkt (buf);
d01949b6 4825 getpkt (buf, (rs->remote_packet_size), 0);
96baa820 4826
d471ea57
AC
4827 switch (packet_ok (buf, &remote_protocol_Z[packet]))
4828 {
4829 case PACKET_ERROR:
4830 case PACKET_UNKNOWN:
4831 return -1;
4832 case PACKET_OK:
4833 return 0;
4834 }
8e65ff28
AC
4835 internal_error (__FILE__, __LINE__,
4836 "remote_remove_watchpoint: reached end of function");
96baa820
JM
4837}
4838
d471ea57
AC
4839/* FIXME: This function should be static and a member of the remote
4840 target vector. */
4841
96baa820 4842int
fba45db2 4843remote_insert_hw_breakpoint (CORE_ADDR addr, int len)
96baa820 4844{
d01949b6
AC
4845 struct remote_state *rs = get_remote_state ();
4846 char *buf = alloca (rs->remote_packet_size);
e514a9d6 4847 char *p = buf;
96baa820 4848
d471ea57
AC
4849 if (remote_protocol_Z[Z_PACKET_HARDWARE_BP].support == PACKET_DISABLE)
4850 error ("Can't set hardware breakpoint without the '%s' (%s) packet\n",
4851 remote_protocol_Z[Z_PACKET_HARDWARE_BP].name,
4852 remote_protocol_Z[Z_PACKET_HARDWARE_BP].title);
4853
96baa820
JM
4854 *(p++) = 'Z';
4855 *(p++) = '1';
4856 *(p++) = ',';
4857
4858 addr = remote_address_masked (addr);
4859 p += hexnumstr (p, (ULONGEST) addr);
ad6525fc 4860 sprintf (p, ",%x", len);
96baa820
JM
4861
4862 putpkt (buf);
d01949b6 4863 getpkt (buf, (rs->remote_packet_size), 0);
96baa820 4864
d471ea57
AC
4865 switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_HARDWARE_BP]))
4866 {
4867 case PACKET_ERROR:
4868 case PACKET_UNKNOWN:
4869 return -1;
4870 case PACKET_OK:
4871 return 0;
4872 }
8e65ff28
AC
4873 internal_error (__FILE__, __LINE__,
4874 "remote_remove_watchpoint: reached end of function");
96baa820
JM
4875}
4876
d471ea57
AC
4877/* FIXME: This function should be static and a member of the remote
4878 target vector. */
4879
96baa820 4880int
fba45db2 4881remote_remove_hw_breakpoint (CORE_ADDR addr, int len)
96baa820 4882{
d01949b6
AC
4883 struct remote_state *rs = get_remote_state ();
4884 char *buf = alloca (rs->remote_packet_size);
e514a9d6 4885 char *p = buf;
96baa820 4886
d471ea57
AC
4887 if (remote_protocol_Z[Z_PACKET_HARDWARE_BP].support == PACKET_DISABLE)
4888 error ("Can't clear hardware breakpoint without the '%s' (%s) packet\n",
4889 remote_protocol_Z[Z_PACKET_HARDWARE_BP].name,
4890 remote_protocol_Z[Z_PACKET_HARDWARE_BP].title);
4891
96baa820
JM
4892 *(p++) = 'z';
4893 *(p++) = '1';
4894 *(p++) = ',';
4895
4896 addr = remote_address_masked (addr);
4897 p += hexnumstr (p, (ULONGEST) addr);
ad6525fc 4898 sprintf (p, ",%x", len);
96baa820
JM
4899
4900 putpkt(buf);
d01949b6 4901 getpkt (buf, (rs->remote_packet_size), 0);
96baa820 4902
d471ea57
AC
4903 switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_HARDWARE_BP]))
4904 {
4905 case PACKET_ERROR:
4906 case PACKET_UNKNOWN:
4907 return -1;
4908 case PACKET_OK:
4909 return 0;
4910 }
8e65ff28
AC
4911 internal_error (__FILE__, __LINE__,
4912 "remote_remove_watchpoint: reached end of function");
96baa820 4913}
96baa820 4914
c906108c
SS
4915/* Some targets are only capable of doing downloads, and afterwards
4916 they switch to the remote serial protocol. This function provides
4917 a clean way to get from the download target to the remote target.
4918 It's basically just a wrapper so that we don't have to expose any
4919 of the internal workings of remote.c.
4920
4921 Prior to calling this routine, you should shutdown the current
4922 target code, else you will get the "A program is being debugged
4923 already..." message. Usually a call to pop_target() suffices. */
4924
4925void
fba45db2 4926push_remote_target (char *name, int from_tty)
c906108c
SS
4927{
4928 printf_filtered ("Switching to remote protocol\n");
4929 remote_open (name, from_tty);
4930}
4931
4932/* Other targets want to use the entire remote serial module but with
4933 certain remote_ops overridden. */
4934
4935void
fba45db2
KB
4936open_remote_target (char *name, int from_tty, struct target_ops *target,
4937 int extended_p)
c906108c
SS
4938{
4939 printf_filtered ("Selecting the %sremote protocol\n",
4940 (extended_p ? "extended-" : ""));
4941 remote_open_1 (name, from_tty, target, extended_p);
4942}
4943
4944/* Table used by the crc32 function to calcuate the checksum. */
4945
c5aa993b
JM
4946static unsigned long crc32_table[256] =
4947{0, 0};
c906108c
SS
4948
4949static unsigned long
fba45db2 4950crc32 (unsigned char *buf, int len, unsigned int crc)
c906108c 4951{
c5aa993b 4952 if (!crc32_table[1])
c906108c
SS
4953 {
4954 /* Initialize the CRC table and the decoding table. */
4955 int i, j;
4956 unsigned int c;
4957
4958 for (i = 0; i < 256; i++)
c5aa993b
JM
4959 {
4960 for (c = i << 24, j = 8; j > 0; --j)
4961 c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
4962 crc32_table[i] = c;
4963 }
c906108c
SS
4964 }
4965
4966 while (len--)
4967 {
4968 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
4969 buf++;
4970 }
4971 return crc;
4972}
4973
4974/* compare-sections command
4975
4976 With no arguments, compares each loadable section in the exec bfd
4977 with the same memory range on the target, and reports mismatches.
4978 Useful for verifying the image on the target against the exec file.
4979 Depends on the target understanding the new "qCRC:" request. */
4980
e514a9d6
JM
4981/* FIXME: cagney/1999-10-26: This command should be broken down into a
4982 target method (target verify memory) and generic version of the
4983 actual command. This will allow other high-level code (especially
4984 generic_load()) to make use of this target functionality. */
4985
c906108c 4986static void
fba45db2 4987compare_sections_command (char *args, int from_tty)
c906108c 4988{
d01949b6 4989 struct remote_state *rs = get_remote_state ();
c906108c
SS
4990 asection *s;
4991 unsigned long host_crc, target_crc;
4992 extern bfd *exec_bfd;
4993 struct cleanup *old_chain;
085dd6e6
JM
4994 char *tmp;
4995 char *sectdata;
ce359b09 4996 const char *sectname;
d01949b6 4997 char *buf = alloca (rs->remote_packet_size);
c906108c
SS
4998 bfd_size_type size;
4999 bfd_vma lma;
5000 int matched = 0;
5001 int mismatched = 0;
5002
5003 if (!exec_bfd)
5004 error ("command cannot be used without an exec file");
5005 if (!current_target.to_shortname ||
5006 strcmp (current_target.to_shortname, "remote") != 0)
5007 error ("command can only be used with remote target");
5008
c5aa993b 5009 for (s = exec_bfd->sections; s; s = s->next)
c906108c
SS
5010 {
5011 if (!(s->flags & SEC_LOAD))
c5aa993b 5012 continue; /* skip non-loadable section */
c906108c
SS
5013
5014 size = bfd_get_section_size_before_reloc (s);
5015 if (size == 0)
c5aa993b 5016 continue; /* skip zero-length section */
c906108c 5017
ce359b09 5018 sectname = bfd_get_section_name (exec_bfd, s);
c906108c 5019 if (args && strcmp (args, sectname) != 0)
c5aa993b 5020 continue; /* not the section selected by user */
c906108c 5021
c5aa993b 5022 matched = 1; /* do this section */
c906108c
SS
5023 lma = s->lma;
5024 /* FIXME: assumes lma can fit into long */
5025 sprintf (buf, "qCRC:%lx,%lx", (long) lma, (long) size);
5026 putpkt (buf);
5027
5028 /* be clever; compute the host_crc before waiting for target reply */
5029 sectdata = xmalloc (size);
b8c9b27d 5030 old_chain = make_cleanup (xfree, sectdata);
c906108c
SS
5031 bfd_get_section_contents (exec_bfd, s, sectdata, 0, size);
5032 host_crc = crc32 ((unsigned char *) sectdata, size, 0xffffffff);
5033
d01949b6 5034 getpkt (buf, (rs->remote_packet_size), 0);
c906108c 5035 if (buf[0] == 'E')
823ca731
AC
5036 error ("target memory fault, section %s, range 0x%s -- 0x%s",
5037 sectname, paddr (lma), paddr (lma + size));
c906108c
SS
5038 if (buf[0] != 'C')
5039 error ("remote target does not support this operation");
5040
5041 for (target_crc = 0, tmp = &buf[1]; *tmp; tmp++)
5042 target_crc = target_crc * 16 + fromhex (*tmp);
5043
d4f3574e
SS
5044 printf_filtered ("Section %s, range 0x%s -- 0x%s: ",
5045 sectname, paddr (lma), paddr (lma + size));
c906108c
SS
5046 if (host_crc == target_crc)
5047 printf_filtered ("matched.\n");
5048 else
c5aa993b
JM
5049 {
5050 printf_filtered ("MIS-MATCHED!\n");
5051 mismatched++;
5052 }
c906108c
SS
5053
5054 do_cleanups (old_chain);
5055 }
5056 if (mismatched > 0)
5057 warning ("One or more sections of the remote executable does not match\n\
5058the loaded file\n");
5059 if (args && !matched)
5060 printf_filtered ("No loaded section named '%s'.\n", args);
5061}
5062
5063static int
fba45db2 5064remote_query (int query_type, char *buf, char *outbuf, int *bufsiz)
c906108c 5065{
d01949b6 5066 struct remote_state *rs = get_remote_state ();
c906108c 5067 int i;
d01949b6 5068 char *buf2 = alloca (rs->remote_packet_size);
c906108c 5069 char *p2 = &buf2[0];
c906108c 5070
c5aa993b 5071 if (!bufsiz)
c906108c
SS
5072 error ("null pointer to remote bufer size specified");
5073
d01949b6 5074 /* minimum outbuf size is (rs->remote_packet_size) - if bufsiz is not large enough let
c906108c
SS
5075 the caller know and return what the minimum size is */
5076 /* Note: a zero bufsiz can be used to query the minimum buffer size */
d01949b6 5077 if (*bufsiz < (rs->remote_packet_size))
c906108c 5078 {
d01949b6 5079 *bufsiz = (rs->remote_packet_size);
c906108c
SS
5080 return -1;
5081 }
5082
5083 /* except for querying the minimum buffer size, target must be open */
c5aa993b 5084 if (!remote_desc)
c906108c
SS
5085 error ("remote query is only available after target open");
5086
5087 /* we only take uppercase letters as query types, at least for now */
c5aa993b 5088 if ((query_type < 'A') || (query_type > 'Z'))
c906108c
SS
5089 error ("invalid remote query type");
5090
c5aa993b 5091 if (!buf)
c906108c
SS
5092 error ("null remote query specified");
5093
c5aa993b 5094 if (!outbuf)
c906108c
SS
5095 error ("remote query requires a buffer to receive data");
5096
5097 outbuf[0] = '\0';
5098
5099 *p2++ = 'q';
5100 *p2++ = query_type;
5101
5102 /* we used one buffer char for the remote protocol q command and another
5103 for the query type. As the remote protocol encapsulation uses 4 chars
5104 plus one extra in case we are debugging (remote_debug),
5105 we have PBUFZIZ - 7 left to pack the query string */
5106 i = 0;
d01949b6 5107 while (buf[i] && (i < ((rs->remote_packet_size) - 8)))
c906108c
SS
5108 {
5109 /* bad caller may have sent forbidden characters */
c5aa993b
JM
5110 if ((!isprint (buf[i])) || (buf[i] == '$') || (buf[i] == '#'))
5111 error ("illegal characters in query string");
c906108c
SS
5112
5113 *p2++ = buf[i];
5114 i++;
5115 }
5116 *p2 = buf[i];
5117
c5aa993b 5118 if (buf[i])
c906108c
SS
5119 error ("query larger than available buffer");
5120
5121 i = putpkt (buf2);
c5aa993b
JM
5122 if (i < 0)
5123 return i;
c906108c 5124
c2d11a7d 5125 getpkt (outbuf, *bufsiz, 0);
c906108c
SS
5126
5127 return 0;
5128}
5129
96baa820
JM
5130static void
5131remote_rcmd (char *command,
d9fcf2fb 5132 struct ui_file *outbuf)
96baa820 5133{
d01949b6 5134 struct remote_state *rs = get_remote_state ();
96baa820 5135 int i;
d01949b6 5136 char *buf = alloca (rs->remote_packet_size);
96baa820
JM
5137 char *p = buf;
5138
5139 if (!remote_desc)
5140 error ("remote rcmd is only available after target open");
5141
7be570e7
JM
5142 /* Send a NULL command across as an empty command */
5143 if (command == NULL)
5144 command = "";
5145
96baa820
JM
5146 /* The query prefix */
5147 strcpy (buf, "qRcmd,");
5148 p = strchr (buf, '\0');
5149
d01949b6 5150 if ((strlen (buf) + strlen (command) * 2 + 8/*misc*/) > (rs->remote_packet_size))
96baa820
JM
5151 error ("\"monitor\" command ``%s'' is too long\n", command);
5152
5153 /* Encode the actual command */
30559e10 5154 bin2hex (command, p, 0);
96baa820
JM
5155
5156 if (putpkt (buf) < 0)
5157 error ("Communication problem with target\n");
5158
5159 /* get/display the response */
5160 while (1)
5161 {
5162 /* XXX - see also tracepoint.c:remote_get_noisy_reply() */
5163 buf[0] = '\0';
d01949b6 5164 getpkt (buf, (rs->remote_packet_size), 0);
96baa820
JM
5165 if (buf[0] == '\0')
5166 error ("Target does not support this command\n");
5167 if (buf[0] == 'O' && buf[1] != 'K')
5168 {
5169 remote_console_output (buf + 1); /* 'O' message from stub */
5170 continue;
5171 }
5172 if (strcmp (buf, "OK") == 0)
5173 break;
7be570e7
JM
5174 if (strlen (buf) == 3 && buf[0] == 'E'
5175 && isdigit (buf[1]) && isdigit (buf[2]))
5176 {
5177 error ("Protocol error with Rcmd");
5178 }
96baa820
JM
5179 for (p = buf; p[0] != '\0' && p[1] != '\0'; p += 2)
5180 {
5181 char c = (fromhex (p[0]) << 4) + fromhex (p[1]);
5182 fputc_unfiltered (c, outbuf);
5183 }
5184 break;
5185 }
5186}
5187
c906108c 5188static void
fba45db2 5189packet_command (char *args, int from_tty)
c906108c 5190{
d01949b6
AC
5191 struct remote_state *rs = get_remote_state ();
5192 char *buf = alloca (rs->remote_packet_size);
c906108c 5193
c5aa993b 5194 if (!remote_desc)
c906108c
SS
5195 error ("command can only be used with remote target");
5196
c5aa993b 5197 if (!args)
c906108c
SS
5198 error ("remote-packet command requires packet text as argument");
5199
5200 puts_filtered ("sending: ");
5201 print_packet (args);
5202 puts_filtered ("\n");
5203 putpkt (args);
5204
d01949b6 5205 getpkt (buf, (rs->remote_packet_size), 0);
c906108c
SS
5206 puts_filtered ("received: ");
5207 print_packet (buf);
5208 puts_filtered ("\n");
5209}
5210
5211#if 0
5212/* --------- UNIT_TEST for THREAD oriented PACKETS ------------------------- */
5213
a14ed312 5214static void display_thread_info (struct gdb_ext_thread_info *info);
c906108c 5215
a14ed312 5216static void threadset_test_cmd (char *cmd, int tty);
c906108c 5217
a14ed312 5218static void threadalive_test (char *cmd, int tty);
c906108c 5219
a14ed312 5220static void threadlist_test_cmd (char *cmd, int tty);
c906108c 5221
a14ed312 5222int get_and_display_threadinfo (threadref * ref);
c906108c 5223
a14ed312 5224static void threadinfo_test_cmd (char *cmd, int tty);
c906108c 5225
a14ed312 5226static int thread_display_step (threadref * ref, void *context);
c906108c 5227
a14ed312 5228static void threadlist_update_test_cmd (char *cmd, int tty);
c906108c 5229
a14ed312 5230static void init_remote_threadtests (void);
c906108c 5231
c5aa993b 5232#define SAMPLE_THREAD 0x05060708 /* Truncated 64 bit threadid */
c906108c
SS
5233
5234static void
fba45db2 5235threadset_test_cmd (char *cmd, int tty)
c906108c
SS
5236{
5237 int sample_thread = SAMPLE_THREAD;
5238
5239 printf_filtered ("Remote threadset test\n");
5240 set_thread (sample_thread, 1);
5241}
5242
5243
5244static void
fba45db2 5245threadalive_test (char *cmd, int tty)
c906108c
SS
5246{
5247 int sample_thread = SAMPLE_THREAD;
5248
39f77062 5249 if (remote_thread_alive (pid_to_ptid (sample_thread)))
c906108c
SS
5250 printf_filtered ("PASS: Thread alive test\n");
5251 else
5252 printf_filtered ("FAIL: Thread alive test\n");
5253}
5254
a14ed312 5255void output_threadid (char *title, threadref * ref);
c906108c
SS
5256
5257void
fba45db2 5258output_threadid (char *title, threadref *ref)
c906108c
SS
5259{
5260 char hexid[20];
5261
5262 pack_threadid (&hexid[0], ref); /* Convert threead id into hex */
5263 hexid[16] = 0;
5264 printf_filtered ("%s %s\n", title, (&hexid[0]));
5265}
5266
5267static void
fba45db2 5268threadlist_test_cmd (char *cmd, int tty)
c906108c
SS
5269{
5270 int startflag = 1;
5271 threadref nextthread;
5272 int done, result_count;
5273 threadref threadlist[3];
5274
5275 printf_filtered ("Remote Threadlist test\n");
5276 if (!remote_get_threadlist (startflag, &nextthread, 3, &done,
5277 &result_count, &threadlist[0]))
5278 printf_filtered ("FAIL: threadlist test\n");
5279 else
5280 {
5281 threadref *scan = threadlist;
5282 threadref *limit = scan + result_count;
5283
5284 while (scan < limit)
5285 output_threadid (" thread ", scan++);
5286 }
5287}
5288
5289void
fba45db2 5290display_thread_info (struct gdb_ext_thread_info *info)
c906108c
SS
5291{
5292 output_threadid ("Threadid: ", &info->threadid);
5293 printf_filtered ("Name: %s\n ", info->shortname);
5294 printf_filtered ("State: %s\n", info->display);
5295 printf_filtered ("other: %s\n\n", info->more_display);
5296}
5297
5298int
fba45db2 5299get_and_display_threadinfo (threadref *ref)
c906108c
SS
5300{
5301 int result;
5302 int set;
5303 struct gdb_ext_thread_info threadinfo;
5304
5305 set = TAG_THREADID | TAG_EXISTS | TAG_THREADNAME
5306 | TAG_MOREDISPLAY | TAG_DISPLAY;
5307 if (0 != (result = remote_get_threadinfo (ref, set, &threadinfo)))
5308 display_thread_info (&threadinfo);
5309 return result;
5310}
5311
5312static void
fba45db2 5313threadinfo_test_cmd (char *cmd, int tty)
c906108c
SS
5314{
5315 int athread = SAMPLE_THREAD;
5316 threadref thread;
5317 int set;
5318
5319 int_to_threadref (&thread, athread);
5320 printf_filtered ("Remote Threadinfo test\n");
5321 if (!get_and_display_threadinfo (&thread))
5322 printf_filtered ("FAIL cannot get thread info\n");
5323}
5324
5325static int
fba45db2 5326thread_display_step (threadref *ref, void *context)
c906108c
SS
5327{
5328 /* output_threadid(" threadstep ",ref); *//* simple test */
5329 return get_and_display_threadinfo (ref);
5330}
5331
5332static void
fba45db2 5333threadlist_update_test_cmd (char *cmd, int tty)
c906108c
SS
5334{
5335 printf_filtered ("Remote Threadlist update test\n");
5336 remote_threadlist_iterator (thread_display_step, 0, CRAZY_MAX_THREADS);
5337}
5338
5339static void
5340init_remote_threadtests (void)
5341{
5342 add_com ("tlist", class_obscure, threadlist_test_cmd,
5343 "Fetch and print the remote list of thread identifiers, one pkt only");
5344 add_com ("tinfo", class_obscure, threadinfo_test_cmd,
5345 "Fetch and display info about one thread");
5346 add_com ("tset", class_obscure, threadset_test_cmd,
5347 "Test setting to a different thread");
5348 add_com ("tupd", class_obscure, threadlist_update_test_cmd,
5349 "Iterate through updating all remote thread info");
5350 add_com ("talive", class_obscure, threadalive_test,
5351 " Remote thread alive test ");
5352}
5353
5354#endif /* 0 */
5355
f3fb8c85
MS
5356/* Convert a thread ID to a string. Returns the string in a static
5357 buffer. */
5358
5359static char *
39f77062 5360remote_pid_to_str (ptid_t ptid)
f3fb8c85
MS
5361{
5362 static char buf[30];
5363
39f77062 5364 sprintf (buf, "Thread %d", PIDGET (ptid));
f3fb8c85
MS
5365 return buf;
5366}
5367
c906108c 5368static void
fba45db2 5369init_remote_ops (void)
c906108c 5370{
c5aa993b 5371 remote_ops.to_shortname = "remote";
c906108c 5372 remote_ops.to_longname = "Remote serial target in gdb-specific protocol";
c5aa993b 5373 remote_ops.to_doc =
c906108c 5374 "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
0d06e24b
JM
5375Specify the serial device it is connected to\n\
5376(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).";
c5aa993b
JM
5377 remote_ops.to_open = remote_open;
5378 remote_ops.to_close = remote_close;
c906108c 5379 remote_ops.to_detach = remote_detach;
c5aa993b 5380 remote_ops.to_resume = remote_resume;
c906108c
SS
5381 remote_ops.to_wait = remote_wait;
5382 remote_ops.to_fetch_registers = remote_fetch_registers;
5383 remote_ops.to_store_registers = remote_store_registers;
5384 remote_ops.to_prepare_to_store = remote_prepare_to_store;
c5aa993b
JM
5385 remote_ops.to_xfer_memory = remote_xfer_memory;
5386 remote_ops.to_files_info = remote_files_info;
c906108c
SS
5387 remote_ops.to_insert_breakpoint = remote_insert_breakpoint;
5388 remote_ops.to_remove_breakpoint = remote_remove_breakpoint;
c5aa993b
JM
5389 remote_ops.to_kill = remote_kill;
5390 remote_ops.to_load = generic_load;
c906108c
SS
5391 remote_ops.to_mourn_inferior = remote_mourn;
5392 remote_ops.to_thread_alive = remote_thread_alive;
0f71a2f6 5393 remote_ops.to_find_new_threads = remote_threads_info;
0caabb7e 5394 remote_ops.to_pid_to_str = remote_pid_to_str;
cf759d3b 5395 remote_ops.to_extra_thread_info = remote_threads_extra_info;
c906108c
SS
5396 remote_ops.to_stop = remote_stop;
5397 remote_ops.to_query = remote_query;
96baa820 5398 remote_ops.to_rcmd = remote_rcmd;
c906108c 5399 remote_ops.to_stratum = process_stratum;
c5aa993b
JM
5400 remote_ops.to_has_all_memory = 1;
5401 remote_ops.to_has_memory = 1;
5402 remote_ops.to_has_stack = 1;
5403 remote_ops.to_has_registers = 1;
5404 remote_ops.to_has_execution = 1;
5405 remote_ops.to_has_thread_control = tc_schedlock; /* can lock scheduler */
5406 remote_ops.to_magic = OPS_MAGIC;
c906108c
SS
5407}
5408
5409/* Set up the extended remote vector by making a copy of the standard
5410 remote vector and adding to it. */
5411
5412static void
fba45db2 5413init_extended_remote_ops (void)
c906108c
SS
5414{
5415 extended_remote_ops = remote_ops;
5416
0f71a2f6 5417 extended_remote_ops.to_shortname = "extended-remote";
c5aa993b 5418 extended_remote_ops.to_longname =
c906108c 5419 "Extended remote serial target in gdb-specific protocol";
c5aa993b 5420 extended_remote_ops.to_doc =
c906108c
SS
5421 "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
5422Specify the serial device it is connected to (e.g. /dev/ttya).",
c5aa993b 5423 extended_remote_ops.to_open = extended_remote_open;
c906108c
SS
5424 extended_remote_ops.to_create_inferior = extended_remote_create_inferior;
5425 extended_remote_ops.to_mourn_inferior = extended_remote_mourn;
0f71a2f6
JM
5426}
5427
5428/*
5429 * Command: info remote-process
5430 *
5431 * This implements Cisco's version of the "info proc" command.
5432 *
5433 * This query allows the target stub to return an arbitrary string
5434 * (or strings) giving arbitrary information about the target process.
5435 * This is optional; the target stub isn't required to implement it.
5436 *
5437 * Syntax: qfProcessInfo request first string
5438 * qsProcessInfo request subsequent string
5439 * reply: 'O'<hex-encoded-string>
5440 * 'l' last reply (empty)
5441 */
5442
5443static void
c2d11a7d 5444remote_info_process (char *args, int from_tty)
0f71a2f6 5445{
d01949b6
AC
5446 struct remote_state *rs = get_remote_state ();
5447 char *buf = alloca (rs->remote_packet_size);
0f71a2f6
JM
5448
5449 if (remote_desc == 0)
5450 error ("Command can only be used when connected to the remote target.");
5451
5452 putpkt ("qfProcessInfo");
d01949b6 5453 getpkt (buf, (rs->remote_packet_size), 0);
0f71a2f6 5454 if (buf[0] == 0)
c5aa993b 5455 return; /* Silently: target does not support this feature. */
0f71a2f6
JM
5456
5457 if (buf[0] == 'E')
5458 error ("info proc: target error.");
5459
c5aa993b 5460 while (buf[0] == 'O') /* Capitol-O packet */
0f71a2f6
JM
5461 {
5462 remote_console_output (&buf[1]);
5463 putpkt ("qsProcessInfo");
d01949b6 5464 getpkt (buf, (rs->remote_packet_size), 0);
0f71a2f6
JM
5465 }
5466}
5467
5468/*
5469 * Target Cisco
5470 */
5471
5472static void
c2d11a7d 5473remote_cisco_open (char *name, int from_tty)
0f71a2f6
JM
5474{
5475 if (name == 0)
22e04375
AC
5476 error ("To open a remote debug connection, you need to specify what \n"
5477 "device is attached to the remote system (e.g. host:port).");
0f71a2f6 5478
6426a772
JM
5479 /* See FIXME above */
5480 wait_forever_enabled_p = 1;
5481
0f71a2f6
JM
5482 target_preopen (from_tty);
5483
5484 unpush_target (&remote_cisco_ops);
5485
9db8d71f 5486 remote_desc = remote_serial_open (name);
0f71a2f6
JM
5487 if (!remote_desc)
5488 perror_with_name (name);
5489
5490 /*
5491 * If a baud rate was specified on the gdb command line it will
5492 * be greater than the initial value of -1. If it is, use it otherwise
5493 * default to 9600
5494 */
5495
5496 baud_rate = (baud_rate > 0) ? baud_rate : 9600;
2cd58942 5497 if (serial_setbaudrate (remote_desc, baud_rate))
0f71a2f6 5498 {
2cd58942 5499 serial_close (remote_desc);
0f71a2f6
JM
5500 perror_with_name (name);
5501 }
5502
2cd58942 5503 serial_raw (remote_desc);
0f71a2f6
JM
5504
5505 /* If there is something sitting in the buffer we might take it as a
5506 response to a command, which would be bad. */
2cd58942 5507 serial_flush_input (remote_desc);
0f71a2f6
JM
5508
5509 if (from_tty)
5510 {
5511 puts_filtered ("Remote debugging using ");
5512 puts_filtered (name);
5513 puts_filtered ("\n");
5514 }
5515
5516 remote_cisco_mode = 1;
5517
5518 push_target (&remote_cisco_ops); /* Switch to using cisco target now */
5519
d471ea57 5520 init_all_packet_configs ();
0f71a2f6 5521
c5aa993b 5522 general_thread = -2;
0f71a2f6
JM
5523 continue_thread = -2;
5524
9d1f7ab2
MS
5525 /* Probe for ability to use "ThreadInfo" query, as required. */
5526 use_threadinfo_query = 1;
5527 use_threadextra_query = 1;
5528
0f71a2f6
JM
5529 /* Without this, some commands which require an active target (such
5530 as kill) won't work. This variable serves (at least) double duty
5531 as both the pid of the target process (if it has such), and as a
5532 flag indicating that a target is active. These functions should
5533 be split out into seperate variables, especially since GDB will
5534 someday have a notion of debugging several processes. */
39f77062 5535 inferior_ptid = pid_to_ptid (MAGIC_NULL_PID);
0f71a2f6
JM
5536
5537 /* Start the remote connection; if error (0), discard this target. */
5538
c5aa993b
JM
5539 if (!catch_errors (remote_start_remote_dummy, (char *) 0,
5540 "Couldn't establish connection to remote target\n",
0f71a2f6
JM
5541 RETURN_MASK_ALL))
5542 {
5543 pop_target ();
5544 return;
5545 }
5546}
5547
5548static void
c2d11a7d 5549remote_cisco_close (int quitting)
0f71a2f6
JM
5550{
5551 remote_cisco_mode = 0;
5552 remote_close (quitting);
5553}
5554
c5aa993b 5555static void
8ab86381 5556remote_cisco_mourn (void)
0f71a2f6
JM
5557{
5558 remote_mourn_1 (&remote_cisco_ops);
5559}
5560
c5aa993b
JM
5561enum
5562{
5563 READ_MORE,
5564 FATAL_ERROR,
5565 ENTER_DEBUG,
0f71a2f6 5566 DISCONNECT_TELNET
c5aa993b
JM
5567}
5568minitelnet_return;
0f71a2f6 5569
1ff9c3d6
AC
5570/* Shared between readsocket() and readtty(). The size is arbitrary,
5571 however all targets are known to support a 400 character packet. */
5572static char tty_input[400];
0f71a2f6
JM
5573
5574static int escape_count;
5575static int echo_check;
5576extern int quit_flag;
5577
5578static int
c2d11a7d 5579readsocket (void)
0f71a2f6
JM
5580{
5581 int data;
5582
5583 /* Loop until the socket doesn't have any more data */
5584
c5aa993b 5585 while ((data = readchar (0)) >= 0)
0f71a2f6
JM
5586 {
5587 /* Check for the escape sequence */
c5aa993b 5588 if (data == '|')
0f71a2f6
JM
5589 {
5590 /* If this is the fourth escape, get out */
c5aa993b 5591 if (++escape_count == 4)
0f71a2f6
JM
5592 {
5593 return ENTER_DEBUG;
5594 }
c5aa993b
JM
5595 else
5596 { /* This is a '|', but not the fourth in a row.
5597 Continue without echoing it. If it isn't actually
5598 one of four in a row, it'll be echoed later. */
0f71a2f6
JM
5599 continue;
5600 }
5601 }
c5aa993b
JM
5602 else
5603 /* Not a '|' */
5604 {
0f71a2f6
JM
5605 /* Ensure any pending '|'s are flushed. */
5606
c5aa993b
JM
5607 for (; escape_count > 0; escape_count--)
5608 putchar ('|');
0f71a2f6 5609 }
0f71a2f6 5610
c5aa993b
JM
5611 if (data == '\r') /* If this is a return character, */
5612 continue; /* - just supress it. */
5613
5614 if (echo_check != -1) /* Check for echo of user input. */
0f71a2f6
JM
5615 {
5616 if (tty_input[echo_check] == data)
5617 {
1ff9c3d6 5618 gdb_assert (echo_check <= sizeof (tty_input));
c5aa993b
JM
5619 echo_check++; /* Character matched user input: */
5620 continue; /* Continue without echoing it. */
0f71a2f6 5621 }
c5aa993b
JM
5622 else if ((data == '\n') && (tty_input[echo_check] == '\r'))
5623 { /* End of the line (and of echo checking). */
5624 echo_check = -1; /* No more echo supression */
5625 continue; /* Continue without echoing. */
0f71a2f6
JM
5626 }
5627 else
c5aa993b
JM
5628 { /* Failed check for echo of user input.
5629 We now have some suppressed output to flush! */
0f71a2f6
JM
5630 int j;
5631
c5aa993b 5632 for (j = 0; j < echo_check; j++)
0f71a2f6
JM
5633 putchar (tty_input[j]);
5634 echo_check = -1;
5635 }
5636 }
c5aa993b 5637 putchar (data); /* Default case: output the char. */
0f71a2f6
JM
5638 }
5639
c5aa993b
JM
5640 if (data == SERIAL_TIMEOUT) /* Timeout returned from readchar. */
5641 return READ_MORE; /* Try to read some more */
5642 else
5643 return FATAL_ERROR; /* Trouble, bail out */
0f71a2f6
JM
5644}
5645
5646static int
c2d11a7d 5647readtty (void)
0f71a2f6 5648{
0f71a2f6
JM
5649 int tty_bytecount;
5650
5651 /* First, read a buffer full from the terminal */
5652 tty_bytecount = read (fileno (stdin), tty_input, sizeof (tty_input) - 1);
c5aa993b 5653 if (tty_bytecount == -1)
0f71a2f6
JM
5654 {
5655 perror ("readtty: read failed");
5656 return FATAL_ERROR;
5657 }
5658
5659 /* Remove a quoted newline. */
5660 if (tty_input[tty_bytecount - 1] == '\n' &&
5661 tty_input[tty_bytecount - 2] == '\\') /* line ending in backslash */
5662 {
c5aa993b
JM
5663 tty_input[--tty_bytecount] = 0; /* remove newline */
5664 tty_input[--tty_bytecount] = 0; /* remove backslash */
0f71a2f6
JM
5665 }
5666
5667 /* Turn trailing newlines into returns */
5668 if (tty_input[tty_bytecount - 1] == '\n')
c5aa993b 5669 tty_input[tty_bytecount - 1] = '\r';
0f71a2f6
JM
5670
5671 /* If the line consists of a ~, enter debugging mode. */
5672 if ((tty_input[0] == '~') && (tty_bytecount == 2))
5673 return ENTER_DEBUG;
5674
5675 /* Make this a zero terminated string and write it out */
5676 tty_input[tty_bytecount] = 0;
2cd58942 5677 if (serial_write (remote_desc, tty_input, tty_bytecount))
0f71a2f6
JM
5678 {
5679 perror_with_name ("readtty: write failed");
5680 return FATAL_ERROR;
5681 }
5682
5683 return READ_MORE;
5684}
5685
5686static int
c2d11a7d 5687minitelnet (void)
0f71a2f6
JM
5688{
5689 fd_set input; /* file descriptors for select */
c5aa993b
JM
5690 int tablesize; /* max number of FDs for select */
5691 int status;
5692 int quit_count = 0;
0f71a2f6
JM
5693
5694 extern int escape_count; /* global shared by readsocket */
5695 extern int echo_check; /* ditto */
5696
5697 escape_count = 0;
c5aa993b 5698 echo_check = -1;
0f71a2f6
JM
5699
5700 tablesize = 8 * sizeof (input);
5701
c5aa993b 5702 for (;;)
0f71a2f6
JM
5703 {
5704 /* Check for anything from our socket - doesn't block. Note that
c5aa993b
JM
5705 this must be done *before* the select as there may be
5706 buffered I/O waiting to be processed. */
0f71a2f6 5707
c5aa993b 5708 if ((status = readsocket ()) == FATAL_ERROR)
0f71a2f6
JM
5709 {
5710 error ("Debugging terminated by communications error");
5711 }
c5aa993b 5712 else if (status != READ_MORE)
0f71a2f6
JM
5713 {
5714 return (status);
5715 }
5716
c5aa993b 5717 fflush (stdout); /* Flush output before blocking */
0f71a2f6
JM
5718
5719 /* Now block on more socket input or TTY input */
c5aa993b 5720
0f71a2f6 5721 FD_ZERO (&input);
c5aa993b 5722 FD_SET (fileno (stdin), &input);
2cd58942 5723 FD_SET (deprecated_serial_fd (remote_desc), &input);
0f71a2f6
JM
5724
5725 status = select (tablesize, &input, 0, 0, 0);
c5aa993b 5726 if ((status == -1) && (errno != EINTR))
0f71a2f6
JM
5727 {
5728 error ("Communications error on select %d", errno);
5729 }
5730
5731 /* Handle Control-C typed */
5732
c5aa993b 5733 if (quit_flag)
0f71a2f6
JM
5734 {
5735 if ((++quit_count) == 2)
5736 {
5737 if (query ("Interrupt GDB? "))
5738 {
5739 printf_filtered ("Interrupted by user.\n");
b5a2688f 5740 throw_exception (RETURN_QUIT);
0f71a2f6
JM
5741 }
5742 quit_count = 0;
5743 }
5744 quit_flag = 0;
5745
5746 if (remote_break)
2cd58942 5747 serial_send_break (remote_desc);
0f71a2f6 5748 else
2cd58942 5749 serial_write (remote_desc, "\003", 1);
0f71a2f6
JM
5750
5751 continue;
5752 }
5753
5754 /* Handle console input */
5755
c5aa993b 5756 if (FD_ISSET (fileno (stdin), &input))
0f71a2f6
JM
5757 {
5758 quit_count = 0;
5759 echo_check = 0;
5760 status = readtty ();
5761 if (status == READ_MORE)
5762 continue;
5763
5764 return status; /* telnet session ended */
5765 }
5766 }
5767}
5768
39f77062
KB
5769static ptid_t
5770remote_cisco_wait (ptid_t ptid, struct target_waitstatus *status)
0f71a2f6 5771{
c5aa993b 5772 if (minitelnet () != ENTER_DEBUG)
0f71a2f6
JM
5773 {
5774 error ("Debugging session terminated by protocol error");
5775 }
5776 putpkt ("?");
39f77062 5777 return remote_wait (ptid, status);
0f71a2f6
JM
5778}
5779
5780static void
fba45db2 5781init_remote_cisco_ops (void)
0f71a2f6
JM
5782{
5783 remote_cisco_ops.to_shortname = "cisco";
c5aa993b
JM
5784 remote_cisco_ops.to_longname = "Remote serial target in cisco-specific protocol";
5785 remote_cisco_ops.to_doc =
0f71a2f6
JM
5786 "Use a remote machine via TCP, using a cisco-specific protocol.\n\
5787Specify the serial device it is connected to (e.g. host:2020).";
c5aa993b
JM
5788 remote_cisco_ops.to_open = remote_cisco_open;
5789 remote_cisco_ops.to_close = remote_cisco_close;
5790 remote_cisco_ops.to_detach = remote_detach;
5791 remote_cisco_ops.to_resume = remote_resume;
5792 remote_cisco_ops.to_wait = remote_cisco_wait;
5793 remote_cisco_ops.to_fetch_registers = remote_fetch_registers;
5794 remote_cisco_ops.to_store_registers = remote_store_registers;
5795 remote_cisco_ops.to_prepare_to_store = remote_prepare_to_store;
5796 remote_cisco_ops.to_xfer_memory = remote_xfer_memory;
5797 remote_cisco_ops.to_files_info = remote_files_info;
0f71a2f6
JM
5798 remote_cisco_ops.to_insert_breakpoint = remote_insert_breakpoint;
5799 remote_cisco_ops.to_remove_breakpoint = remote_remove_breakpoint;
c5aa993b
JM
5800 remote_cisco_ops.to_kill = remote_kill;
5801 remote_cisco_ops.to_load = generic_load;
5802 remote_cisco_ops.to_mourn_inferior = remote_cisco_mourn;
5803 remote_cisco_ops.to_thread_alive = remote_thread_alive;
5804 remote_cisco_ops.to_find_new_threads = remote_threads_info;
cf759d3b
ND
5805 remote_cisco_ops.to_pid_to_str = remote_pid_to_str;
5806 remote_cisco_ops.to_extra_thread_info = remote_threads_extra_info;
c5aa993b
JM
5807 remote_cisco_ops.to_stratum = process_stratum;
5808 remote_cisco_ops.to_has_all_memory = 1;
5809 remote_cisco_ops.to_has_memory = 1;
5810 remote_cisco_ops.to_has_stack = 1;
5811 remote_cisco_ops.to_has_registers = 1;
5812 remote_cisco_ops.to_has_execution = 1;
5813 remote_cisco_ops.to_magic = OPS_MAGIC;
0f71a2f6
JM
5814}
5815
6426a772
JM
5816static int
5817remote_can_async_p (void)
5818{
5819 /* We're async whenever the serial device is. */
2cd58942 5820 return (current_target.to_async_mask_value) && serial_can_async_p (remote_desc);
6426a772
JM
5821}
5822
5823static int
5824remote_is_async_p (void)
5825{
5826 /* We're async whenever the serial device is. */
2cd58942 5827 return (current_target.to_async_mask_value) && serial_is_async_p (remote_desc);
6426a772
JM
5828}
5829
2acceee2
JM
5830/* Pass the SERIAL event on and up to the client. One day this code
5831 will be able to delay notifying the client of an event until the
5832 point where an entire packet has been received. */
5833
5834static void (*async_client_callback) (enum inferior_event_type event_type, void *context);
5835static void *async_client_context;
5836static serial_event_ftype remote_async_serial_handler;
5837
6426a772 5838static void
819cc324 5839remote_async_serial_handler (struct serial *scb, void *context)
6426a772 5840{
2acceee2
JM
5841 /* Don't propogate error information up to the client. Instead let
5842 the client find out about the error by querying the target. */
5843 async_client_callback (INF_REG_EVENT, async_client_context);
5844}
5845
5846static void
5847remote_async (void (*callback) (enum inferior_event_type event_type, void *context), void *context)
5848{
ed9a39eb 5849 if (current_target.to_async_mask_value == 0)
8e65ff28
AC
5850 internal_error (__FILE__, __LINE__,
5851 "Calling remote_async when async is masked");
ed9a39eb 5852
2acceee2
JM
5853 if (callback != NULL)
5854 {
2cd58942 5855 serial_async (remote_desc, remote_async_serial_handler, NULL);
2acceee2
JM
5856 async_client_callback = callback;
5857 async_client_context = context;
5858 }
5859 else
2cd58942 5860 serial_async (remote_desc, NULL, NULL);
6426a772
JM
5861}
5862
43ff13b4
JM
5863/* Target async and target extended-async.
5864
5865 This are temporary targets, until it is all tested. Eventually
5866 async support will be incorporated int the usual 'remote'
5867 target. */
5868
5869static void
c2d11a7d 5870init_remote_async_ops (void)
43ff13b4
JM
5871{
5872 remote_async_ops.to_shortname = "async";
c5aa993b
JM
5873 remote_async_ops.to_longname = "Remote serial target in async version of the gdb-specific protocol";
5874 remote_async_ops.to_doc =
43ff13b4
JM
5875 "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
5876Specify the serial device it is connected to (e.g. /dev/ttya).";
c5aa993b
JM
5877 remote_async_ops.to_open = remote_async_open;
5878 remote_async_ops.to_close = remote_close;
5879 remote_async_ops.to_detach = remote_async_detach;
5880 remote_async_ops.to_resume = remote_async_resume;
5881 remote_async_ops.to_wait = remote_async_wait;
5882 remote_async_ops.to_fetch_registers = remote_fetch_registers;
5883 remote_async_ops.to_store_registers = remote_store_registers;
5884 remote_async_ops.to_prepare_to_store = remote_prepare_to_store;
5885 remote_async_ops.to_xfer_memory = remote_xfer_memory;
5886 remote_async_ops.to_files_info = remote_files_info;
43ff13b4
JM
5887 remote_async_ops.to_insert_breakpoint = remote_insert_breakpoint;
5888 remote_async_ops.to_remove_breakpoint = remote_remove_breakpoint;
6426a772
JM
5889 remote_async_ops.to_terminal_inferior = remote_async_terminal_inferior;
5890 remote_async_ops.to_terminal_ours = remote_async_terminal_ours;
c5aa993b
JM
5891 remote_async_ops.to_kill = remote_async_kill;
5892 remote_async_ops.to_load = generic_load;
53a5351d 5893 remote_async_ops.to_mourn_inferior = remote_async_mourn;
c5aa993b
JM
5894 remote_async_ops.to_thread_alive = remote_thread_alive;
5895 remote_async_ops.to_find_new_threads = remote_threads_info;
cf759d3b
ND
5896 remote_async_ops.to_pid_to_str = remote_pid_to_str;
5897 remote_async_ops.to_extra_thread_info = remote_threads_extra_info;
43ff13b4
JM
5898 remote_async_ops.to_stop = remote_stop;
5899 remote_async_ops.to_query = remote_query;
96baa820 5900 remote_async_ops.to_rcmd = remote_rcmd;
c5aa993b
JM
5901 remote_async_ops.to_stratum = process_stratum;
5902 remote_async_ops.to_has_all_memory = 1;
5903 remote_async_ops.to_has_memory = 1;
5904 remote_async_ops.to_has_stack = 1;
5905 remote_async_ops.to_has_registers = 1;
5906 remote_async_ops.to_has_execution = 1;
5907 remote_async_ops.to_has_thread_control = tc_schedlock; /* can lock scheduler */
6426a772
JM
5908 remote_async_ops.to_can_async_p = remote_can_async_p;
5909 remote_async_ops.to_is_async_p = remote_is_async_p;
5910 remote_async_ops.to_async = remote_async;
ed9a39eb 5911 remote_async_ops.to_async_mask_value = 1;
c5aa993b 5912 remote_async_ops.to_magic = OPS_MAGIC;
43ff13b4
JM
5913}
5914
5915/* Set up the async extended remote vector by making a copy of the standard
5916 remote vector and adding to it. */
5917
5918static void
c2d11a7d 5919init_extended_async_remote_ops (void)
43ff13b4
JM
5920{
5921 extended_async_remote_ops = remote_async_ops;
5922
5923 extended_async_remote_ops.to_shortname = "extended-async";
c5aa993b 5924 extended_async_remote_ops.to_longname =
43ff13b4 5925 "Extended remote serial target in async gdb-specific protocol";
c5aa993b 5926 extended_async_remote_ops.to_doc =
43ff13b4
JM
5927 "Use a remote computer via a serial line, using an async gdb-specific protocol.\n\
5928Specify the serial device it is connected to (e.g. /dev/ttya).",
c5aa993b 5929 extended_async_remote_ops.to_open = extended_remote_async_open;
43ff13b4
JM
5930 extended_async_remote_ops.to_create_inferior = extended_remote_async_create_inferior;
5931 extended_async_remote_ops.to_mourn_inferior = extended_remote_mourn;
5932}
5933
5a2468f5 5934static void
c2d11a7d 5935set_remote_cmd (char *args, int from_tty)
5a2468f5 5936{
5a2468f5
JM
5937}
5938
d471ea57
AC
5939static void
5940show_remote_cmd (char *args, int from_tty)
5941{
44eaed12 5942
d471ea57 5943 show_remote_protocol_Z_packet_cmd (args, from_tty);
44eaed12
C
5944 show_remote_protocol_e_packet_cmd (args, from_tty);
5945 show_remote_protocol_E_packet_cmd (args, from_tty);
d471ea57 5946 show_remote_protocol_P_packet_cmd (args, from_tty);
dc8acb97 5947 show_remote_protocol_qSymbol_packet_cmd (args, from_tty);
d471ea57
AC
5948 show_remote_protocol_binary_download_cmd (args, from_tty);
5949}
5a2468f5 5950
0f71a2f6 5951static void
fba45db2 5952build_remote_gdbarch_data (void)
0f71a2f6 5953{
d696208f 5954 remote_address_size = TARGET_ADDR_BIT;
0f71a2f6
JM
5955}
5956
dc8acb97
MS
5957/* Saved pointer to previous owner of the new_objfile event. */
5958static void (*remote_new_objfile_chain) (struct objfile *);
5959
5960/* Function to be called whenever a new objfile (shlib) is detected. */
5961static void
5962remote_new_objfile (struct objfile *objfile)
5963{
5964 if (remote_desc != 0) /* Have a remote connection */
5965 {
5966 remote_check_symbols (objfile);
5967 }
5968 /* Call predecessor on chain, if any. */
5969 if (remote_new_objfile_chain != 0 &&
5970 remote_desc == 0)
5971 remote_new_objfile_chain (objfile);
5972}
5973
c906108c 5974void
fba45db2 5975_initialize_remote (void)
c906108c 5976{
5a2468f5
JM
5977 static struct cmd_list_element *remote_set_cmdlist;
5978 static struct cmd_list_element *remote_show_cmdlist;
11cf8741 5979 struct cmd_list_element *tmpcmd;
5a2468f5 5980
0f71a2f6 5981 /* architecture specific data */
d01949b6
AC
5982 remote_gdbarch_data_handle = register_gdbarch_data (init_remote_state,
5983 free_remote_state);
5984
5985 /* Old tacky stuff. NOTE: This comes after the remote protocol so
5986 that the remote protocol has been initialized. */
11cf8741
JM
5987 register_gdbarch_swap (&remote_address_size,
5988 sizeof (&remote_address_size), NULL);
0f71a2f6
JM
5989 register_gdbarch_swap (NULL, 0, build_remote_gdbarch_data);
5990
c906108c
SS
5991 init_remote_ops ();
5992 add_target (&remote_ops);
5993
5994 init_extended_remote_ops ();
5995 add_target (&extended_remote_ops);
cce74817 5996
43ff13b4
JM
5997 init_remote_async_ops ();
5998 add_target (&remote_async_ops);
5999
6000 init_extended_async_remote_ops ();
6001 add_target (&extended_async_remote_ops);
6002
0f71a2f6
JM
6003 init_remote_cisco_ops ();
6004 add_target (&remote_cisco_ops);
6005
dc8acb97
MS
6006 /* Hook into new objfile notification. */
6007 remote_new_objfile_chain = target_new_objfile_hook;
6008 target_new_objfile_hook = remote_new_objfile;
6009
c906108c
SS
6010#if 0
6011 init_remote_threadtests ();
6012#endif
6013
d471ea57
AC
6014 /* set/show remote ... */
6015
5a2468f5
JM
6016 add_prefix_cmd ("remote", class_maintenance, set_remote_cmd, "\
6017Remote protocol specific variables\n\
6018Configure various remote-protocol specific variables such as\n\
6019the packets being used",
cff3e48b 6020 &remote_set_cmdlist, "set remote ",
5a2468f5 6021 0/*allow-unknown*/, &setlist);
d471ea57 6022 add_prefix_cmd ("remote", class_maintenance, show_remote_cmd, "\
5a2468f5
JM
6023Remote protocol specific variables\n\
6024Configure various remote-protocol specific variables such as\n\
6025the packets being used",
cff3e48b 6026 &remote_show_cmdlist, "show remote ",
5a2468f5
JM
6027 0/*allow-unknown*/, &showlist);
6028
c5aa993b 6029 add_cmd ("compare-sections", class_obscure, compare_sections_command,
c906108c 6030 "Compare section data on target to the exec file.\n\
c5aa993b 6031Argument is a single section name (default: all loaded sections).",
c906108c
SS
6032 &cmdlist);
6033
6034 add_cmd ("packet", class_maintenance, packet_command,
6035 "Send an arbitrary packet to a remote target.\n\
6036 maintenance packet TEXT\n\
6037If GDB is talking to an inferior via the GDB serial protocol, then\n\
6038this command sends the string TEXT to the inferior, and displays the\n\
6039response packet. GDB supplies the initial `$' character, and the\n\
6040terminating `#' character and checksum.",
6041 &maintenancelist);
6042
c5aa993b 6043 add_show_from_set
f3796e26
AC
6044 (add_set_boolean_cmd ("remotebreak", no_class, &remote_break,
6045 "Set whether to send break if interrupted.\n",
6046 &setlist),
c906108c
SS
6047 &showlist);
6048
11cf8741
JM
6049 /* Install commands for configuring memory read/write packets. */
6050
6051 add_cmd ("remotewritesize", no_class, set_memory_write_packet_size,
6052 "Set the maximum number of bytes per memory write packet (deprecated).\n",
6053 &setlist);
4ad5b0f7 6054 add_cmd ("remotewritesize", no_class, show_memory_write_packet_size,
11cf8741
JM
6055 "Show the maximum number of bytes per memory write packet (deprecated).\n",
6056 &showlist);
6057 add_cmd ("memory-write-packet-size", no_class,
6058 set_memory_write_packet_size,
6059 "Set the maximum number of bytes per memory-write packet.\n"
6060 "Specify the number of bytes in a packet or 0 (zero) for the\n"
6061 "default packet size. The actual limit is further reduced\n"
6062 "dependent on the target. Specify ``fixed'' to disable the\n"
6063 "further restriction and ``limit'' to enable that restriction\n",
6064 &remote_set_cmdlist);
6065 add_cmd ("memory-read-packet-size", no_class,
6066 set_memory_read_packet_size,
6067 "Set the maximum number of bytes per memory-read packet.\n"
6068 "Specify the number of bytes in a packet or 0 (zero) for the\n"
6069 "default packet size. The actual limit is further reduced\n"
6070 "dependent on the target. Specify ``fixed'' to disable the\n"
6071 "further restriction and ``limit'' to enable that restriction\n",
6072 &remote_set_cmdlist);
6073 add_cmd ("memory-write-packet-size", no_class,
6074 show_memory_write_packet_size,
6075 "Show the maximum number of bytes per memory-write packet.\n",
6076 &remote_show_cmdlist);
6077 add_cmd ("memory-read-packet-size", no_class,
6078 show_memory_read_packet_size,
6079 "Show the maximum number of bytes per memory-read packet.\n",
6080 &remote_show_cmdlist);
c906108c 6081
c5aa993b 6082 add_show_from_set
c906108c 6083 (add_set_cmd ("remoteaddresssize", class_obscure,
c5aa993b 6084 var_integer, (char *) &remote_address_size,
c906108c
SS
6085 "Set the maximum size of the address (in bits) \
6086in a memory packet.\n",
6087 &setlist),
c5aa993b 6088 &showlist);
c906108c 6089
96baa820
JM
6090 add_packet_config_cmd (&remote_protocol_binary_download,
6091 "X", "binary-download",
6092 set_remote_protocol_binary_download_cmd,
6093 show_remote_protocol_binary_download_cmd,
d471ea57
AC
6094 &remote_set_cmdlist, &remote_show_cmdlist,
6095 1);
96baa820
JM
6096#if 0
6097 /* XXXX - should ``set remotebinarydownload'' be retained for
6098 compatibility. */
c5aa993b 6099 add_show_from_set
b83266a0
SS
6100 (add_set_cmd ("remotebinarydownload", no_class,
6101 var_boolean, (char *) &remote_binary_download,
6102 "Set binary downloads.\n", &setlist),
6103 &showlist);
96baa820 6104#endif
0f71a2f6
JM
6105
6106 add_info ("remote-process", remote_info_process,
6107 "Query the remote system for process info.");
6108
dc8acb97
MS
6109 add_packet_config_cmd (&remote_protocol_qSymbol,
6110 "qSymbol", "symbol-lookup",
6111 set_remote_protocol_qSymbol_packet_cmd,
6112 show_remote_protocol_qSymbol_packet_cmd,
6113 &remote_set_cmdlist, &remote_show_cmdlist,
6114 0);
6115
44eaed12
C
6116 add_packet_config_cmd (&remote_protocol_e,
6117 "e", "step-over-range",
6118 set_remote_protocol_e_packet_cmd,
6119 show_remote_protocol_e_packet_cmd,
6120 &remote_set_cmdlist, &remote_show_cmdlist,
6121 0);
0f017ab9
AC
6122 /* Disable by default. The ``e'' packet has nasty interactions with
6123 the threading code - it relies on global state. */
6124 remote_protocol_e.detect = CMD_AUTO_BOOLEAN_FALSE;
6125 update_packet_config (&remote_protocol_e);
44eaed12
C
6126
6127 add_packet_config_cmd (&remote_protocol_E,
6128 "E", "step-over-range-w-signal",
6129 set_remote_protocol_E_packet_cmd,
6130 show_remote_protocol_E_packet_cmd,
6131 &remote_set_cmdlist, &remote_show_cmdlist,
6132 0);
0f017ab9
AC
6133 /* Disable by default. The ``e'' packet has nasty interactions with
6134 the threading code - it relies on global state. */
6135 remote_protocol_E.detect = CMD_AUTO_BOOLEAN_FALSE;
6136 update_packet_config (&remote_protocol_E);
44eaed12 6137
d471ea57
AC
6138 add_packet_config_cmd (&remote_protocol_P,
6139 "P", "set-register",
5a2468f5
JM
6140 set_remote_protocol_P_packet_cmd,
6141 show_remote_protocol_P_packet_cmd,
d471ea57
AC
6142 &remote_set_cmdlist, &remote_show_cmdlist,
6143 1);
6144
6145 add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_SOFTWARE_BP],
6146 "Z0", "software-breakpoint",
6147 set_remote_protocol_Z_software_bp_packet_cmd,
6148 show_remote_protocol_Z_software_bp_packet_cmd,
6149 &remote_set_cmdlist, &remote_show_cmdlist,
6150 0);
6151
6152 add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_HARDWARE_BP],
6153 "Z1", "hardware-breakpoint",
6154 set_remote_protocol_Z_hardware_bp_packet_cmd,
6155 show_remote_protocol_Z_hardware_bp_packet_cmd,
6156 &remote_set_cmdlist, &remote_show_cmdlist,
6157 0);
6158
6159 add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_WRITE_WP],
6160 "Z2", "write-watchpoint",
6161 set_remote_protocol_Z_write_wp_packet_cmd,
6162 show_remote_protocol_Z_write_wp_packet_cmd,
6163 &remote_set_cmdlist, &remote_show_cmdlist,
6164 0);
6165
6166 add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_READ_WP],
6167 "Z3", "read-watchpoint",
6168 set_remote_protocol_Z_read_wp_packet_cmd,
6169 show_remote_protocol_Z_read_wp_packet_cmd,
6170 &remote_set_cmdlist, &remote_show_cmdlist,
6171 0);
6172
6173 add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_ACCESS_WP],
6174 "Z4", "access-watchpoint",
6175 set_remote_protocol_Z_access_wp_packet_cmd,
6176 show_remote_protocol_Z_access_wp_packet_cmd,
6177 &remote_set_cmdlist, &remote_show_cmdlist,
6178 0);
6179
6180 /* Keep the old ``set remote Z-packet ...'' working. */
6181 tmpcmd = add_set_auto_boolean_cmd ("Z-packet", class_obscure,
6182 &remote_Z_packet_detect,
6183 "\
6184Set use of remote protocol `Z' packets", &remote_set_cmdlist);
9f60d481 6185 set_cmd_sfunc (tmpcmd, set_remote_protocol_Z_packet_cmd);
d471ea57
AC
6186 add_cmd ("Z-packet", class_obscure, show_remote_protocol_Z_packet_cmd,
6187 "Show use of remote protocol `Z' packets ",
6188 &remote_show_cmdlist);
c906108c 6189}
This page took 0.624534 seconds and 4 git commands to generate.