1 /* Memory-access and commands for inferior process, for GDB.
2 Copyright (C) 1988-1991 Free Software Foundation, Inc.
4 This file is part of GDB.
6 GDB 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 1, or (at your option)
11 GDB 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 GDB; see the file COPYING. If not, write to
18 the Free Software Foundation, 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"
81 #include <sys/types.h>
86 extern int memory_insert_breakpoint ();
87 extern int memory_remove_breakpoint ();
88 extern void add_syms_addr_command ();
89 extern struct value
*call_function_by_hand();
90 extern void start_remote ();
92 extern struct target_ops remote_ops
; /* Forward decl */
95 static int timeout
= 5;
101 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
102 remote_open knows that we don't have a file open when the program
104 int remote_desc
= -1;
108 /* Maximum number of bytes to read/write at once. The value here
109 is chosen to fill up a packet (the headers account for the 32). */
110 #define MAXBUFBYTES ((PBUFSIZ-32)/2)
112 static void remote_send ();
113 static void putpkt ();
114 static void getpkt ();
116 static void dcache_flush ();
120 /* Called when SIGALRM signal sent due to alarm() timeout. */
126 printf ("remote_timer called\n");
132 /* Initialize remote connection */
139 /* Clean up connection to a remote debugger. */
142 remote_close (quitting
)
145 if (remote_desc
>= 0)
150 /* Open a connection to a remote debugger.
151 NAME is the filename used for communication. */
154 remote_open (name
, from_tty
)
162 "To open a remote debug connection, you need to specify what serial\n\
163 device is attached to the remote system (e.g. /dev/ttya).");
165 target_preopen (from_tty
);
173 remote_desc
= open (name
, O_RDWR
);
175 perror_with_name (name
);
177 ioctl (remote_desc
, TIOCGETP
, &sg
);
179 sg
.c_cc
[VMIN
] = 0; /* read with timeout. */
180 sg
.c_cc
[VTIME
] = timeout
* 10;
181 sg
.c_lflag
&= ~(ICANON
| ECHO
);
185 ioctl (remote_desc
, TIOCSETP
, &sg
);
188 printf ("Remote debugging using %s\n", name
);
189 push_target (&remote_ops
); /* Switch to using remote target now */
190 start_remote (); /* Initialize gdb process mechanisms */
193 #ifndef NO_SIGINTERRUPT
194 /* Cause SIGALRM's to make reads fail. */
195 if (siginterrupt (SIGALRM
, 1) != 0)
196 perror ("remote_open: error in siginterrupt");
199 /* Set up read timeout timer. */
200 if ((void (*)) signal (SIGALRM
, remote_timer
) == (void (*)) -1)
201 perror ("remote_open: error in signal");
204 putpkt ("?"); /* initiate a query from remote machine */
208 takes a program previously attached to and detaches it.
209 We better not have left any breakpoints
210 in the program or it'll die when it hits one.
211 Close the open connection to the remote debugger.
212 Use this when you want to detach and do something else
216 remote_detach (args
, from_tty
)
221 error ("Argument given to \"detach\" when remotely debugging.");
225 printf ("Ending remote debugging.\n");
228 /* Convert hex digit A to a number. */
234 if (a
>= '0' && a
<= '9')
236 else if (a
>= 'a' && a
<= 'f')
239 error ("Reply contains invalid hex digit");
243 /* Convert number NIB to a hex digit. */
255 /* Tell the remote machine to resume. */
258 remote_resume (step
, siggnal
)
264 error ("Can't send signals to a remote system.");
270 strcpy (buf
, step
? "s": "c");
275 /* Wait until the remote machine stops, then return,
276 storing status in STATUS just as `wait' would. */
282 unsigned char buf
[PBUFSIZ
];
284 WSETEXIT ((*status
), 0);
287 error ("Remote failure reply: %s", buf
);
289 error ("Invalid remote reply: %s", buf
);
290 WSETSTOP ((*status
), (((fromhex (buf
[1])) << 4) + (fromhex (buf
[2]))));
293 /* Read the remote registers into the block REGS. */
296 remote_fetch_registers (regno
)
302 char regs
[REGISTER_BYTES
];
307 /* Reply describes registers byte by byte, each byte encoded as two
308 hex characters. Suck them all up, then supply them to the
309 register cacheing/storage mechanism. */
312 for (i
= 0; i
< REGISTER_BYTES
; i
++)
314 if (p
[0] == 0 || p
[1] == 0)
315 error ("Remote reply is too short: %s", buf
);
316 regs
[i
] = fromhex (p
[0]) * 16 + fromhex (p
[1]);
319 for (i
= 0; i
< NUM_REGS
; i
++)
320 supply_register (i
, ®s
[REGISTER_BYTE(i
)]);
324 /* Prepare to store registers. Since we send them all, we have to
325 read out the ones we don't want to change first. */
328 remote_prepare_to_store ()
330 remote_fetch_registers (-1);
333 /* Store the remote registers from the contents of the block REGISTERS.
334 FIXME, eventually just store one register if that's all that is needed. */
337 remote_store_registers (regno
)
346 /* Command describes registers byte by byte,
347 each byte encoded as two hex characters. */
350 for (i
= 0; i
< REGISTER_BYTES
; i
++)
352 *p
++ = tohex ((registers
[i
] >> 4) & 0xf);
353 *p
++ = tohex (registers
[i
] & 0xf);
362 /* Read a word from remote address ADDR and return it.
363 This goes through the data cache. */
366 remote_fetch_word (addr
)
371 extern CORE_ADDR text_start
, text_end
;
373 if (addr
>= text_start
&& addr
< text_end
)
376 xfer_core_file (addr
, &buffer
, sizeof (int));
380 return dcache_fetch (addr
);
383 /* Write a word WORD into remote address ADDR.
384 This goes through the data cache. */
387 remote_store_word (addr
, word
)
391 dcache_poke (addr
, word
);
395 /* Write memory data directly to the remote machine.
396 This does not inform the data cache; the data cache uses this.
397 MEMADDR is the address in the remote memory space.
398 MYADDR is the address of the buffer in our space.
399 LEN is the number of bytes. */
402 remote_write_bytes (memaddr
, myaddr
, len
)
411 if (len
> PBUFSIZ
/ 2 - 20)
414 sprintf (buf
, "M%x,%x:", memaddr
, len
);
416 /* Command describes registers byte by byte,
417 each byte encoded as two hex characters. */
419 p
= buf
+ strlen (buf
);
420 for (i
= 0; i
< len
; i
++)
422 *p
++ = tohex ((myaddr
[i
] >> 4) & 0xf);
423 *p
++ = tohex (myaddr
[i
] & 0xf);
430 /* Read memory data directly from the remote machine.
431 This does not use the data cache; the data cache uses this.
432 MEMADDR is the address in the remote memory space.
433 MYADDR is the address of the buffer in our space.
434 LEN is the number of bytes. */
437 remote_read_bytes (memaddr
, myaddr
, len
)
446 if (len
> PBUFSIZ
/ 2 - 1)
449 sprintf (buf
, "m%x,%x", memaddr
, len
);
452 /* Reply describes registers byte by byte,
453 each byte encoded as two hex characters. */
456 for (i
= 0; i
< len
; i
++)
458 if (p
[0] == 0 || p
[1] == 0)
459 error ("Remote reply is too short: %s", buf
);
460 myaddr
[i
] = fromhex (p
[0]) * 16 + fromhex (p
[1]);
465 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
466 to or from debugger address MYADDR. Write to inferior if WRITE is
467 nonzero. Returns length of data written or read; 0 for error. */
470 remote_xfer_inferior_memory(memaddr
, myaddr
, len
, write
)
480 if (len
> MAXBUFBYTES
)
481 xfersize
= MAXBUFBYTES
;
486 remote_write_bytes(memaddr
, myaddr
, xfersize
);
488 remote_read_bytes (memaddr
, myaddr
, xfersize
);
493 return origlen
; /* no error possible */
499 printf ("remote files info missing here. FIXME.\n");
504 A debug packet whose contents are <data>
505 is encapsulated for transmission in the form:
507 $ <data> # CSUM1 CSUM2
509 <data> must be ASCII alphanumeric and cannot include characters
512 CSUM1 and CSUM2 are ascii hex representation of an 8-bit
513 checksum of <data>, the most significant nibble is sent first.
514 the hex digits 0-9,a-f are used.
516 Receiver responds with:
518 + - if CSUM is correct and ready for next packet
519 - - if CSUM is incorrect
530 /* termio does the timeout for us. */
531 read (remote_desc
, &buf
, 1);
534 read (remote_desc
, &buf
, 1);
541 /* Send the command in BUF to the remote machine,
542 and read the reply into BUF.
543 Report an error if we get an error reply. */
554 error ("Remote failure reply: %s", buf
);
557 /* Send a packet to the remote machine, with error checking.
558 The data of the packet is in BUF. */
565 unsigned char csum
= 0;
567 int cnt
= strlen (buf
);
571 /* Copy the packet into buffer BUF2, encapsulating it
572 and giving it a checksum. */
577 for (i
= 0; i
< cnt
; i
++)
583 *p
++ = tohex ((csum
>> 4) & 0xf);
584 *p
++ = tohex (csum
& 0xf);
586 /* Send it over and over until we get a positive ack. */
592 printf ("Sending packet: %s (%s)\n", buf2
, buf
);
594 write (remote_desc
, buf2
, p
- buf2
);
596 /* read until either a timeout occurs (\0) or '+' is read */
599 } while ((ch
!= '+') && (ch
!= '\0'));
603 /* Read a packet from the remote machine, with error checking,
604 and store it in BUF. */
613 unsigned char c1
, c2
;
615 /* allow immediate quit while reading from device, it could be hung */
620 /* Force csum to be zero here because of possible error retry. */
623 while ((c
= readchar()) != '$');
636 c1
= fromhex (readchar ());
637 c2
= fromhex (readchar ());
638 if ((csum
& 0xff) == (c1
<< 4) + c2
)
640 printf ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
641 (c1
<< 4) + c2
, csum
& 0xff, buf
);
642 write (remote_desc
, "-", 1);
647 write (remote_desc
, "+", 1);
650 fprintf (stderr
,"Packet received :%s\n", buf
);
653 /* The data cache leads to incorrect results because it doesn't know about
654 volatile variables, thus making it impossible to debug functions which
655 use hardware registers. Therefore it is #if 0'd out. Effect on
656 performance is some, for backtraces of functions with a few
657 arguments each. For functions with many arguments, the stack
658 frames don't fit in the cache blocks, which makes the cache less
659 helpful. Disabling the cache is a big performance win for fetching
660 large structures, because the cache code fetched data in 16-byte
663 /* The data cache records all the data read from the remote machine
664 since the last time it stopped.
666 Each cache block holds 16 bytes of data
667 starting at a multiple-of-16 address. */
669 #define DCACHE_SIZE 64 /* Number of cache blocks */
671 struct dcache_block
{
672 struct dcache_block
*next
, *last
;
673 unsigned int addr
; /* Address for which data is recorded. */
677 struct dcache_block dcache_free
, dcache_valid
;
679 /* Free all the data cache blocks, thus discarding all cached data. */
684 register struct dcache_block
*db
;
686 while ((db
= dcache_valid
.next
) != &dcache_valid
)
689 insque (db
, &dcache_free
);
694 * If addr is present in the dcache, return the address of the block
698 struct dcache_block
*
701 register struct dcache_block
*db
;
706 /* Search all cache blocks for one that is at this address. */
707 db
= dcache_valid
.next
;
708 while (db
!= &dcache_valid
)
710 if ((addr
& 0xfffffff0) == db
->addr
)
717 /* Return the int data at address ADDR in dcache block DC. */
720 dcache_value (db
, addr
)
721 struct dcache_block
*db
;
726 return (db
->data
[(addr
>>2)&3]);
729 /* Get a free cache block, put it on the valid list,
730 and return its address. The caller should store into the block
731 the address and data that it describes. */
733 struct dcache_block
*
736 register struct dcache_block
*db
;
738 if ((db
= dcache_free
.next
) == &dcache_free
)
739 /* If we can't get one from the free list, take last valid */
740 db
= dcache_valid
.last
;
743 insque (db
, &dcache_valid
);
747 /* Return the contents of the word at address ADDR in the remote machine,
748 using the data cache. */
754 register struct dcache_block
*db
;
756 db
= dcache_hit (addr
);
759 db
= dcache_alloc ();
760 remote_read_bytes (addr
& ~0xf, db
->data
, 16);
761 db
->addr
= addr
& ~0xf;
763 return (dcache_value (db
, addr
));
766 /* Write the word at ADDR both in the data cache and in the remote machine. */
768 dcache_poke (addr
, data
)
772 register struct dcache_block
*db
;
774 /* First make sure the word is IN the cache. DB is its cache block. */
775 db
= dcache_hit (addr
);
778 db
= dcache_alloc ();
779 remote_read_bytes (addr
& ~0xf, db
->data
, 16);
780 db
->addr
= addr
& ~0xf;
783 /* Modify the word in the cache. */
784 db
->data
[(addr
>>2)&3] = data
;
786 /* Send the changed word. */
787 remote_write_bytes (addr
, &data
, 4);
790 /* Initialize the data cache. */
795 register struct dcache_block
*db
;
797 db
= (struct dcache_block
*) xmalloc (sizeof (struct dcache_block
) *
799 dcache_free
.next
= dcache_free
.last
= &dcache_free
;
800 dcache_valid
.next
= dcache_valid
.last
= &dcache_valid
;
801 for (i
=0;i
<DCACHE_SIZE
;i
++,db
++)
802 insque (db
, &dcache_free
);
806 /* Define the target subroutine names */
808 struct target_ops remote_ops
= {
809 "remote", "Remote serial target in gdb-specific protocol",
810 "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
811 Specify the serial device it is connected to (e.g. /dev/ttya).",
812 remote_open
, remote_close
,
813 0, remote_detach
, remote_resume
, remote_wait
, /* attach */
814 remote_fetch_registers
, remote_store_registers
,
815 remote_prepare_to_store
, 0, 0, /* conv_from, conv_to */
816 remote_xfer_inferior_memory
, remote_files_info
,
817 0, 0, /* insert_breakpoint, remove_breakpoint, */
818 0, 0, 0, 0, 0, /* Terminal crud */
820 0, add_syms_addr_command
, /* load */
821 call_function_by_hand
,
822 0, /* lookup_symbol */
823 0, 0, /* create_inferior FIXME, mourn_inferior FIXME */
824 process_stratum
, 0, /* next */
825 1, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */
826 OPS_MAGIC
, /* Always the last thing */
830 _initialize_remote ()
832 add_target (&remote_ops
);