1 /* Remote target communications for serial-line targets in custom GDB protocol
2 Copyright 1988, 1991, 1992 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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. */
20 /* Remote communication protocol.
21 All values are encoded in ascii hex digits.
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.
33 write regs GXX..XX Each byte of register data
34 is described by two hex digits.
38 read mem mAA..AA,LLLL AA..AA is address, LLLL is length.
39 reply XX..XX XX..XX is mem contents
42 write mem MAA..AA,LLLL:XX..XX
44 LLLL is number of bytes,
49 cont cAA..AA AA..AA is address to resume
51 resume at same address.
53 step sAA..AA AA..AA is address to resume
55 resume at same address.
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
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"
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).
84 #if !defined(DONT_USE_REMOTE)
86 #include <sys/types.h>
91 /* Prototypes for local functions */
94 remote_write_bytes
PARAMS ((CORE_ADDR
, char *, int));
97 remote_read_bytes
PARAMS ((CORE_ADDR
, char *, int));
100 remote_files_info
PARAMS ((struct target_ops
*));
103 remote_xfer_memory
PARAMS ((CORE_ADDR
, char *, int, int, struct target_ops
*));
106 remote_prepare_to_store
PARAMS ((void));
109 remote_fetch_registers
PARAMS ((int));
112 remote_resume
PARAMS ((int, int));
115 remote_open
PARAMS ((char *, int));
118 remote_close
PARAMS ((int));
121 remote_store_registers
PARAMS ((int));
124 getpkt
PARAMS ((char *));
127 putpkt
PARAMS ((char *));
130 remote_send
PARAMS ((char *));
133 readchar
PARAMS ((void));
136 remote_wait
PARAMS ((WAITTYPE
*));
139 tohex
PARAMS ((int));
142 fromhex
PARAMS ((int));
145 remote_detach
PARAMS ((char *, int));
148 extern struct target_ops remote_ops
; /* Forward decl */
150 static int kiodebug
= 0;
151 static int timeout
= 5;
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
160 int remote_desc
= -1;
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)
168 /* Round up PBUFSIZ to hold all the registers, at least. */
169 #if REGISTER_BYTES > MAXBUFBYTES
171 #define PBUFSIZ (REGISTER_BYTES * 2 + 32)
174 /* Called when SIGALRM signal sent due to alarm() timeout. */
181 printf ("remote_timer called\n");
187 /* Clean up connection to a remote debugger. */
191 remote_close (quitting
)
194 if (remote_desc
>= 0)
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. */
211 static struct {int rate
, damn_b
;} baudtab
[] = {
237 for (i
= 0; baudtab
[i
].rate
!= -1; i
++)
238 if (rate
== baudtab
[i
].rate
) return baudtab
[i
].damn_b
;
239 return B38400
; /* Random */
242 /* Open a connection to a remote debugger.
243 NAME is the filename used for communication. */
246 remote_open (name
, from_tty
)
251 int a_rate
, b_rate
= 0;
252 int baudrate_set
= 0;
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).");
259 target_preopen (from_tty
);
267 remote_desc
= open (name
, O_RDWR
);
269 perror_with_name (name
);
273 if (1 != sscanf (baud_rate
, "%d ", &a_rate
))
275 b_rate
= damn_b (a_rate
);
280 ioctl (remote_desc
, TIOCGETP
, &sg
);
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 */
288 sg
.c_cflag
= (sg
.c_cflag
& ~CBAUD
) | b_rate
;
290 sg
.sg_flags
|= RAW
| ANYP
;
291 sg
.sg_flags
&= ~ECHO
;
294 sg
.sg_ispeed
= b_rate
;
295 sg
.sg_ospeed
= b_rate
;
298 ioctl (remote_desc
, TIOCSETP
, &sg
);
301 printf ("Remote debugging using %s\n", name
);
302 push_target (&remote_ops
); /* Switch to using remote target now */
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");
311 /* Set up read timeout timer. */
312 if ((void (*)()) signal (SIGALRM
, remote_timer
) == (void (*)()) -1)
313 perror ("remote_open: error in signal");
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 */
320 start_remote (); /* Initialize gdb process mechanisms */
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
332 remote_detach (args
, from_tty
)
337 error ("Argument given to \"detach\" when remotely debugging.");
341 printf ("Ending remote debugging.\n");
344 /* Convert hex digit A to a number. */
350 if (a
>= '0' && a
<= '9')
352 else if (a
>= 'a' && a
<= 'f')
355 error ("Reply contains invalid hex digit");
359 /* Convert number NIB to a hex digit. */
371 /* Tell the remote machine to resume. */
374 remote_resume (step
, siggnal
)
380 error ("Can't send signals to a remote system. Try `handle %d ignore'.",
387 strcpy (buf
, step
? "s": "c");
392 /* Send ^C to target to halt it. Target will respond, and send us a
395 void remote_interrupt(signo
)
400 printf ("remote_interrupt called\n");
402 write (remote_desc
, "\003", 1); /* Send a ^C */
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). */
415 unsigned char buf
[PBUFSIZ
];
420 unsigned char regs
[8]; /* Better be big enough for largest reg */
422 WSETEXIT ((*status
), 0);
424 ofunc
= (void (*)()) signal (SIGINT
, remote_interrupt
);
425 getpkt ((char *) buf
);
426 signal (SIGINT
, ofunc
);
429 error ("Remote failure reply: %s", buf
);
432 /* Expedited reply, containing Signal, {regno, reg} repeat */
433 p
= &buf
[3]; /* after Txx */
437 regno
= fromhex (p
[0]) * 16 + fromhex (p
[1]);
439 if (regno
>= NUM_REGS
)
440 error ("Remote sent illegal register number %d (0x%x)", regno
,
443 for (i
= 0; i
< REGISTER_RAW_SIZE (regno
); i
++)
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]);
451 supply_register (regno
, regs
);
454 else if (buf
[0] != 'S')
455 error ("Invalid remote reply: %s", buf
);
457 WSETSTOP ((*status
), (((fromhex (buf
[1])) << 4) + (fromhex (buf
[2]))));
462 /* Read the remote registers into the block REGS. */
463 /* Currently we just read all the registers, so we don't use regno. */
466 remote_fetch_registers (regno
)
472 char regs
[REGISTER_BYTES
];
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. */
482 for (i
= 0; i
< REGISTER_BYTES
; i
++)
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]);
489 for (i
= 0; i
< NUM_REGS
; i
++)
490 supply_register (i
, ®s
[REGISTER_BYTE(i
)]);
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. */
497 remote_prepare_to_store ()
499 remote_fetch_registers (-1);
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. */
507 remote_store_registers (regno
)
516 /* Command describes registers byte by byte,
517 each byte encoded as two hex characters. */
520 for (i
= 0; i
< REGISTER_BYTES
; i
++)
522 *p
++ = tohex ((registers
[i
] >> 4) & 0xf);
523 *p
++ = tohex (registers
[i
] & 0xf);
531 /* Read a word from remote address ADDR and return it.
532 This goes through the data cache. */
535 remote_fetch_word (addr
)
540 extern CORE_ADDR text_start
, text_end
;
542 if (addr
>= text_start
&& addr
< text_end
)
545 xfer_core_file (addr
, &buffer
, sizeof (int));
549 return dcache_fetch (addr
);
552 /* Write a word WORD into remote address ADDR.
553 This goes through the data cache. */
556 remote_store_word (addr
, word
)
560 dcache_poke (addr
, word
);
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. */
571 remote_write_bytes (memaddr
, myaddr
, len
)
580 if (len
> PBUFSIZ
/ 2 - 20)
583 sprintf (buf
, "M%x,%x:", memaddr
, len
);
585 /* We send target system values byte by byte, in increasing byte addresses,
586 each byte encoded as two hex characters. */
588 p
= buf
+ strlen (buf
);
589 for (i
= 0; i
< len
; i
++)
591 *p
++ = tohex ((myaddr
[i
] >> 4) & 0xf);
592 *p
++ = tohex (myaddr
[i
] & 0xf);
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. */
606 remote_read_bytes (memaddr
, myaddr
, len
)
615 if (len
> PBUFSIZ
/ 2 - 1)
618 sprintf (buf
, "m%x,%x", memaddr
, len
);
621 /* Reply describes memory byte by byte,
622 each byte encoded as two hex characters. */
625 for (i
= 0; i
< len
; i
++)
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]);
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. */
640 remote_xfer_memory(memaddr
, myaddr
, len
, should_write
, target
)
645 struct target_ops
*target
; /* ignored */
651 if (len
> MAXBUFBYTES
)
652 xfersize
= MAXBUFBYTES
;
657 remote_write_bytes(memaddr
, myaddr
, xfersize
);
659 remote_read_bytes (memaddr
, myaddr
, xfersize
);
664 return origlen
; /* no error possible */
668 remote_files_info (ignore
)
669 struct target_ops
*ignore
;
671 printf ("Debugging a target over a serial line.\n");
676 A debug packet whose contents are <data>
677 is encapsulated for transmission in the form:
679 $ <data> # CSUM1 CSUM2
681 <data> must be ASCII alphanumeric and cannot include characters
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.
688 Receiver responds with:
690 + - if CSUM is correct and ready for next packet
691 - - if CSUM is incorrect
695 /* Read a single character from the remote end.
696 (If supported, we actually read many characters and buffer them up.) */
701 static int inbuf_index
, inbuf_count
;
702 #define INBUFSIZE PBUFSIZ
703 static char inbuf
[INBUFSIZE
];
705 if (inbuf_index
>= inbuf_count
)
707 /* Time to do another read... */
710 inbuf
[0] = 0; /* Just in case */
712 /* termio does the timeout for us. */
713 inbuf_count
= read (remote_desc
, inbuf
, INBUFSIZE
);
716 inbuf_count
= read (remote_desc
, inbuf
, INBUFSIZE
);
721 /* Just return the next character from the buffer. */
722 return inbuf
[inbuf_index
++] & 0x7f;
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. */
738 error ("Remote failure reply: %s", buf
);
741 /* Send a packet to the remote machine, with error checking.
742 The data of the packet is in BUF. */
749 unsigned char csum
= 0;
751 int cnt
= strlen (buf
);
755 /* Copy the packet into buffer BUF2, encapsulating it
756 and giving it a checksum. */
758 if (cnt
> sizeof(buf2
) - 5) /* Prosanity check */
764 for (i
= 0; i
< cnt
; i
++)
770 *p
++ = tohex ((csum
>> 4) & 0xf);
771 *p
++ = tohex (csum
& 0xf);
773 /* Send it over and over until we get a positive ack. */
779 printf ("Sending packet: %s...", buf2
); fflush(stdout
);
781 write (remote_desc
, buf2
, p
- buf2
);
783 /* read until either a timeout occurs (\0) or '+' is read */
790 printf ("%02X%c ", ch
&0xFF, ch
);
792 } while ((ch
!= '+') && (ch
!= '\0'));
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. */
806 unsigned char c1
, c2
;
808 #define MAX_RETRIES 10
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.
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. */
821 /* allow immediate quit while reading from device, it could be hung */
827 /* Force csum to be zero here because of possible error retry. */
830 while ((c
= readchar()) != '$');
838 if (bp
>= buf
+PBUFSIZ
-1)
841 printf_filtered ("Remote packet too long: %s\n", buf
);
849 c1
= fromhex (readchar ());
850 c2
= fromhex (readchar ());
851 if ((csum
& 0xff) == (c1
<< 4) + c2
)
853 printf_filtered ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
854 (c1
<< 4) + c2
, csum
& 0xff, buf
);
856 /* Try the whole thing again. */
858 if (++retries
< MAX_RETRIES
)
860 write (remote_desc
, "-", 1);
864 printf ("Ignoring packet error, continuing...\n");
873 write (remote_desc
, "+", 1);
876 fprintf (stderr
,"Packet received: %s\n", buf
);
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
889 /* The data cache records all the data read from the remote machine
890 since the last time it stopped.
892 Each cache block holds 16 bytes of data
893 starting at a multiple-of-16 address. */
895 #define DCACHE_SIZE 64 /* Number of cache blocks */
897 struct dcache_block
{
898 struct dcache_block
*next
, *last
;
899 unsigned int addr
; /* Address for which data is recorded. */
903 struct dcache_block dcache_free
, dcache_valid
;
905 /* Free all the data cache blocks, thus discarding all cached data. */
910 register struct dcache_block
*db
;
912 while ((db
= dcache_valid
.next
) != &dcache_valid
)
915 insque (db
, &dcache_free
);
920 * If addr is present in the dcache, return the address of the block
924 struct dcache_block
*
927 register struct dcache_block
*db
;
932 /* Search all cache blocks for one that is at this address. */
933 db
= dcache_valid
.next
;
934 while (db
!= &dcache_valid
)
936 if ((addr
& 0xfffffff0) == db
->addr
)
943 /* Return the int data at address ADDR in dcache block DC. */
946 dcache_value (db
, addr
)
947 struct dcache_block
*db
;
952 return (db
->data
[(addr
>>2)&3]);
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. */
959 struct dcache_block
*
962 register struct dcache_block
*db
;
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
;
969 insque (db
, &dcache_valid
);
973 /* Return the contents of the word at address ADDR in the remote machine,
974 using the data cache. */
980 register struct dcache_block
*db
;
982 db
= dcache_hit (addr
);
985 db
= dcache_alloc ();
986 remote_read_bytes (addr
& ~0xf, db
->data
, 16);
987 db
->addr
= addr
& ~0xf;
989 return (dcache_value (db
, addr
));
992 /* Write the word at ADDR both in the data cache and in the remote machine. */
994 dcache_poke (addr
, data
)
998 register struct dcache_block
*db
;
1000 /* First make sure the word is IN the cache. DB is its cache block. */
1001 db
= dcache_hit (addr
);
1004 db
= dcache_alloc ();
1005 remote_read_bytes (addr
& ~0xf, db
->data
, 16);
1006 db
->addr
= addr
& ~0xf;
1009 /* Modify the word in the cache. */
1010 db
->data
[(addr
>>2)&3] = data
;
1012 /* Send the changed word. */
1013 remote_write_bytes (addr
, &data
, 4);
1016 /* Initialize the data cache. */
1021 register struct dcache_block
*db
;
1023 db
= (struct dcache_block
*) xmalloc (sizeof (struct dcache_block
) *
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
);
1032 /* Define the target subroutine names */
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 */
1061 NULL
, /* to_lookup_symbol */
1062 NULL
, /* to_create_inferior */
1063 NULL
, /* to_mourn_inferior */
1064 process_stratum
, /* to_stratum */
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 */
1077 _initialize_remote ()
1079 add_target (&remote_ops
);
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
),
This page took 0.051557 seconds and 4 git commands to generate.