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