* sparc-stub.c: New file. Mix it with your SPARClite
[deliverable/binutils-gdb.git] / gdb / remote.c
1 /* Remote target communications for serial-line targets in custom GDB protocol
2 Copyright 1988, 1991, 1992 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 void
115 remote_open PARAMS ((char *, int));
116
117 static void
118 remote_close PARAMS ((int));
119
120 static void
121 remote_store_registers PARAMS ((int));
122
123 static void
124 getpkt PARAMS ((char *));
125
126 static void
127 putpkt PARAMS ((char *));
128
129 static void
130 remote_send PARAMS ((char *));
131
132 static int
133 readchar PARAMS ((void));
134
135 static int
136 remote_wait PARAMS ((WAITTYPE *));
137
138 static int
139 tohex PARAMS ((int));
140
141 static int
142 fromhex PARAMS ((int));
143
144 static void
145 remote_detach PARAMS ((char *, int));
146
147
148 extern struct target_ops remote_ops; /* Forward decl */
149
150 static int kiodebug = 0;
151 static int timeout = 5;
152
153 #if 0
154 int 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. */
160 int remote_desc = -1;
161
162 #define PBUFSIZ 1024
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
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)
172 #endif
173 \f
174 /* Called when SIGALRM signal sent due to alarm() timeout. */
175 #ifndef HAVE_TERMIO
176 void
177 remote_timer (signo)
178 int signo;
179 {
180 if (kiodebug)
181 printf ("remote_timer called\n");
182
183 alarm (timeout);
184 }
185 #endif
186
187 /* Clean up connection to a remote debugger. */
188
189 /* ARGSUSED */
190 static void
191 remote_close (quitting)
192 int quitting;
193 {
194 if (remote_desc >= 0)
195 close (remote_desc);
196 remote_desc = -1;
197 }
198
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
209
210
211 static 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
231 static int
232 damn_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
242 /* Open a connection to a remote debugger.
243 NAME is the filename used for communication. */
244
245 static void
246 remote_open (name, from_tty)
247 char *name;
248 int from_tty;
249 {
250 TERMINAL sg;
251 int a_rate, b_rate = 0;
252 int baudrate_set = 0;
253
254 if (name == 0)
255 error (
256 "To open a remote debug connection, you need to specify what serial\n\
257 device is attached to the remote system (e.g. /dev/ttya).");
258
259 target_preopen (from_tty);
260
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
271 if (baud_rate)
272 {
273 if (1 != sscanf (baud_rate, "%d ", &a_rate))
274 {
275 b_rate = damn_b (a_rate);
276 baudrate_set = 1;
277 }
278 }
279
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);
285 sg.c_cflag &= ~PARENB; /* No parity */
286 sg.c_cflag |= CS8; /* 8-bit path */
287 if (baudrate_set)
288 sg.c_cflag = (sg.c_cflag & ~CBAUD) | b_rate;
289 #else
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 }
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 */
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. */
312 if ((void (*)()) signal (SIGALRM, remote_timer) == (void (*)()) -1)
313 perror ("remote_open: error in signal");
314 #endif
315
316 /* Ack any packet which the remote side has already sent. */
317 write (remote_desc, "+\r", 2);
318 putpkt ("?"); /* initiate a query from remote machine */
319
320 start_remote (); /* Initialize gdb process mechanisms */
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
331 static void
332 remote_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
346 static int
347 fromhex (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
361 static int
362 tohex (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
373 static void
374 remote_resume (step, siggnal)
375 int step, siggnal;
376 {
377 char buf[PBUFSIZ];
378
379 if (siggnal)
380 error ("Can't send signals to a remote system. Try `handle %d ignore'.",
381 siggnal);
382
383 #if 0
384 dcache_flush ();
385 #endif
386
387 strcpy (buf, step ? "s": "c");
388
389 putpkt (buf);
390 }
391
392 /* Send ^C to target to halt it. Target will respond, and send us a
393 packet. */
394
395 void remote_interrupt(signo)
396 int signo;
397 {
398
399 if (kiodebug)
400 printf ("remote_interrupt called\n");
401
402 write (remote_desc, "\003", 1); /* Send a ^C */
403 }
404
405
406 /* Wait until the remote machine stops, then return,
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). */
410
411 static int
412 remote_wait (status)
413 WAITTYPE *status;
414 {
415 unsigned char buf[PBUFSIZ];
416 void (*ofunc)();
417 unsigned char *p;
418 int i;
419 int regno;
420 unsigned char regs[8]; /* Better be big enough for largest reg */
421
422 WSETEXIT ((*status), 0);
423
424 ofunc = (void (*)()) signal (SIGINT, remote_interrupt);
425 getpkt ((char *) buf);
426 signal (SIGINT, ofunc);
427
428 if (buf[0] == 'E')
429 error ("Remote failure reply: %s", buf);
430 if (buf[0] == 'T')
431 {
432 /* Expedited reply, containing Signal, {regno, reg} repeat */
433 p = &buf[3]; /* after Txx */
434
435 while (*p)
436 {
437 regno = fromhex (p[0]) * 16 + fromhex (p[1]);
438 p += 2;
439 if (regno >= NUM_REGS)
440 error ("Remote sent illegal register number %d (0x%x)", regno,
441 regno);
442
443 for (i = 0; i < REGISTER_RAW_SIZE (regno); i++)
444 {
445 if (p[0] == 0 || p[1] == 0)
446 error ("Remote reply is too short: %s", buf);
447 regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
448 p += 2;
449 }
450
451 supply_register (regno, regs);
452 }
453 }
454 else if (buf[0] != 'S')
455 error ("Invalid remote reply: %s", buf);
456
457 WSETSTOP ((*status), (((fromhex (buf[1])) << 4) + (fromhex (buf[2]))));
458
459 return 0;
460 }
461
462 /* Read the remote registers into the block REGS. */
463 /* Currently we just read all the registers, so we don't use regno. */
464 /* ARGSUSED */
465 static void
466 remote_fetch_registers (regno)
467 int regno;
468 {
469 char buf[PBUFSIZ];
470 int i;
471 char *p;
472 char regs[REGISTER_BYTES];
473
474 sprintf (buf, "g");
475 remote_send (buf);
476
477 /* Reply describes registers byte by byte, each byte encoded as two
478 hex characters. Suck them all up, then supply them to the
479 register cacheing/storage mechanism. */
480
481 p = buf;
482 for (i = 0; i < REGISTER_BYTES; i++)
483 {
484 if (p[0] == 0 || p[1] == 0)
485 error ("Remote reply is too short: %s", buf);
486 regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
487 p += 2;
488 }
489 for (i = 0; i < NUM_REGS; i++)
490 supply_register (i, &regs[REGISTER_BYTE(i)]);
491 }
492
493 /* Prepare to store registers. Since we send them all, we have to
494 read out the ones we don't want to change first. */
495
496 static void
497 remote_prepare_to_store ()
498 {
499 remote_fetch_registers (-1);
500 }
501
502 /* Store the remote registers from the contents of the block REGISTERS.
503 FIXME, eventually just store one register if that's all that is needed. */
504
505 /* ARGSUSED */
506 static void
507 remote_store_registers (regno)
508 int regno;
509 {
510 char buf[PBUFSIZ];
511 int i;
512 char *p;
513
514 buf[0] = 'G';
515
516 /* Command describes registers byte by byte,
517 each byte encoded as two hex characters. */
518
519 p = buf + 1;
520 for (i = 0; i < REGISTER_BYTES; i++)
521 {
522 *p++ = tohex ((registers[i] >> 4) & 0xf);
523 *p++ = tohex (registers[i] & 0xf);
524 }
525 *p = '\0';
526
527 remote_send (buf);
528 }
529
530 #if 0
531 /* Read a word from remote address ADDR and return it.
532 This goes through the data cache. */
533
534 int
535 remote_fetch_word (addr)
536 CORE_ADDR addr;
537 {
538 if (icache)
539 {
540 extern CORE_ADDR text_start, text_end;
541
542 if (addr >= text_start && addr < text_end)
543 {
544 int buffer;
545 xfer_core_file (addr, &buffer, sizeof (int));
546 return buffer;
547 }
548 }
549 return dcache_fetch (addr);
550 }
551
552 /* Write a word WORD into remote address ADDR.
553 This goes through the data cache. */
554
555 void
556 remote_store_word (addr, word)
557 CORE_ADDR addr;
558 int word;
559 {
560 dcache_poke (addr, word);
561 }
562 #endif /* 0 */
563 \f
564 /* Write memory data directly to the remote machine.
565 This does not inform the data cache; the data cache uses this.
566 MEMADDR is the address in the remote memory space.
567 MYADDR is the address of the buffer in our space.
568 LEN is the number of bytes. */
569
570 static void
571 remote_write_bytes (memaddr, myaddr, len)
572 CORE_ADDR memaddr;
573 char *myaddr;
574 int len;
575 {
576 char buf[PBUFSIZ];
577 int i;
578 char *p;
579
580 if (len > PBUFSIZ / 2 - 20)
581 abort ();
582
583 sprintf (buf, "M%x,%x:", memaddr, len);
584
585 /* We send target system values byte by byte, in increasing byte addresses,
586 each byte encoded as two hex characters. */
587
588 p = buf + strlen (buf);
589 for (i = 0; i < len; i++)
590 {
591 *p++ = tohex ((myaddr[i] >> 4) & 0xf);
592 *p++ = tohex (myaddr[i] & 0xf);
593 }
594 *p = '\0';
595
596 remote_send (buf);
597 }
598
599 /* Read memory data directly from the remote machine.
600 This does not use the data cache; the data cache uses this.
601 MEMADDR is the address in the remote memory space.
602 MYADDR is the address of the buffer in our space.
603 LEN is the number of bytes. */
604
605 static void
606 remote_read_bytes (memaddr, myaddr, len)
607 CORE_ADDR memaddr;
608 char *myaddr;
609 int len;
610 {
611 char buf[PBUFSIZ];
612 int i;
613 char *p;
614
615 if (len > PBUFSIZ / 2 - 1)
616 abort ();
617
618 sprintf (buf, "m%x,%x", memaddr, len);
619 remote_send (buf);
620
621 /* Reply describes memory byte by byte,
622 each byte encoded as two hex characters. */
623
624 p = buf;
625 for (i = 0; i < len; i++)
626 {
627 if (p[0] == 0 || p[1] == 0)
628 error ("Remote reply is too short: %s", buf);
629 myaddr[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
630 p += 2;
631 }
632 }
633 \f
634 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
635 to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
636 nonzero. Returns length of data written or read; 0 for error. */
637
638 /* ARGSUSED */
639 static int
640 remote_xfer_memory(memaddr, myaddr, len, should_write, target)
641 CORE_ADDR memaddr;
642 char *myaddr;
643 int len;
644 int should_write;
645 struct target_ops *target; /* ignored */
646 {
647 int origlen = len;
648 int xfersize;
649 while (len > 0)
650 {
651 if (len > MAXBUFBYTES)
652 xfersize = MAXBUFBYTES;
653 else
654 xfersize = len;
655
656 if (should_write)
657 remote_write_bytes(memaddr, myaddr, xfersize);
658 else
659 remote_read_bytes (memaddr, myaddr, xfersize);
660 memaddr += xfersize;
661 myaddr += xfersize;
662 len -= xfersize;
663 }
664 return origlen; /* no error possible */
665 }
666
667 static void
668 remote_files_info (ignore)
669 struct target_ops *ignore;
670 {
671 printf ("Debugging a target over a serial line.\n");
672 }
673 \f
674 /*
675
676 A debug packet whose contents are <data>
677 is encapsulated for transmission in the form:
678
679 $ <data> # CSUM1 CSUM2
680
681 <data> must be ASCII alphanumeric and cannot include characters
682 '$' or '#'
683
684 CSUM1 and CSUM2 are ascii hex representation of an 8-bit
685 checksum of <data>, the most significant nibble is sent first.
686 the hex digits 0-9,a-f are used.
687
688 Receiver responds with:
689
690 + - if CSUM is correct and ready for next packet
691 - - if CSUM is incorrect
692
693 */
694
695 /* Read a single character from the remote end.
696 (If supported, we actually read many characters and buffer them up.) */
697
698 static int
699 readchar ()
700 {
701 static int inbuf_index, inbuf_count;
702 #define INBUFSIZE PBUFSIZ
703 static char inbuf[INBUFSIZE];
704
705 if (inbuf_index >= inbuf_count)
706 {
707 /* Time to do another read... */
708 inbuf_index = 0;
709 inbuf_count = 0;
710 inbuf[0] = 0; /* Just in case */
711 #ifdef HAVE_TERMIO
712 /* termio does the timeout for us. */
713 inbuf_count = read (remote_desc, inbuf, INBUFSIZE);
714 #else
715 alarm (timeout);
716 inbuf_count = read (remote_desc, inbuf, INBUFSIZE);
717 alarm (0);
718 #endif
719 }
720
721 /* Just return the next character from the buffer. */
722 return inbuf[inbuf_index++] & 0x7f;
723 }
724
725 /* Send the command in BUF to the remote machine,
726 and read the reply into BUF.
727 Report an error if we get an error reply. */
728
729 static void
730 remote_send (buf)
731 char *buf;
732 {
733
734 putpkt (buf);
735 getpkt (buf);
736
737 if (buf[0] == 'E')
738 error ("Remote failure reply: %s", buf);
739 }
740
741 /* Send a packet to the remote machine, with error checking.
742 The data of the packet is in BUF. */
743
744 static void
745 putpkt (buf)
746 char *buf;
747 {
748 int i;
749 unsigned char csum = 0;
750 char buf2[PBUFSIZ];
751 int cnt = strlen (buf);
752 char ch;
753 char *p;
754
755 /* Copy the packet into buffer BUF2, encapsulating it
756 and giving it a checksum. */
757
758 if (cnt > sizeof(buf2) - 5) /* Prosanity check */
759 abort();
760
761 p = buf2;
762 *p++ = '$';
763
764 for (i = 0; i < cnt; i++)
765 {
766 csum += buf[i];
767 *p++ = buf[i];
768 }
769 *p++ = '#';
770 *p++ = tohex ((csum >> 4) & 0xf);
771 *p++ = tohex (csum & 0xf);
772
773 /* Send it over and over until we get a positive ack. */
774
775 do {
776 if (kiodebug)
777 {
778 *p = '\0';
779 printf ("Sending packet: %s...", buf2); fflush(stdout);
780 }
781 write (remote_desc, buf2, p - buf2);
782
783 /* read until either a timeout occurs (\0) or '+' is read */
784 do {
785 ch = readchar ();
786 if (kiodebug) {
787 if (ch == '+')
788 printf("Ack\n");
789 else
790 printf ("%02X%c ", ch&0xFF, ch);
791 }
792 } while ((ch != '+') && (ch != '\0'));
793 } while (ch != '+');
794 }
795
796 /* Read a packet from the remote machine, with error checking,
797 and store it in BUF. BUF is expected to be of size PBUFSIZ. */
798
799 static void
800 getpkt (buf)
801 char *buf;
802 {
803 char *bp;
804 unsigned char csum;
805 int c;
806 unsigned char c1, c2;
807 int retries = 0;
808 #define MAX_RETRIES 10
809
810 #if 0
811 /* Sorry, this will cause all hell to break loose, i.e. we'll end
812 up in the command loop with an inferior, but (at least if this
813 happens in remote_wait or some such place) without a current_frame,
814 having set up prev_* in wait_for_inferior, etc.
815
816 If it is necessary to have such an "emergency exit", seems like
817 the only plausible thing to do is to say the inferior died, and
818 make the user reattach if they want to. Perhaps with a prompt
819 asking for confirmation. */
820
821 /* allow immediate quit while reading from device, it could be hung */
822 immediate_quit++;
823 #endif /* 0 */
824
825 while (1)
826 {
827 /* Force csum to be zero here because of possible error retry. */
828 csum = 0;
829
830 while ((c = readchar()) != '$');
831
832 bp = buf;
833 while (1)
834 {
835 c = readchar ();
836 if (c == '#')
837 break;
838 if (bp >= buf+PBUFSIZ-1)
839 {
840 *bp = '\0';
841 printf_filtered ("Remote packet too long: %s\n", buf);
842 goto whole;
843 }
844 *bp++ = c;
845 csum += c;
846 }
847 *bp = 0;
848
849 c1 = fromhex (readchar ());
850 c2 = fromhex (readchar ());
851 if ((csum & 0xff) == (c1 << 4) + c2)
852 break;
853 printf_filtered ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
854 (c1 << 4) + c2, csum & 0xff, buf);
855
856 /* Try the whole thing again. */
857 whole:
858 if (++retries < MAX_RETRIES)
859 {
860 write (remote_desc, "-", 1);
861 }
862 else
863 {
864 printf ("Ignoring packet error, continuing...\n");
865 break;
866 }
867 }
868
869 #if 0
870 immediate_quit--;
871 #endif
872
873 write (remote_desc, "+", 1);
874
875 if (kiodebug)
876 fprintf (stderr,"Packet received: %s\n", buf);
877 }
878 \f
879 /* The data cache leads to incorrect results because it doesn't know about
880 volatile variables, thus making it impossible to debug functions which
881 use hardware registers. Therefore it is #if 0'd out. Effect on
882 performance is some, for backtraces of functions with a few
883 arguments each. For functions with many arguments, the stack
884 frames don't fit in the cache blocks, which makes the cache less
885 helpful. Disabling the cache is a big performance win for fetching
886 large structures, because the cache code fetched data in 16-byte
887 chunks. */
888 #if 0
889 /* The data cache records all the data read from the remote machine
890 since the last time it stopped.
891
892 Each cache block holds 16 bytes of data
893 starting at a multiple-of-16 address. */
894
895 #define DCACHE_SIZE 64 /* Number of cache blocks */
896
897 struct dcache_block {
898 struct dcache_block *next, *last;
899 unsigned int addr; /* Address for which data is recorded. */
900 int data[4];
901 };
902
903 struct dcache_block dcache_free, dcache_valid;
904
905 /* Free all the data cache blocks, thus discarding all cached data. */
906
907 static void
908 dcache_flush ()
909 {
910 register struct dcache_block *db;
911
912 while ((db = dcache_valid.next) != &dcache_valid)
913 {
914 remque (db);
915 insque (db, &dcache_free);
916 }
917 }
918
919 /*
920 * If addr is present in the dcache, return the address of the block
921 * containing it.
922 */
923
924 struct dcache_block *
925 dcache_hit (addr)
926 {
927 register struct dcache_block *db;
928
929 if (addr & 3)
930 abort ();
931
932 /* Search all cache blocks for one that is at this address. */
933 db = dcache_valid.next;
934 while (db != &dcache_valid)
935 {
936 if ((addr & 0xfffffff0) == db->addr)
937 return db;
938 db = db->next;
939 }
940 return NULL;
941 }
942
943 /* Return the int data at address ADDR in dcache block DC. */
944
945 int
946 dcache_value (db, addr)
947 struct dcache_block *db;
948 unsigned int addr;
949 {
950 if (addr & 3)
951 abort ();
952 return (db->data[(addr>>2)&3]);
953 }
954
955 /* Get a free cache block, put it on the valid list,
956 and return its address. The caller should store into the block
957 the address and data that it describes. */
958
959 struct dcache_block *
960 dcache_alloc ()
961 {
962 register struct dcache_block *db;
963
964 if ((db = dcache_free.next) == &dcache_free)
965 /* If we can't get one from the free list, take last valid */
966 db = dcache_valid.last;
967
968 remque (db);
969 insque (db, &dcache_valid);
970 return (db);
971 }
972
973 /* Return the contents of the word at address ADDR in the remote machine,
974 using the data cache. */
975
976 int
977 dcache_fetch (addr)
978 CORE_ADDR addr;
979 {
980 register struct dcache_block *db;
981
982 db = dcache_hit (addr);
983 if (db == 0)
984 {
985 db = dcache_alloc ();
986 remote_read_bytes (addr & ~0xf, db->data, 16);
987 db->addr = addr & ~0xf;
988 }
989 return (dcache_value (db, addr));
990 }
991
992 /* Write the word at ADDR both in the data cache and in the remote machine. */
993
994 dcache_poke (addr, data)
995 CORE_ADDR addr;
996 int data;
997 {
998 register struct dcache_block *db;
999
1000 /* First make sure the word is IN the cache. DB is its cache block. */
1001 db = dcache_hit (addr);
1002 if (db == 0)
1003 {
1004 db = dcache_alloc ();
1005 remote_read_bytes (addr & ~0xf, db->data, 16);
1006 db->addr = addr & ~0xf;
1007 }
1008
1009 /* Modify the word in the cache. */
1010 db->data[(addr>>2)&3] = data;
1011
1012 /* Send the changed word. */
1013 remote_write_bytes (addr, &data, 4);
1014 }
1015
1016 /* Initialize the data cache. */
1017
1018 dcache_init ()
1019 {
1020 register i;
1021 register struct dcache_block *db;
1022
1023 db = (struct dcache_block *) xmalloc (sizeof (struct dcache_block) *
1024 DCACHE_SIZE);
1025 dcache_free.next = dcache_free.last = &dcache_free;
1026 dcache_valid.next = dcache_valid.last = &dcache_valid;
1027 for (i=0;i<DCACHE_SIZE;i++,db++)
1028 insque (db, &dcache_free);
1029 }
1030 #endif /* 0 */
1031
1032 /* Define the target subroutine names */
1033
1034 struct target_ops remote_ops = {
1035 "remote", /* to_shortname */
1036 "Remote serial target in gdb-specific protocol", /* to_longname */
1037 "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
1038 Specify the serial device it is connected to (e.g. /dev/ttya).", /* to_doc */
1039 remote_open, /* to_open */
1040 remote_close, /* to_close */
1041 NULL, /* to_attach */
1042 remote_detach, /* to_detach */
1043 remote_resume, /* to_resume */
1044 remote_wait, /* to_wait */
1045 remote_fetch_registers, /* to_fetch_registers */
1046 remote_store_registers, /* to_store_registers */
1047 remote_prepare_to_store, /* to_prepare_to_store */
1048 NULL, /* to_convert_to_virtual */
1049 NULL, /* to_convert_from_virtual */
1050 remote_xfer_memory, /* to_xfer_memory */
1051 remote_files_info, /* to_files_info */
1052 NULL, /* to_insert_breakpoint */
1053 NULL, /* to_remove_breakpoint */
1054 NULL, /* to_terminal_init */
1055 NULL, /* to_terminal_inferior */
1056 NULL, /* to_terminal_ours_for_output */
1057 NULL, /* to_terminal_ours */
1058 NULL, /* to_terminal_info */
1059 NULL, /* to_kill */
1060 NULL, /* to_load */
1061 NULL, /* to_lookup_symbol */
1062 NULL, /* to_create_inferior */
1063 NULL, /* to_mourn_inferior */
1064 process_stratum, /* to_stratum */
1065 NULL, /* to_next */
1066 1, /* to_has_all_memory */
1067 1, /* to_has_memory */
1068 1, /* to_has_stack */
1069 1, /* to_has_registers */
1070 1, /* to_has_execution */
1071 NULL, /* sections */
1072 NULL, /* sections_end */
1073 OPS_MAGIC /* to_magic */
1074 };
1075
1076 void
1077 _initialize_remote ()
1078 {
1079 add_target (&remote_ops);
1080
1081 add_show_from_set (
1082 add_set_cmd ("remotedebug", no_class, var_boolean, (char *)&kiodebug,
1083 "Set debugging of remote serial I/O.\n\
1084 When enabled, each packet sent or received with the remote target\n\
1085 is displayed.", &setlist),
1086 &showlist);
1087 }
1088
1089 #endif
This page took 0.051611 seconds and 5 git commands to generate.