xref: /openbsd-src/gnu/usr.bin/binutils/gdb/remote-utils.c (revision a4afd6dad3fba28f80e70208181c06c482259988)
1 /* Generic support for remote debugging interfaces.
2 
3    Copyright 1993, 1994 Free Software Foundation, Inc.
4 
5 This file is part of GDB.
6 
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11 
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20 
21 /*  This file actually contains two distinct logical "packages".  They
22     are packaged together in this one file because they are typically
23     used together.
24 
25     The first package is an addition to the serial package.  The
26     addition provides reading and writing with debugging output and
27     timeouts based on user settable variables.  These routines are
28     intended to support serial port based remote backends.  These
29     functions are prefixed with sr_.
30 
31     The second package is a collection of more or less generic
32     functions for use by remote backends.  They support user settable
33     variables for debugging, retries, and the like.
34 
35    Todo:
36 
37    * a pass through mode a la kermit or telnet.
38    * autobaud.
39    * ask remote to change his baud rate.
40    */
41 
42 #include <ctype.h>
43 
44 #include "defs.h"
45 #include "gdb_string.h"
46 #include "gdbcmd.h"
47 #include "target.h"
48 #include "serial.h"
49 #include "gdbcore.h" /* for exec_bfd */
50 #include "inferior.h" /* for generic_mourn_inferior */
51 #include "remote-utils.h"
52 
53 struct _sr_settings sr_settings = {
54   4, /* timeout:
55 	remote-hms.c had 2
56 	remote-bug.c had "with a timeout of 2, we time out waiting for
57 	the prompt after an s-record dump."
58 
59 	remote.c had (2): This was 5 seconds, which is a long time to
60 	sit and wait. Unless this is going though some terminal server
61 	or multiplexer or other form of hairy serial connection, I
62 	would think 2 seconds would be plenty.
63 */
64 
65   10, /* retries */
66   NULL,	/* device */
67   NULL,	/* descriptor */
68 };
69 
70 struct gr_settings *gr_settings = NULL;
71 
72 static void usage PARAMS ((char *, char *));
73 static void sr_com PARAMS ((char *, int));
74 
75 static void
76 usage(proto, junk)
77      char *proto;
78      char *junk;
79 {
80   if (junk != NULL)
81     fprintf_unfiltered(gdb_stderr, "Unrecognized arguments: `%s'.\n", junk);
82 
83   error ("Usage: target %s [DEVICE [SPEED [DEBUG]]]\n\
84 where DEVICE is the name of a device or HOST:PORT", proto, proto);
85 
86   return;
87 }
88 
89 #define CHECKDONE(p, q) \
90 { \
91   if (q == p) \
92     { \
93       if (*p == '\0') \
94 	return; \
95       else \
96 	usage(proto, p); \
97     } \
98 }
99 
100 void
101 sr_scan_args(proto, args)
102      char *proto;
103      char *args;
104 {
105   int n;
106   char *p, *q;
107 
108   /* if no args, then nothing to do. */
109   if (args == NULL || *args == '\0')
110     return;
111 
112   /* scan off white space.  */
113   for (p = args; isspace(*p); ++p) ;;
114 
115   /* find end of device name.  */
116   for (q = p; *q != '\0' && !isspace(*q); ++q) ;;
117 
118   /* check for missing or empty device name.  */
119   CHECKDONE(p, q);
120   sr_set_device(savestring(p, q - p));
121 
122   /* look for baud rate.  */
123   n = strtol(q, &p, 10);
124 
125   /* check for missing or empty baud rate.  */
126   CHECKDONE(p, q);
127   baud_rate = n;
128 
129   /* look for debug value.  */
130   n = strtol(p, &q, 10);
131 
132   /* check for missing or empty debug value.  */
133   CHECKDONE(p, q);
134   sr_set_debug(n);
135 
136   /* scan off remaining white space.  */
137   for (p = q; isspace(*p); ++p) ;;
138 
139   /* if not end of string, then there's unrecognized junk. */
140   if (*p != '\0')
141     usage(proto, p);
142 
143   return;
144 }
145 
146 void
147 gr_generic_checkin()
148 {
149   sr_write_cr("");
150   gr_expect_prompt();
151 }
152 
153 void
154 gr_open(args, from_tty, gr)
155      char *args;
156      int from_tty;
157      struct gr_settings *gr;
158 {
159   target_preopen(from_tty);
160   sr_scan_args(gr->ops->to_shortname, args);
161   unpush_target(gr->ops);
162 
163   gr_settings = gr;
164 
165   gr_set_dcache(dcache_init(gr->readfunc, gr->writefunc));
166 
167   if (sr_get_desc() != NULL)
168     gr_close (0);
169 
170   /* If no args are specified, then we use the device specified by a
171      previous command or "set remotedevice".  But if there is no
172      device, better stop now, not dump core.  */
173 
174   if (sr_get_device () == NULL)
175     usage (gr->ops->to_shortname, NULL);
176 
177   sr_set_desc(SERIAL_OPEN (sr_get_device()));
178   if (!sr_get_desc())
179     perror_with_name((char *) sr_get_device());
180 
181   if (baud_rate != -1)
182     {
183       if (SERIAL_SETBAUDRATE(sr_get_desc(), baud_rate) != 0)
184 	{
185 	  SERIAL_CLOSE(sr_get_desc());
186 	  perror_with_name(sr_get_device());
187 	}
188     }
189 
190   SERIAL_RAW (sr_get_desc());
191 
192   /* If there is something sitting in the buffer we might take it as a
193      response to a command, which would be bad.  */
194   SERIAL_FLUSH_INPUT (sr_get_desc ());
195 
196   /* default retries */
197   if (sr_get_retries() == 0)
198     sr_set_retries(1);
199 
200   /* default clear breakpoint function */
201   if (gr_settings->clear_all_breakpoints == NULL)
202     gr_settings->clear_all_breakpoints = remove_breakpoints;
203 
204   if (from_tty)
205     {
206       printf_filtered ("Remote debugging using `%s'", sr_get_device ());
207       if (baud_rate != -1)
208 	printf_filtered (" at baud rate of %d",
209 			 baud_rate);
210       printf_filtered ("\n");
211     }
212 
213   push_target(gr->ops);
214   gr_checkin();
215   gr_clear_all_breakpoints ();
216   return;
217 }
218 
219 /* Read a character from the remote system masking it down to 7 bits
220    and doing all the fancy timeout stuff.  */
221 
222 int
223 sr_readchar ()
224 {
225   int buf;
226 
227   buf = SERIAL_READCHAR (sr_get_desc(), sr_get_timeout());
228 
229   if (buf == SERIAL_TIMEOUT)
230     error ("Timeout reading from remote system.");
231 
232   if (sr_get_debug() > 0)
233     printf_unfiltered ("%c", buf);
234 
235   return buf & 0x7f;
236 }
237 
238 int
239 sr_pollchar()
240 {
241   int buf;
242 
243   buf = SERIAL_READCHAR (sr_get_desc(), 0);
244   if (buf == SERIAL_TIMEOUT)
245     buf = 0;
246   if (sr_get_debug() > 0)
247     if (buf)
248       printf_unfiltered ("%c", buf);
249     else
250       printf_unfiltered ("<empty character poll>");
251 
252   return buf & 0x7f;
253 }
254 
255 /* Keep discarding input from the remote system, until STRING is found.
256    Let the user break out immediately.  */
257 void
258 sr_expect (string)
259      char *string;
260 {
261   char *p = string;
262 
263   immediate_quit = 1;
264   while (1)
265     {
266       if (sr_readchar () == *p)
267 	{
268 	  p++;
269 	  if (*p == '\0')
270 	    {
271 	      immediate_quit = 0;
272 	      return;
273 	    }
274 	}
275       else
276 	p = string;
277     }
278 }
279 
280 void
281 sr_write (a, l)
282      char *a;
283      int l;
284 {
285   int i;
286 
287   if (SERIAL_WRITE (sr_get_desc(), a, l) != 0)
288     perror_with_name ("sr_write: Error writing to remote");
289 
290   if (sr_get_debug() > 0)
291     for (i = 0; i < l; i++)
292       printf_unfiltered ("%c", a[i]);
293 
294   return;
295 }
296 
297 void
298 sr_write_cr (s)
299      char *s;
300 {
301   sr_write (s, strlen (s));
302   sr_write ("\r", 1);
303   return;
304 }
305 
306 int
307 sr_timed_read (buf, n)
308      char *buf;
309      int n;
310 {
311   int i;
312   char c;
313 
314   i = 0;
315   while (i < n)
316     {
317       c = sr_readchar ();
318 
319       if (c == 0)
320 	return i;
321       buf[i] = c;
322       i++;
323 
324     }
325   return i;
326 }
327 
328 /* Get a hex digit from the remote system & return its value. If
329    ignore_space is nonzero, ignore spaces (not newline, tab, etc).  */
330 
331 int
332 sr_get_hex_digit (ignore_space)
333      int ignore_space;
334 {
335   int ch;
336 
337   while (1)
338     {
339       ch = sr_readchar ();
340       if (ch >= '0' && ch <= '9')
341 	return ch - '0';
342       else if (ch >= 'A' && ch <= 'F')
343 	return ch - 'A' + 10;
344       else if (ch >= 'a' && ch <= 'f')
345 	return ch - 'a' + 10;
346       else if (ch != ' ' || !ignore_space)
347 	{
348 	  gr_expect_prompt ();
349 	  error ("Invalid hex digit from remote system.");
350 	}
351     }
352 }
353 
354 /* Get a byte from the remote and put it in *BYT.  Accept any number
355    leading spaces.  */
356 void
357 sr_get_hex_byte (byt)
358      char *byt;
359 {
360   int val;
361 
362   val = sr_get_hex_digit (1) << 4;
363   val |= sr_get_hex_digit (0);
364   *byt = val;
365 }
366 
367 /* Read a 32-bit hex word from the remote, preceded by a space  */
368 long
369 sr_get_hex_word ()
370 {
371   long val;
372   int j;
373 
374   val = 0;
375   for (j = 0; j < 8; j++)
376     val = (val << 4) + sr_get_hex_digit (j == 0);
377   return val;
378 }
379 
380 /* Put a command string, in args, out to the remote.  The remote is assumed to
381    be in raw mode, all writing/reading done through desc.
382    Ouput from the remote is placed on the users terminal until the
383    prompt from the remote is seen.
384    FIXME: Can't handle commands that take input.  */
385 
386 static void
387 sr_com (args, fromtty)
388      char *args;
389      int fromtty;
390 {
391   sr_check_open ();
392 
393   if (!args)
394     return;
395 
396   /* Clear all input so only command relative output is displayed */
397 
398   sr_write_cr (args);
399   sr_write ("\030", 1);
400   registers_changed ();
401   gr_expect_prompt ();
402 }
403 
404 void
405 gr_close(quitting)
406      int quitting;
407 {
408   gr_clear_all_breakpoints();
409 
410   if (sr_is_open())
411     {
412       SERIAL_CLOSE (sr_get_desc());
413       sr_set_desc(NULL);
414     }
415 
416   return;
417 }
418 
419 /* gr_detach()
420    takes a program previously attached to and detaches it.
421    We better not have left any breakpoints
422    in the program or it'll die when it hits one.
423    Close the open connection to the remote debugger.
424    Use this when you want to detach and do something else
425    with your gdb.  */
426 
427 void
428 gr_detach(args, from_tty)
429      char *args;
430      int from_tty;
431 {
432   if (args)
433     error ("Argument given to \"detach\" when remotely debugging.");
434 
435   if (sr_is_open())
436     gr_clear_all_breakpoints ();
437 
438   pop_target ();
439   if (from_tty)
440     puts_filtered ("Ending remote debugging.\n");
441 
442   return;
443 }
444 
445 void
446 gr_files_info (ops)
447      struct target_ops *ops;
448 {
449 #ifdef __GO32__
450   printf_filtered ("\tAttached to DOS asynctsr\n");
451 #else
452   printf_filtered ("\tAttached to %s", sr_get_device());
453   if (baud_rate != -1)
454     printf_filtered ("at %d baud", baud_rate);
455   printf_filtered ("\n");
456 #endif
457 
458   if (exec_bfd)
459     {
460       printf_filtered ("\tand running program %s\n",
461 		       bfd_get_filename (exec_bfd));
462     }
463   printf_filtered ("\tusing the %s protocol.\n", ops->to_shortname);
464 }
465 
466 void
467 gr_mourn ()
468 {
469   gr_clear_all_breakpoints ();
470   unpush_target (gr_get_ops());
471   generic_mourn_inferior ();
472 }
473 
474 void
475 gr_kill ()
476 {
477   return;
478 }
479 
480 /* This is called not only when we first attach, but also when the
481    user types "run" after having attached.  */
482 void
483 gr_create_inferior (execfile, args, env)
484      char *execfile;
485      char *args;
486      char **env;
487 {
488   int entry_pt;
489 
490   if (args && *args)
491     error ("Can't pass arguments to remote process.");
492 
493   if (execfile == 0 || exec_bfd == 0)
494     error ("No exec file specified");
495 
496   entry_pt = (int) bfd_get_start_address (exec_bfd);
497   sr_check_open ();
498 
499   gr_kill ();
500   gr_clear_all_breakpoints ();
501 
502   init_wait_for_inferior ();
503   gr_checkin();
504 
505   insert_breakpoints ();	/* Needed to get correct instruction in cache */
506   proceed (entry_pt, -1, 0);
507 }
508 
509 /* Given a null terminated list of strings LIST, read the input until we find one of
510    them.  Return the index of the string found or -1 on error.  '?' means match
511    any single character. Note that with the algorithm we use, the initial
512    character of the string cannot recur in the string, or we will not find some
513    cases of the string in the input.  If PASSTHROUGH is non-zero, then
514    pass non-matching data on.  */
515 
516 int
517 gr_multi_scan (list, passthrough)
518      char *list[];
519      int passthrough;
520 {
521   char *swallowed = NULL; /* holding area */
522   char *swallowed_p = swallowed; /* Current position in swallowed.  */
523   int ch;
524   int ch_handled;
525   int i;
526   int string_count;
527   int max_length;
528   char **plist;
529 
530   /* Look through the strings.  Count them.  Find the largest one so we can
531      allocate a holding area.  */
532 
533   for (max_length = string_count = i = 0;
534        list[i] != NULL;
535        ++i, ++string_count)
536     {
537       int length = strlen(list[i]);
538 
539       if (length > max_length)
540 	max_length = length;
541     }
542 
543   /* if we have no strings, then something is wrong. */
544   if (string_count == 0)
545     return(-1);
546 
547   /* otherwise, we will need a holding area big enough to hold almost two
548      copies of our largest string.  */
549   swallowed_p = swallowed = alloca(max_length << 1);
550 
551   /* and a list of pointers to current scan points. */
552   plist = (char **) alloca (string_count * sizeof(*plist));
553 
554   /* and initialize */
555   for (i = 0; i < string_count; ++i)
556     plist[i] = list[i];
557 
558   for (ch = sr_readchar(); /* loop forever */ ; ch = sr_readchar())
559     {
560       QUIT; /* Let user quit and leave process running */
561       ch_handled = 0;
562 
563       for (i = 0; i < string_count; ++i)
564 	{
565 	  if (ch == *plist[i] || *plist[i] == '?')
566 	    {
567 	      ++plist[i];
568 	      if (*plist[i] == '\0')
569 		return(i);
570 
571 	      if (!ch_handled)
572 		*swallowed_p++ = ch;
573 
574 	      ch_handled = 1;
575 	    }
576 	  else
577 	    plist[i] = list[i];
578 	}
579 
580       if (!ch_handled)
581 	{
582 	  char *p;
583 
584 	  /* Print out any characters which have been swallowed.  */
585 	  if (passthrough)
586 	    {
587 	      for (p = swallowed; p < swallowed_p; ++p)
588 		fputc_unfiltered (*p, gdb_stdout);
589 
590 	      fputc_unfiltered (ch, gdb_stdout);
591 	    }
592 
593 	  swallowed_p = swallowed;
594 	}
595     }
596 #if 0
597   /* Never reached.  */
598   return(-1);
599 #endif
600 }
601 
602 /* Get ready to modify the registers array.  On machines which store
603    individual registers, this doesn't need to do anything.  On machines
604    which store all the registers in one fell swoop, this makes sure
605    that registers contains all the registers from the program being
606    debugged.  */
607 
608 void
609 gr_prepare_to_store ()
610 {
611   /* Do nothing, since we assume we can store individual regs */
612 }
613 
614 /* Read a word from remote address ADDR and return it.
615  * This goes through the data cache.
616  */
617 int
618 gr_fetch_word (addr)
619      CORE_ADDR addr;
620 {
621   return dcache_fetch (gr_get_dcache(), addr);
622 }
623 
624 /* Write a word WORD into remote address ADDR.
625    This goes through the data cache.  */
626 
627 void
628 gr_store_word (addr, word)
629      CORE_ADDR addr;
630      int word;
631 {
632   dcache_poke (gr_get_dcache(), addr, word);
633 }
634 
635 void
636 _initialize_sr_support ()
637 {
638 /* FIXME-now: if target is open... */
639   add_show_from_set (add_set_cmd ("remotedevice", no_class,
640 				  var_filename, (char *)&sr_settings.device,
641 				  "Set device for remote serial I/O.\n\
642 This device is used as the serial port when debugging using remote\n\
643 targets.", &setlist),
644 		     &showlist);
645 
646   add_com ("remote <command>", class_obscure, sr_com,
647 	   "Send a command to the remote monitor.");
648 
649 }
650