* complaints.c: New file, code moved from utils.c.
[deliverable/binutils-gdb.git] / gdb / remote.c
CommitLineData
b543979c
JG
1/* Remote target communications for serial-line targets in custom GDB protocol
2 Copyright 1988, 1991, 1992 Free Software Foundation, Inc.
bd5635a1
RP
3
4This file is part of GDB.
5
b543979c 6This program is free software; you can redistribute it and/or modify
bd5635a1 7it under the terms of the GNU General Public License as published by
b543979c
JG
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
bd5635a1 10
b543979c 11This program is distributed in the hope that it will be useful,
bd5635a1
RP
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
b543979c
JG
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
bd5635a1
RP
19
20/* Remote communication protocol.
21 All values are encoded in ascii hex digits.
22
23 Request Packet
24
25 read registers g
26 reply XX....X Each byte of register data
27 is described by two hex digits.
28 Registers are in the internal order
29 for GDB, and the bytes in a register
30 are in the same order the machine uses.
31 or ENN for an error.
32
33 write regs GXX..XX Each byte of register data
34 is described by two hex digits.
35 reply OK for success
36 ENN for an error
37
38 read mem mAA..AA,LLLL AA..AA is address, LLLL is length.
39 reply XX..XX XX..XX is mem contents
40 or ENN NN is errno
41
42 write mem MAA..AA,LLLL:XX..XX
43 AA..AA is address,
44 LLLL is number of bytes,
45 XX..XX is data
46 reply OK for success
47 ENN for an error
48
49 cont cAA..AA AA..AA is address to resume
50 If AA..AA is omitted,
51 resume at same address.
52
53 step sAA..AA AA..AA is address to resume
54 If AA..AA is omitted,
55 resume at same address.
56
57 last signal ? Reply the current reason for stopping.
58 This is the same reply as is generated
59 for step or cont : SAA where AA is the
60 signal number.
61
62 There is no immediate reply to step or cont.
63 The reply comes when the machine stops.
64 It is SAA AA is the "signal number"
65
8f86a4e4
JG
66 or... TAAPPPPPPPPFFFFFFFF
67 where AA is the signal number,
68 PPPPPPPP is the PC (PC_REGNUM), and
69 FFFFFFFF is the frame ptr (FP_REGNUM).
70
bd5635a1
RP
71 kill req k
72*/
73
d747e0af 74#include "defs.h"
bd5635a1
RP
75#include <string.h>
76#include <fcntl.h>
bd5635a1
RP
77#include "frame.h"
78#include "inferior.h"
79#include "target.h"
80#include "wait.h"
81#include "terminal.h"
8f86a4e4 82#include "gdbcmd.h"
bd5635a1 83
8f86a4e4 84#if !defined(DONT_USE_REMOTE)
bd5635a1
RP
85#ifdef USG
86#include <sys/types.h>
87#endif
88
89#include <signal.h>
90
b543979c
JG
91/* Prototypes for local functions */
92
93static void
94remote_write_bytes PARAMS ((CORE_ADDR, char *, int));
95
96static void
97remote_read_bytes PARAMS ((CORE_ADDR, char *, int));
98
99static void
100remote_files_info PARAMS ((struct target_ops *));
101
102static int
103remote_xfer_memory PARAMS ((CORE_ADDR, char *, int, int, struct target_ops *));
104
105static void
106remote_prepare_to_store PARAMS ((void));
107
108static void
109remote_fetch_registers PARAMS ((int));
110
111static void
112remote_resume PARAMS ((int, int));
113
114static void
115remote_open PARAMS ((char *, int));
116
117static void
118remote_close PARAMS ((int));
119
120static void
121remote_store_registers PARAMS ((int));
122
123static void
124getpkt PARAMS ((char *));
125
126static void
127putpkt PARAMS ((char *));
128
129static void
130remote_send PARAMS ((char *));
131
132static int
133readchar PARAMS ((void));
134
135static int
136remote_wait PARAMS ((WAITTYPE *));
137
138static int
139tohex PARAMS ((int));
140
141static int
142fromhex PARAMS ((int));
143
144static void
145remote_detach PARAMS ((char *, int));
146
bd5635a1
RP
147
148extern struct target_ops remote_ops; /* Forward decl */
149
8f86a4e4 150static int kiodebug = 0;
bd5635a1
RP
151static int timeout = 5;
152
153#if 0
154int icache;
155#endif
156
157/* Descriptor for I/O to remote machine. Initialize it to -1 so that
158 remote_open knows that we don't have a file open when the program
159 starts. */
160int remote_desc = -1;
161
b543979c 162#define PBUFSIZ 1024
bd5635a1
RP
163
164/* Maximum number of bytes to read/write at once. The value here
165 is chosen to fill up a packet (the headers account for the 32). */
166#define MAXBUFBYTES ((PBUFSIZ-32)/2)
167
b543979c
JG
168/* Round up PBUFSIZ to hold all the registers, at least. */
169#if REGISTER_BYTES > MAXBUFBYTES
170#undef PBUFSIZ
171#define PBUFSIZ (REGISTER_BYTES * 2 + 32)
bd5635a1 172#endif
bd5635a1
RP
173\f
174/* Called when SIGALRM signal sent due to alarm() timeout. */
175#ifndef HAVE_TERMIO
176void
e676a15f
FF
177remote_timer (signo)
178 int signo;
bd5635a1
RP
179{
180 if (kiodebug)
181 printf ("remote_timer called\n");
182
183 alarm (timeout);
184}
185#endif
186
bd5635a1
RP
187/* Clean up connection to a remote debugger. */
188
e1ce8aa5 189/* ARGSUSED */
b543979c 190static void
bd5635a1
RP
191remote_close (quitting)
192 int quitting;
193{
194 if (remote_desc >= 0)
195 close (remote_desc);
196 remote_desc = -1;
197}
198
b543979c
JG
199/* Translate baud rates from integers to damn B_codes. Unix should
200 have outgrown this crap years ago, but even POSIX wouldn't buck it. */
201
202#ifndef B19200
203#define B19200 EXTA
204#endif
205#ifndef B38400
206#define B38400 EXTB
207#endif
208
8f86a4e4
JG
209
210
b543979c
JG
211static struct {int rate, damn_b;} baudtab[] = {
212 {0, B0},
213 {50, B50},
214 {75, B75},
215 {110, B110},
216 {134, B134},
217 {150, B150},
218 {200, B200},
219 {300, B300},
220 {600, B600},
221 {1200, B1200},
222 {1800, B1800},
223 {2400, B2400},
224 {4800, B4800},
225 {9600, B9600},
226 {19200, B19200},
227 {38400, B38400},
228 {-1, -1},
229};
230
231static int
232damn_b (rate)
233 int rate;
234{
235 int i;
236
237 for (i = 0; baudtab[i].rate != -1; i++)
238 if (rate == baudtab[i].rate) return baudtab[i].damn_b;
239 return B38400; /* Random */
240}
241
bd5635a1
RP
242/* Open a connection to a remote debugger.
243 NAME is the filename used for communication. */
244
b543979c 245static void
bd5635a1
RP
246remote_open (name, from_tty)
247 char *name;
248 int from_tty;
249{
250 TERMINAL sg;
8f86a4e4 251 int a_rate, b_rate = 0;
b543979c 252 int baudrate_set = 0;
bd5635a1
RP
253
254 if (name == 0)
255 error (
256"To open a remote debug connection, you need to specify what serial\n\
257device is attached to the remote system (e.g. /dev/ttya).");
258
f2fc6e7a
JK
259 target_preopen (from_tty);
260
bd5635a1
RP
261 remote_close (0);
262
263#if 0
264 dcache_init ();
265#endif
266
267 remote_desc = open (name, O_RDWR);
268 if (remote_desc < 0)
269 perror_with_name (name);
270
b543979c
JG
271 if (baud_rate)
272 {
a03d4f8e 273 if (sscanf (baud_rate, "%d", &a_rate) == 1)
b543979c
JG
274 {
275 b_rate = damn_b (a_rate);
276 baudrate_set = 1;
277 }
278 }
279
bd5635a1
RP
280 ioctl (remote_desc, TIOCGETP, &sg);
281#ifdef HAVE_TERMIO
282 sg.c_cc[VMIN] = 0; /* read with timeout. */
283 sg.c_cc[VTIME] = timeout * 10;
284 sg.c_lflag &= ~(ICANON | ECHO);
b543979c
JG
285 sg.c_cflag &= ~PARENB; /* No parity */
286 sg.c_cflag |= CS8; /* 8-bit path */
287 if (baudrate_set)
d747e0af 288 sg.c_cflag = (sg.c_cflag & ~CBAUD) | b_rate;
bd5635a1 289#else
b543979c
JG
290 sg.sg_flags |= RAW | ANYP;
291 sg.sg_flags &= ~ECHO;
292 if (baudrate_set)
293 {
294 sg.sg_ispeed = b_rate;
295 sg.sg_ospeed = b_rate;
296 }
bd5635a1
RP
297#endif
298 ioctl (remote_desc, TIOCSETP, &sg);
299
300 if (from_tty)
301 printf ("Remote debugging using %s\n", name);
302 push_target (&remote_ops); /* Switch to using remote target now */
bd5635a1
RP
303
304#ifndef HAVE_TERMIO
305#ifndef NO_SIGINTERRUPT
306 /* Cause SIGALRM's to make reads fail. */
307 if (siginterrupt (SIGALRM, 1) != 0)
308 perror ("remote_open: error in siginterrupt");
309#endif
310
311 /* Set up read timeout timer. */
e1ce8aa5 312 if ((void (*)()) signal (SIGALRM, remote_timer) == (void (*)()) -1)
bd5635a1
RP
313 perror ("remote_open: error in signal");
314#endif
315
f2ebc25f 316 /* Ack any packet which the remote side has already sent. */
8f86a4e4 317 write (remote_desc, "+\r", 2);
bd5635a1 318 putpkt ("?"); /* initiate a query from remote machine */
f2ebc25f
JK
319
320 start_remote (); /* Initialize gdb process mechanisms */
bd5635a1
RP
321}
322
323/* remote_detach()
324 takes a program previously attached to and detaches it.
325 We better not have left any breakpoints
326 in the program or it'll die when it hits one.
327 Close the open connection to the remote debugger.
328 Use this when you want to detach and do something else
329 with your gdb. */
330
331static void
332remote_detach (args, from_tty)
333 char *args;
334 int from_tty;
335{
336 if (args)
337 error ("Argument given to \"detach\" when remotely debugging.");
338
339 pop_target ();
340 if (from_tty)
341 printf ("Ending remote debugging.\n");
342}
343
344/* Convert hex digit A to a number. */
345
346static int
347fromhex (a)
348 int a;
349{
350 if (a >= '0' && a <= '9')
351 return a - '0';
352 else if (a >= 'a' && a <= 'f')
353 return a - 'a' + 10;
354 else
355 error ("Reply contains invalid hex digit");
356 return -1;
357}
358
359/* Convert number NIB to a hex digit. */
360
361static int
362tohex (nib)
363 int nib;
364{
365 if (nib < 10)
366 return '0'+nib;
367 else
368 return 'a'+nib-10;
369}
370\f
371/* Tell the remote machine to resume. */
372
b543979c 373static void
bd5635a1
RP
374remote_resume (step, siggnal)
375 int step, siggnal;
376{
377 char buf[PBUFSIZ];
378
379 if (siggnal)
8f86a4e4
JG
380 error ("Can't send signals to a remote system. Try `handle %d ignore'.",
381 siggnal);
bd5635a1
RP
382
383#if 0
384 dcache_flush ();
385#endif
386
387 strcpy (buf, step ? "s": "c");
388
389 putpkt (buf);
390}
391
b543979c
JG
392/* Send ^C to target to halt it. Target will respond, and send us a
393 packet. */
394
e676a15f
FF
395void remote_interrupt(signo)
396 int signo;
b543979c 397{
8f86a4e4
JG
398
399 if (kiodebug)
400 printf ("remote_interrupt called\n");
401
b543979c
JG
402 write (remote_desc, "\003", 1); /* Send a ^C */
403}
404
405
bd5635a1 406/* Wait until the remote machine stops, then return,
e1ce8aa5
JK
407 storing status in STATUS just as `wait' would.
408 Returns "pid" (though it's not clear what, if anything, that
409 means in the case of this target). */
bd5635a1 410
b543979c 411static int
bd5635a1
RP
412remote_wait (status)
413 WAITTYPE *status;
414{
415 unsigned char buf[PBUFSIZ];
b543979c 416 void (*ofunc)();
8f86a4e4
JG
417 unsigned char *p;
418 int i;
a03d4f8e 419 long regno;
34517ebc 420 char regs[MAX_REGISTER_RAW_SIZE];
8f86a4e4 421
bd5635a1 422 WSETEXIT ((*status), 0);
b543979c 423
38094c60 424 ofunc = (void (*)()) signal (SIGINT, remote_interrupt);
b543979c
JG
425 getpkt ((char *) buf);
426 signal (SIGINT, ofunc);
427
bd5635a1
RP
428 if (buf[0] == 'E')
429 error ("Remote failure reply: %s", buf);
8f86a4e4
JG
430 if (buf[0] == 'T')
431 {
4ecee2f9 432 /* Expedited reply, containing Signal, {regno, reg} repeat */
a03d4f8e
JG
433 /* format is: 'Tssn...:r...;n...:r...;n...:r...;#cc', where
434 ss = signal number
435 n... = register number
436 r... = register contents
437 */
438
8f86a4e4 439 p = &buf[3]; /* after Txx */
4ecee2f9
SG
440
441 while (*p)
8f86a4e4 442 {
a03d4f8e
JG
443 regno = strtol (p, &p, 16); /* Read the register number */
444
445 if (*p++ != ':'
446 || regno >= NUM_REGS)
447 error ("Remote sent bad register number %s", buf);
4ecee2f9
SG
448
449 for (i = 0; i < REGISTER_RAW_SIZE (regno); i++)
450 {
451 if (p[0] == 0 || p[1] == 0)
452 error ("Remote reply is too short: %s", buf);
453 regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
454 p += 2;
455 }
456
a03d4f8e
JG
457 if (*p++ != ';')
458 error("Remote register badly formatted: %s", buf);
459
4ecee2f9 460 supply_register (regno, regs);
8f86a4e4 461 }
8f86a4e4
JG
462 }
463 else if (buf[0] != 'S')
bd5635a1 464 error ("Invalid remote reply: %s", buf);
8f86a4e4 465
bd5635a1 466 WSETSTOP ((*status), (((fromhex (buf[1])) << 4) + (fromhex (buf[2]))));
8f86a4e4 467
e1ce8aa5 468 return 0;
bd5635a1
RP
469}
470
471/* Read the remote registers into the block REGS. */
e1ce8aa5
JK
472/* Currently we just read all the registers, so we don't use regno. */
473/* ARGSUSED */
b543979c 474static void
bd5635a1
RP
475remote_fetch_registers (regno)
476 int regno;
477{
478 char buf[PBUFSIZ];
479 int i;
480 char *p;
481 char regs[REGISTER_BYTES];
482
483 sprintf (buf, "g");
484 remote_send (buf);
485
486 /* Reply describes registers byte by byte, each byte encoded as two
487 hex characters. Suck them all up, then supply them to the
488 register cacheing/storage mechanism. */
489
490 p = buf;
491 for (i = 0; i < REGISTER_BYTES; i++)
492 {
493 if (p[0] == 0 || p[1] == 0)
494 error ("Remote reply is too short: %s", buf);
495 regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
496 p += 2;
497 }
498 for (i = 0; i < NUM_REGS; i++)
499 supply_register (i, &regs[REGISTER_BYTE(i)]);
bd5635a1
RP
500}
501
502/* Prepare to store registers. Since we send them all, we have to
503 read out the ones we don't want to change first. */
504
b543979c 505static void
bd5635a1
RP
506remote_prepare_to_store ()
507{
34517ebc
JG
508 /* Make sure the entire registers array is valid. */
509 read_register_bytes (0, (char *)NULL, REGISTER_BYTES);
bd5635a1
RP
510}
511
512/* Store the remote registers from the contents of the block REGISTERS.
513 FIXME, eventually just store one register if that's all that is needed. */
514
e1ce8aa5 515/* ARGSUSED */
b543979c 516static void
bd5635a1
RP
517remote_store_registers (regno)
518 int regno;
519{
520 char buf[PBUFSIZ];
521 int i;
522 char *p;
523
524 buf[0] = 'G';
525
526 /* Command describes registers byte by byte,
527 each byte encoded as two hex characters. */
528
529 p = buf + 1;
530 for (i = 0; i < REGISTER_BYTES; i++)
531 {
532 *p++ = tohex ((registers[i] >> 4) & 0xf);
533 *p++ = tohex (registers[i] & 0xf);
534 }
535 *p = '\0';
536
537 remote_send (buf);
bd5635a1
RP
538}
539
540#if 0
541/* Read a word from remote address ADDR and return it.
542 This goes through the data cache. */
543
544int
545remote_fetch_word (addr)
546 CORE_ADDR addr;
547{
548 if (icache)
549 {
550 extern CORE_ADDR text_start, text_end;
551
552 if (addr >= text_start && addr < text_end)
553 {
554 int buffer;
555 xfer_core_file (addr, &buffer, sizeof (int));
556 return buffer;
557 }
558 }
559 return dcache_fetch (addr);
560}
561
562/* Write a word WORD into remote address ADDR.
563 This goes through the data cache. */
564
565void
566remote_store_word (addr, word)
567 CORE_ADDR addr;
568 int word;
569{
570 dcache_poke (addr, word);
571}
572#endif /* 0 */
573\f
574/* Write memory data directly to the remote machine.
575 This does not inform the data cache; the data cache uses this.
576 MEMADDR is the address in the remote memory space.
577 MYADDR is the address of the buffer in our space.
578 LEN is the number of bytes. */
579
b543979c 580static void
bd5635a1
RP
581remote_write_bytes (memaddr, myaddr, len)
582 CORE_ADDR memaddr;
583 char *myaddr;
584 int len;
585{
586 char buf[PBUFSIZ];
587 int i;
588 char *p;
589
590 if (len > PBUFSIZ / 2 - 20)
591 abort ();
592
593 sprintf (buf, "M%x,%x:", memaddr, len);
594
b543979c 595 /* We send target system values byte by byte, in increasing byte addresses,
bd5635a1
RP
596 each byte encoded as two hex characters. */
597
598 p = buf + strlen (buf);
599 for (i = 0; i < len; i++)
600 {
601 *p++ = tohex ((myaddr[i] >> 4) & 0xf);
602 *p++ = tohex (myaddr[i] & 0xf);
603 }
604 *p = '\0';
605
606 remote_send (buf);
607}
608
609/* Read memory data directly from the remote machine.
610 This does not use the data cache; the data cache uses this.
611 MEMADDR is the address in the remote memory space.
612 MYADDR is the address of the buffer in our space.
613 LEN is the number of bytes. */
614
b543979c 615static void
bd5635a1
RP
616remote_read_bytes (memaddr, myaddr, len)
617 CORE_ADDR memaddr;
618 char *myaddr;
619 int len;
620{
621 char buf[PBUFSIZ];
622 int i;
623 char *p;
624
625 if (len > PBUFSIZ / 2 - 1)
626 abort ();
627
628 sprintf (buf, "m%x,%x", memaddr, len);
629 remote_send (buf);
630
b543979c 631 /* Reply describes memory byte by byte,
bd5635a1
RP
632 each byte encoded as two hex characters. */
633
634 p = buf;
635 for (i = 0; i < len; i++)
636 {
637 if (p[0] == 0 || p[1] == 0)
638 error ("Remote reply is too short: %s", buf);
639 myaddr[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
640 p += 2;
641 }
642}
643\f
644/* Read or write LEN bytes from inferior memory at MEMADDR, transferring
e1ce8aa5 645 to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
bd5635a1
RP
646 nonzero. Returns length of data written or read; 0 for error. */
647
b543979c
JG
648/* ARGSUSED */
649static int
650remote_xfer_memory(memaddr, myaddr, len, should_write, target)
bd5635a1
RP
651 CORE_ADDR memaddr;
652 char *myaddr;
653 int len;
e1ce8aa5 654 int should_write;
b543979c 655 struct target_ops *target; /* ignored */
bd5635a1
RP
656{
657 int origlen = len;
658 int xfersize;
659 while (len > 0)
660 {
661 if (len > MAXBUFBYTES)
662 xfersize = MAXBUFBYTES;
663 else
664 xfersize = len;
665
e1ce8aa5 666 if (should_write)
bd5635a1
RP
667 remote_write_bytes(memaddr, myaddr, xfersize);
668 else
669 remote_read_bytes (memaddr, myaddr, xfersize);
670 memaddr += xfersize;
671 myaddr += xfersize;
672 len -= xfersize;
673 }
674 return origlen; /* no error possible */
675}
676
b543979c 677static void
8f86a4e4
JG
678remote_files_info (ignore)
679struct target_ops *ignore;
bd5635a1 680{
8f86a4e4 681 printf ("Debugging a target over a serial line.\n");
bd5635a1
RP
682}
683\f
684/*
685
686A debug packet whose contents are <data>
687is encapsulated for transmission in the form:
688
689 $ <data> # CSUM1 CSUM2
690
691 <data> must be ASCII alphanumeric and cannot include characters
692 '$' or '#'
693
694 CSUM1 and CSUM2 are ascii hex representation of an 8-bit
695 checksum of <data>, the most significant nibble is sent first.
696 the hex digits 0-9,a-f are used.
697
698Receiver responds with:
699
700 + - if CSUM is correct and ready for next packet
701 - - if CSUM is incorrect
702
703*/
704
b543979c
JG
705/* Read a single character from the remote end.
706 (If supported, we actually read many characters and buffer them up.) */
707
bd5635a1
RP
708static int
709readchar ()
710{
b543979c
JG
711 static int inbuf_index, inbuf_count;
712#define INBUFSIZE PBUFSIZ
713 static char inbuf[INBUFSIZE];
bd5635a1 714
b543979c
JG
715 if (inbuf_index >= inbuf_count)
716 {
717 /* Time to do another read... */
718 inbuf_index = 0;
719 inbuf_count = 0;
720 inbuf[0] = 0; /* Just in case */
bd5635a1 721#ifdef HAVE_TERMIO
b543979c
JG
722 /* termio does the timeout for us. */
723 inbuf_count = read (remote_desc, inbuf, INBUFSIZE);
bd5635a1 724#else
b543979c
JG
725 alarm (timeout);
726 inbuf_count = read (remote_desc, inbuf, INBUFSIZE);
727 alarm (0);
bd5635a1 728#endif
b543979c 729 }
bd5635a1 730
b543979c
JG
731 /* Just return the next character from the buffer. */
732 return inbuf[inbuf_index++] & 0x7f;
bd5635a1
RP
733}
734
735/* Send the command in BUF to the remote machine,
736 and read the reply into BUF.
737 Report an error if we get an error reply. */
738
739static void
740remote_send (buf)
741 char *buf;
742{
743
744 putpkt (buf);
745 getpkt (buf);
746
747 if (buf[0] == 'E')
748 error ("Remote failure reply: %s", buf);
749}
750
751/* Send a packet to the remote machine, with error checking.
752 The data of the packet is in BUF. */
753
754static void
755putpkt (buf)
756 char *buf;
757{
758 int i;
759 unsigned char csum = 0;
b543979c 760 char buf2[PBUFSIZ];
bd5635a1
RP
761 int cnt = strlen (buf);
762 char ch;
763 char *p;
764
765 /* Copy the packet into buffer BUF2, encapsulating it
766 and giving it a checksum. */
767
b543979c
JG
768 if (cnt > sizeof(buf2) - 5) /* Prosanity check */
769 abort();
770
bd5635a1
RP
771 p = buf2;
772 *p++ = '$';
773
774 for (i = 0; i < cnt; i++)
775 {
776 csum += buf[i];
777 *p++ = buf[i];
778 }
779 *p++ = '#';
780 *p++ = tohex ((csum >> 4) & 0xf);
781 *p++ = tohex (csum & 0xf);
782
783 /* Send it over and over until we get a positive ack. */
784
785 do {
786 if (kiodebug)
787 {
788 *p = '\0';
8f86a4e4 789 printf ("Sending packet: %s...", buf2); fflush(stdout);
bd5635a1
RP
790 }
791 write (remote_desc, buf2, p - buf2);
792
793 /* read until either a timeout occurs (\0) or '+' is read */
794 do {
795 ch = readchar ();
8f86a4e4
JG
796 if (kiodebug) {
797 if (ch == '+')
798 printf("Ack\n");
799 else
800 printf ("%02X%c ", ch&0xFF, ch);
801 }
bd5635a1
RP
802 } while ((ch != '+') && (ch != '\0'));
803 } while (ch != '+');
804}
805
806/* Read a packet from the remote machine, with error checking,
8f86a4e4 807 and store it in BUF. BUF is expected to be of size PBUFSIZ. */
bd5635a1
RP
808
809static void
810getpkt (buf)
811 char *buf;
812{
813 char *bp;
814 unsigned char csum;
815 int c;
816 unsigned char c1, c2;
38094c60
JG
817 int retries = 0;
818#define MAX_RETRIES 10
bd5635a1 819
eb7ba50c
JK
820#if 0
821 /* Sorry, this will cause all hell to break loose, i.e. we'll end
822 up in the command loop with an inferior, but (at least if this
823 happens in remote_wait or some such place) without a current_frame,
824 having set up prev_* in wait_for_inferior, etc.
825
826 If it is necessary to have such an "emergency exit", seems like
827 the only plausible thing to do is to say the inferior died, and
828 make the user reattach if they want to. Perhaps with a prompt
829 asking for confirmation. */
830
bd5635a1
RP
831 /* allow immediate quit while reading from device, it could be hung */
832 immediate_quit++;
eb7ba50c 833#endif /* 0 */
bd5635a1
RP
834
835 while (1)
836 {
837 /* Force csum to be zero here because of possible error retry. */
838 csum = 0;
839
840 while ((c = readchar()) != '$');
841
842 bp = buf;
843 while (1)
844 {
845 c = readchar ();
846 if (c == '#')
847 break;
8f86a4e4
JG
848 if (bp >= buf+PBUFSIZ-1)
849 {
850 *bp = '\0';
851 printf_filtered ("Remote packet too long: %s\n", buf);
852 goto whole;
853 }
bd5635a1
RP
854 *bp++ = c;
855 csum += c;
856 }
857 *bp = 0;
858
859 c1 = fromhex (readchar ());
860 c2 = fromhex (readchar ());
861 if ((csum & 0xff) == (c1 << 4) + c2)
862 break;
8f86a4e4 863 printf_filtered ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
bd5635a1 864 (c1 << 4) + c2, csum & 0xff, buf);
38094c60 865
8f86a4e4
JG
866 /* Try the whole thing again. */
867whole:
38094c60
JG
868 if (++retries < MAX_RETRIES)
869 {
870 write (remote_desc, "-", 1);
871 }
872 else
873 {
874 printf ("Ignoring packet error, continuing...\n");
875 break;
876 }
bd5635a1
RP
877 }
878
eb7ba50c 879#if 0
bd5635a1 880 immediate_quit--;
eb7ba50c 881#endif
bd5635a1
RP
882
883 write (remote_desc, "+", 1);
884
885 if (kiodebug)
8f86a4e4 886 fprintf (stderr,"Packet received: %s\n", buf);
bd5635a1
RP
887}
888\f
889/* The data cache leads to incorrect results because it doesn't know about
890 volatile variables, thus making it impossible to debug functions which
891 use hardware registers. Therefore it is #if 0'd out. Effect on
892 performance is some, for backtraces of functions with a few
893 arguments each. For functions with many arguments, the stack
894 frames don't fit in the cache blocks, which makes the cache less
895 helpful. Disabling the cache is a big performance win for fetching
896 large structures, because the cache code fetched data in 16-byte
897 chunks. */
898#if 0
899/* The data cache records all the data read from the remote machine
900 since the last time it stopped.
901
902 Each cache block holds 16 bytes of data
903 starting at a multiple-of-16 address. */
904
905#define DCACHE_SIZE 64 /* Number of cache blocks */
906
907struct dcache_block {
908 struct dcache_block *next, *last;
909 unsigned int addr; /* Address for which data is recorded. */
910 int data[4];
911};
912
913struct dcache_block dcache_free, dcache_valid;
914
915/* Free all the data cache blocks, thus discarding all cached data. */
916
917static void
918dcache_flush ()
919{
920 register struct dcache_block *db;
921
922 while ((db = dcache_valid.next) != &dcache_valid)
923 {
924 remque (db);
925 insque (db, &dcache_free);
926 }
927}
928
929/*
930 * If addr is present in the dcache, return the address of the block
931 * containing it.
932 */
933
934struct dcache_block *
935dcache_hit (addr)
936{
937 register struct dcache_block *db;
938
939 if (addr & 3)
940 abort ();
941
942 /* Search all cache blocks for one that is at this address. */
943 db = dcache_valid.next;
944 while (db != &dcache_valid)
945 {
946 if ((addr & 0xfffffff0) == db->addr)
947 return db;
948 db = db->next;
949 }
950 return NULL;
951}
952
953/* Return the int data at address ADDR in dcache block DC. */
954
955int
956dcache_value (db, addr)
957 struct dcache_block *db;
958 unsigned int addr;
959{
960 if (addr & 3)
961 abort ();
962 return (db->data[(addr>>2)&3]);
963}
964
965/* Get a free cache block, put it on the valid list,
966 and return its address. The caller should store into the block
967 the address and data that it describes. */
968
969struct dcache_block *
970dcache_alloc ()
971{
972 register struct dcache_block *db;
973
974 if ((db = dcache_free.next) == &dcache_free)
975 /* If we can't get one from the free list, take last valid */
976 db = dcache_valid.last;
977
978 remque (db);
979 insque (db, &dcache_valid);
980 return (db);
981}
982
983/* Return the contents of the word at address ADDR in the remote machine,
984 using the data cache. */
985
986int
987dcache_fetch (addr)
988 CORE_ADDR addr;
989{
990 register struct dcache_block *db;
991
992 db = dcache_hit (addr);
993 if (db == 0)
994 {
995 db = dcache_alloc ();
996 remote_read_bytes (addr & ~0xf, db->data, 16);
997 db->addr = addr & ~0xf;
998 }
999 return (dcache_value (db, addr));
1000}
1001
1002/* Write the word at ADDR both in the data cache and in the remote machine. */
1003
1004dcache_poke (addr, data)
1005 CORE_ADDR addr;
1006 int data;
1007{
1008 register struct dcache_block *db;
1009
1010 /* First make sure the word is IN the cache. DB is its cache block. */
1011 db = dcache_hit (addr);
1012 if (db == 0)
1013 {
1014 db = dcache_alloc ();
1015 remote_read_bytes (addr & ~0xf, db->data, 16);
1016 db->addr = addr & ~0xf;
1017 }
1018
1019 /* Modify the word in the cache. */
1020 db->data[(addr>>2)&3] = data;
1021
1022 /* Send the changed word. */
1023 remote_write_bytes (addr, &data, 4);
1024}
1025
1026/* Initialize the data cache. */
1027
1028dcache_init ()
1029{
1030 register i;
1031 register struct dcache_block *db;
1032
1033 db = (struct dcache_block *) xmalloc (sizeof (struct dcache_block) *
1034 DCACHE_SIZE);
1035 dcache_free.next = dcache_free.last = &dcache_free;
1036 dcache_valid.next = dcache_valid.last = &dcache_valid;
1037 for (i=0;i<DCACHE_SIZE;i++,db++)
1038 insque (db, &dcache_free);
1039}
1040#endif /* 0 */
1041
1042/* Define the target subroutine names */
1043
1044struct target_ops remote_ops = {
b543979c
JG
1045 "remote", /* to_shortname */
1046 "Remote serial target in gdb-specific protocol", /* to_longname */
1047 "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
1048Specify the serial device it is connected to (e.g. /dev/ttya).", /* to_doc */
1049 remote_open, /* to_open */
1050 remote_close, /* to_close */
1051 NULL, /* to_attach */
1052 remote_detach, /* to_detach */
1053 remote_resume, /* to_resume */
1054 remote_wait, /* to_wait */
1055 remote_fetch_registers, /* to_fetch_registers */
1056 remote_store_registers, /* to_store_registers */
1057 remote_prepare_to_store, /* to_prepare_to_store */
b543979c
JG
1058 remote_xfer_memory, /* to_xfer_memory */
1059 remote_files_info, /* to_files_info */
1060 NULL, /* to_insert_breakpoint */
1061 NULL, /* to_remove_breakpoint */
1062 NULL, /* to_terminal_init */
1063 NULL, /* to_terminal_inferior */
1064 NULL, /* to_terminal_ours_for_output */
1065 NULL, /* to_terminal_ours */
1066 NULL, /* to_terminal_info */
1067 NULL, /* to_kill */
1068 NULL, /* to_load */
1069 NULL, /* to_lookup_symbol */
1070 NULL, /* to_create_inferior */
1071 NULL, /* to_mourn_inferior */
34517ebc 1072 0, /* to_can_run */
b543979c
JG
1073 process_stratum, /* to_stratum */
1074 NULL, /* to_next */
1075 1, /* to_has_all_memory */
1076 1, /* to_has_memory */
1077 1, /* to_has_stack */
1078 1, /* to_has_registers */
1079 1, /* to_has_execution */
1080 NULL, /* sections */
1081 NULL, /* sections_end */
1082 OPS_MAGIC /* to_magic */
bd5635a1
RP
1083};
1084
1085void
1086_initialize_remote ()
1087{
1088 add_target (&remote_ops);
8f86a4e4
JG
1089
1090 add_show_from_set (
1091 add_set_cmd ("remotedebug", no_class, var_boolean, (char *)&kiodebug,
1092 "Set debugging of remote serial I/O.\n\
1093When enabled, each packet sent or received with the remote target\n\
1094is displayed.", &setlist),
1095 &showlist);
bd5635a1 1096}
8f86a4e4
JG
1097
1098#endif
This page took 0.145696 seconds and 4 git commands to generate.