]> Git Repo - binutils.git/blob - gdb/remote-eb.c
* frame.h, blockframe.c, stack.c, a29k-tdep.c,
[binutils.git] / gdb / remote-eb.c
1 /* Remote debugging interface for AMD 29000 EBMON on IBM PC, for GDB.
2    Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
3    Contributed by Cygnus Support.  Written by Jim Kingdon for Cygnus.
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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 /* This is like remote.c but is for an esoteric situation--
22    having a a29k board in a PC hooked up to a unix machine with
23    a serial line, and running ctty com1 on the PC, through which
24    the unix machine can run ebmon.  Not to mention that the PC
25    has PC/NFS, so it can access the same executables that gdb can,
26    over the net in real time.  */
27
28 #define  TM_FILE_OVERRIDE
29 #include "defs.h"
30 #include <string.h>
31 #include "a29k/tm-a29k.h"
32
33 #include "inferior.h"
34 #include "bfd.h"
35 #include "symfile.h"
36 #include "wait.h"
37 #include "value.h"
38 #include <ctype.h>
39 #include <fcntl.h>
40 #include <signal.h>
41 #include <errno.h>
42 #include "terminal.h"
43 #include "target.h"
44 #include "gdbcore.h"
45
46 extern struct target_ops eb_ops;                /* Forward declaration */
47
48 static void eb_close();
49
50 #define LOG_FILE "eb.log"
51 #if defined (LOG_FILE)
52 FILE *log_file;
53 #endif
54
55 static int timeout = 24;
56
57 /* Descriptor for I/O to remote machine.  Initialize it to -1 so that
58    eb_open knows that we don't have a file open when the program
59    starts.  */
60 int eb_desc = -1;
61
62 /* stream which is fdopen'd from eb_desc.  Only valid when
63    eb_desc != -1.  */
64 FILE *eb_stream;
65
66 /* Read a character from the remote system, doing all the fancy
67    timeout stuff.  */
68 static int
69 readchar ()
70 {
71   char buf;
72
73   buf = '\0';
74 #ifdef HAVE_TERMIO
75   /* termio does the timeout for us.  */
76   read (eb_desc, &buf, 1);
77 #else
78   alarm (timeout);
79   if (read (eb_desc, &buf, 1) < 0)
80     {
81       if (errno == EINTR)
82         error ("Timeout reading from remote system.");
83       else
84         perror_with_name ("remote");
85     }
86   alarm (0);
87 #endif
88
89   if (buf == '\0')
90     error ("Timeout reading from remote system.");
91 #if defined (LOG_FILE)
92   putc (buf & 0x7f, log_file);
93 #endif
94   return buf & 0x7f;
95 }
96
97 /* Keep discarding input from the remote system, until STRING is found. 
98    Let the user break out immediately.  */
99 static void
100 expect (string)
101      char *string;
102 {
103   char *p = string;
104
105   immediate_quit = 1;
106   while (1)
107     {
108       if (readchar() == *p)
109         {
110           p++;
111           if (*p == '\0')
112             {
113               immediate_quit = 0;
114               return;
115             }
116         }
117       else
118         p = string;
119     }
120 }
121
122 /* Keep discarding input until we see the ebmon prompt.
123
124    The convention for dealing with the prompt is that you
125    o give your command
126    o *then* wait for the prompt.
127
128    Thus the last thing that a procedure does with the serial line
129    will be an expect_prompt().  Exception:  eb_resume does not
130    wait for the prompt, because the terminal is being handed over
131    to the inferior.  However, the next thing which happens after that
132    is a eb_wait which does wait for the prompt.
133    Note that this includes abnormal exit, e.g. error().  This is
134    necessary to prevent getting into states from which we can't
135    recover.  */
136 static void
137 expect_prompt ()
138 {
139 #if defined (LOG_FILE)
140   /* This is a convenient place to do this.  The idea is to do it often
141      enough that we never lose much data if we terminate abnormally.  */
142   fflush (log_file);
143 #endif
144   expect ("\n# ");
145 }
146
147 /* Get a hex digit from the remote system & return its value.
148    If ignore_space is nonzero, ignore spaces (not newline, tab, etc).  */
149 static int
150 get_hex_digit (ignore_space)
151      int ignore_space;
152 {
153   int ch;
154   while (1)
155     {
156       ch = readchar ();
157       if (ch >= '0' && ch <= '9')
158         return ch - '0';
159       else if (ch >= 'A' && ch <= 'F')
160         return ch - 'A' + 10;
161       else if (ch >= 'a' && ch <= 'f')
162         return ch - 'a' + 10;
163       else if (ch == ' ' && ignore_space)
164         ;
165       else
166         {
167           expect_prompt ();
168           error ("Invalid hex digit from remote system.");
169         }
170     }
171 }
172
173 /* Get a byte from eb_desc and put it in *BYT.  Accept any number
174    leading spaces.  */
175 static void
176 get_hex_byte (byt)
177      char *byt;
178 {
179   int val;
180
181   val = get_hex_digit (1) << 4;
182   val |= get_hex_digit (0);
183   *byt = val;
184 }
185
186 /* Get N 32-bit words from remote, each preceded by a space,
187    and put them in registers starting at REGNO.  */
188 static void
189 get_hex_regs (n, regno)
190      int n;
191      int regno;
192 {
193   long val;
194   int i;
195
196   for (i = 0; i < n; i++)
197     {
198       int j;
199       
200       val = 0;
201       for (j = 0; j < 8; j++)
202         val = (val << 4) + get_hex_digit (j == 0);
203       supply_register (regno++, (char *) &val);
204     }
205 }
206
207 /* Called when SIGALRM signal sent due to alarm() timeout.  */
208 #ifndef HAVE_TERMIO
209
210 #ifndef __STDC__
211 #define volatile /**/
212 #endif
213 volatile int n_alarms;
214
215 void
216 eb_timer ()
217 {
218 #if 0
219   if (kiodebug)
220     printf ("eb_timer called\n");
221 #endif
222   n_alarms++;
223 }
224 #endif
225
226 /* malloc'd name of the program on the remote system.  */
227 static char *prog_name = NULL;
228
229 /* Nonzero if we have loaded the file ("yc") and not yet issued a "gi"
230    command.  "gi" is supposed to happen exactly once for each "yc".  */
231 static int need_gi = 0;
232
233 /* Number of SIGTRAPs we need to simulate.  That is, the next
234    NEED_ARTIFICIAL_TRAP calls to eb_wait should just return
235    SIGTRAP without actually waiting for anything.  */
236
237 static int need_artificial_trap = 0;
238
239 /* This is called not only when we first attach, but also when the
240    user types "run" after having attached.  */
241 static void
242 eb_create_inferior (execfile, args, env)
243      char *execfile;
244      char *args;
245      char **env;
246 {
247   int entry_pt;
248
249   if (args && *args)
250     error ("Can't pass arguments to remote EBMON process");
251
252   if (execfile == 0 || exec_bfd == 0)
253     error ("No exec file specified");
254
255   entry_pt = (int) bfd_get_start_address (exec_bfd);
256
257 #ifdef CREATE_INFERIOR_HOOK
258   CREATE_INFERIOR_HOOK (0);             /* No process-ID */
259 #endif  
260
261   {
262     /* OK, now read in the file.  Y=read, C=COFF, D=no symbols
263        0=start address, %s=filename.  */
264
265     fprintf (eb_stream, "YC D,0:%s", prog_name);
266
267     if (args != NULL)
268         fprintf(eb_stream, " %s", args);
269
270     fprintf (eb_stream, "\n");
271     fflush (eb_stream);
272
273     expect_prompt ();
274
275     need_gi = 1;
276   }
277
278 /* The "process" (board) is already stopped awaiting our commands, and
279    the program is already downloaded.  We just set its PC and go.  */
280
281   clear_proceed_status ();
282
283   /* Tell wait_for_inferior that we've started a new process.  */
284   init_wait_for_inferior ();
285
286   /* Set up the "saved terminal modes" of the inferior
287      based on what modes we are starting it with.  */
288   target_terminal_init ();
289
290   /* Install inferior's terminal modes.  */
291   target_terminal_inferior ();
292
293   /* insert_step_breakpoint ();  FIXME, do we need this?  */
294   proceed ((CORE_ADDR)entry_pt, -1, 0);         /* Let 'er rip... */
295 }
296
297 /* Translate baud rates from integers to damn B_codes.  Unix should
298    have outgrown this crap years ago, but even POSIX wouldn't buck it.  */
299
300 #ifndef B19200
301 #define B19200 EXTA
302 #endif
303 #ifndef B38400
304 #define B38400 EXTB
305 #endif
306
307 struct {int rate, damn_b;} baudtab[] = {
308         {0, B0},
309         {50, B50},
310         {75, B75},
311         {110, B110},
312         {134, B134},
313         {150, B150},
314         {200, B200},
315         {300, B300},
316         {600, B600},
317         {1200, B1200},
318         {1800, B1800},
319         {2400, B2400},
320         {4800, B4800},
321         {9600, B9600},
322         {19200, B19200},
323         {38400, B38400},
324         {-1, -1},
325 };
326
327 int damn_b (rate)
328      int rate;
329 {
330   int i;
331
332   for (i = 0; baudtab[i].rate != -1; i++)
333     if (rate == baudtab[i].rate) return baudtab[i].damn_b;
334   return B38400;        /* Random */
335 }
336
337
338 /* Open a connection to a remote debugger.
339    NAME is the filename used for communication, then a space,
340    then the name of the program as we should name it to EBMON.  */
341
342 static int baudrate = 9600;
343 static char *dev_name;
344 void
345 eb_open (name, from_tty)
346      char *name;
347      int from_tty;
348 {
349   TERMINAL sg;
350
351   char *p;
352
353   target_preopen (from_tty);
354   
355   /* Find the first whitespace character, it separates dev_name from
356      prog_name.  */
357   if (name == 0)
358     goto erroid;
359
360   for (p = name;
361        *p != '\0' && !isspace (*p); p++)
362     ;
363   if (*p == '\0')
364 erroid:
365     error ("\
366 Please include the name of the device for the serial port,\n\
367 the baud rate, and the name of the program to run on the remote system.");
368   dev_name = alloca (p - name + 1);
369   strncpy (dev_name, name, p - name);
370   dev_name[p - name] = '\0';
371
372   /* Skip over the whitespace after dev_name */
373   for (; isspace (*p); p++)
374     /*EMPTY*/;
375   
376   if (1 != sscanf (p, "%d ", &baudrate))
377     goto erroid;
378
379   /* Skip the number and then the spaces */
380   for (; isdigit (*p); p++)
381     /*EMPTY*/;
382   for (; isspace (*p); p++)
383     /*EMPTY*/;
384   
385   if (prog_name != NULL)
386     free (prog_name);
387   prog_name = savestring (p, strlen (p));
388
389   eb_close (0);
390
391   eb_desc = open (dev_name, O_RDWR);
392   if (eb_desc < 0)
393     perror_with_name (dev_name);
394   ioctl (eb_desc, TIOCGETP, &sg);
395 #ifdef HAVE_TERMIO
396   sg.c_cc[VMIN] = 0;            /* read with timeout.  */
397   sg.c_cc[VTIME] = timeout * 10;
398   sg.c_lflag &= ~(ICANON | ECHO);
399   sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
400 #else
401   sg.sg_ispeed = damn_b (baudrate);
402   sg.sg_ospeed = damn_b (baudrate);
403   sg.sg_flags |= RAW | ANYP;
404   sg.sg_flags &= ~ECHO;
405 #endif
406
407   ioctl (eb_desc, TIOCSETP, &sg);
408   eb_stream = fdopen (eb_desc, "r+");
409
410   push_target (&eb_ops);
411   if (from_tty)
412     printf ("Remote %s debugging %s using %s\n", target_shortname,
413             prog_name, dev_name);
414
415 #ifndef HAVE_TERMIO
416 #ifndef NO_SIGINTERRUPT
417   /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
418      the read.  */
419   if (siginterrupt (SIGALRM, 1) != 0)
420     perror ("eb_open: error in siginterrupt");
421 #endif
422
423   /* Set up read timeout timer.  */
424   if ((void (*)) signal (SIGALRM, eb_timer) == (void (*)) -1)
425     perror ("eb_open: error in signal");
426 #endif
427
428 #if defined (LOG_FILE)
429   log_file = fopen (LOG_FILE, "w");
430   if (log_file == NULL)
431     perror_with_name (LOG_FILE);
432 #endif
433
434   /* Hello?  Are you there?  */
435   write (eb_desc, "\n", 1);
436   
437   expect_prompt ();
438 }
439
440 /* Close out all files and local state before this target loses control. */
441
442 static void
443 eb_close (quitting)
444      int quitting;
445 {
446
447   /* Due to a bug in Unix, fclose closes not only the stdio stream,
448      but also the file descriptor.  So we don't actually close
449      eb_desc.  */
450   if (eb_stream)
451     fclose (eb_stream); /* This also closes eb_desc */
452   if (eb_desc >= 0)
453     /* close (eb_desc); */
454
455   /* Do not try to close eb_desc again, later in the program.  */
456   eb_stream = NULL;
457   eb_desc = -1;
458
459 #if defined (LOG_FILE)
460   if (log_file) {
461     if (ferror (log_file))
462       printf ("Error writing log file.\n");
463     if (fclose (log_file) != 0)
464       printf ("Error closing log file.\n");
465   }
466 #endif
467 }
468
469 /* Terminate the open connection to the remote debugger.
470    Use this when you want to detach and do something else
471    with your gdb.  */
472 void
473 eb_detach (from_tty)
474      int from_tty;
475 {
476   pop_target();         /* calls eb_close to do the real work */
477   if (from_tty)
478     printf ("Ending remote %s debugging\n", target_shortname);
479 }
480  
481 /* Tell the remote machine to resume.  */
482
483 void
484 eb_resume (step, sig)
485      int step, sig;
486 {
487   if (step)
488     {
489       write (eb_desc, "t 1,s\n", 6);
490       /* Wait for the echo.  */
491       expect ("t 1,s\r");
492       /* Then comes a line containing the instruction we stepped to.  */
493       expect ("\n@");
494       /* Then we get the prompt.  */
495       expect_prompt ();
496
497       /* Force the next eb_wait to return a trap.  Not doing anything
498          about I/O from the target means that the user has to type
499          "continue" to see any.  This should be fixed.  */
500       need_artificial_trap = 1;
501     }
502   else
503     {
504       if (need_gi)
505         {
506           need_gi = 0;
507           write (eb_desc, "gi\n", 3);
508           
509           /* Swallow the echo of "gi".  */
510           expect ("gi\r");
511         }
512       else
513         {
514           write (eb_desc, "GR\n", 3);
515           /* Swallow the echo.  */
516           expect ("GR\r");
517         }
518     }
519 }
520
521 /* Wait until the remote machine stops, then return,
522    storing status in STATUS just as `wait' would.  */
523
524 int
525 eb_wait (status)
526      WAITTYPE *status;
527 {
528   /* Strings to look for.  '?' means match any single character.  
529      Note that with the algorithm we use, the initial character
530      of the string cannot recur in the string, or we will not
531      find some cases of the string in the input.  */
532   
533   static char bpt[] = "Invalid interrupt taken - #0x50 - ";
534   /* It would be tempting to look for "\n[__exit + 0x8]\n"
535      but that requires loading symbols with "yc i" and even if
536      we did do that we don't know that the file has symbols.  */
537   static char exitmsg[] = "\n@????????I    JMPTI     GR121,LR0";
538   char *bp = bpt;
539   char *ep = exitmsg;
540
541   /* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars.  */
542   char swallowed[50];
543   /* Current position in swallowed.  */
544   char *swallowed_p = swallowed;
545
546   int ch;
547   int ch_handled;
548
549   int old_timeout = timeout;
550
551   WSETEXIT ((*status), 0);
552
553   if (need_artificial_trap != 0)
554     {
555       WSETSTOP ((*status), SIGTRAP);
556       need_artificial_trap--;
557       return 0;
558     }
559
560   timeout = 0;          /* Don't time out -- user program is running. */
561   while (1)
562     {
563       ch_handled = 0;
564       ch = readchar ();
565       if (ch == *bp)
566         {
567           bp++;
568           if (*bp == '\0')
569             break;
570           ch_handled = 1;
571
572           *swallowed_p++ = ch;
573         }
574       else
575         bp = bpt;
576
577       if (ch == *ep || *ep == '?')
578         {
579           ep++;
580           if (*ep == '\0')
581             break;
582
583           if (!ch_handled)
584             *swallowed_p++ = ch;
585           ch_handled = 1;
586         }
587       else
588         ep = exitmsg;
589
590       if (!ch_handled)
591         {
592           char *p;
593
594           /* Print out any characters which have been swallowed.  */
595           for (p = swallowed; p < swallowed_p; ++p)
596             putc (*p, stdout);
597           swallowed_p = swallowed;
598           
599           putc (ch, stdout);
600         }
601     }
602   expect_prompt ();
603   if (*bp== '\0')
604     WSETSTOP ((*status), SIGTRAP);
605   else
606     WSETEXIT ((*status), 0);
607   timeout = old_timeout;
608
609   return 0;
610 }
611
612 /* Return the name of register number REGNO
613    in the form input and output by EBMON.
614
615    Returns a pointer to a static buffer containing the answer.  */
616 static char *
617 get_reg_name (regno)
618      int regno;
619 {
620   static char buf[80];
621   if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
622     sprintf (buf, "GR%03d", regno - GR96_REGNUM + 96);
623   else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
624     sprintf (buf, "LR%03d", regno - LR0_REGNUM);
625   else if (regno == Q_REGNUM)
626     strcpy (buf, "SR131");
627   else if (regno >= BP_REGNUM && regno <= CR_REGNUM)
628     sprintf (buf, "SR%03d", regno - BP_REGNUM + 133);
629   else if (regno == ALU_REGNUM)
630     strcpy (buf, "SR132");
631   else if (regno >= IPC_REGNUM && regno <= IPB_REGNUM)
632     sprintf (buf, "SR%03d", regno - IPC_REGNUM + 128);
633   else if (regno >= VAB_REGNUM && regno <= LRU_REGNUM)
634     sprintf (buf, "SR%03d", regno - VAB_REGNUM);
635   else if (regno == GR1_REGNUM)
636     strcpy (buf, "GR001");
637   return buf;
638 }
639
640 /* Read the remote registers into the block REGS.  */
641
642 static void
643 eb_fetch_registers ()
644 {
645   int reg_index;
646   int regnum_index;
647   char tempbuf[10];
648   int i;
649
650 #if 0
651   /* This should not be necessary, because one is supposed to read the
652      registers only when the inferior is stopped (at least with
653      ptrace() and why not make it the same for remote?).  */
654   /* ^A is the "normal character" used to make sure we are talking to EBMON
655      and not to the program being debugged.  */
656   write (eb_desc, "\001\n");
657   expect_prompt ();
658 #endif
659
660   write (eb_desc, "dw gr96,gr127\n", 14);
661   for (reg_index = 96, regnum_index = GR96_REGNUM;
662        reg_index < 128;
663        reg_index += 4, regnum_index += 4)
664     {
665       sprintf (tempbuf, "GR%03d ", reg_index);
666       expect (tempbuf);
667       get_hex_regs (4, regnum_index);
668       expect ("\n");
669     }
670
671   for (i = 0; i < 128; i += 32)
672     {
673       /* The PC has a tendency to hang if we get these
674          all in one fell swoop ("dw lr0,lr127").  */
675       sprintf (tempbuf, "dw lr%d\n", i);
676       write (eb_desc, tempbuf, strlen (tempbuf));
677       for (reg_index = i, regnum_index = LR0_REGNUM + i;
678            reg_index < i + 32;
679            reg_index += 4, regnum_index += 4)
680         {
681           sprintf (tempbuf, "LR%03d ", reg_index);
682           expect (tempbuf);
683           get_hex_regs (4, regnum_index);
684           expect ("\n");
685         }
686     }
687
688   write (eb_desc, "dw sr133,sr133\n", 15);
689   expect ("SR133          ");
690   get_hex_regs (1, BP_REGNUM);
691   expect ("\n");
692
693   write (eb_desc, "dw sr134,sr134\n", 15);
694   expect ("SR134                   ");
695   get_hex_regs (1, FC_REGNUM);
696   expect ("\n");
697
698   write (eb_desc, "dw sr135,sr135\n", 15);
699   expect ("SR135                            ");
700   get_hex_regs (1, CR_REGNUM);
701   expect ("\n");
702
703   write (eb_desc, "dw sr131,sr131\n", 15);
704   expect ("SR131                            ");
705   get_hex_regs (1, Q_REGNUM);
706   expect ("\n");
707
708   write (eb_desc, "dw sr0,sr14\n", 12);
709   for (reg_index = 0, regnum_index = VAB_REGNUM;
710        regnum_index <= LRU_REGNUM;
711        regnum_index += 4, reg_index += 4)
712     {
713       sprintf (tempbuf, "SR%03d ", reg_index);
714       expect (tempbuf);
715       get_hex_regs (reg_index == 12 ? 3 : 4, regnum_index);
716       expect ("\n");
717     }
718
719   /* There doesn't seem to be any way to get these.  */
720   {
721     int val = -1;
722     supply_register (FPE_REGNUM, (char *) &val);
723     supply_register (INTE_REGNUM, (char *) &val);
724     supply_register (FPS_REGNUM, (char *) &val);
725     supply_register (EXO_REGNUM, (char *) &val);
726   }
727
728   write (eb_desc, "dw gr1,gr1\n", 11);
729   expect ("GR001 ");
730   get_hex_regs (1, GR1_REGNUM);
731   expect_prompt ();
732 }
733
734 /* Fetch register REGNO, or all registers if REGNO is -1.
735    Returns errno value.  */
736 void
737 eb_fetch_register (regno)
738      int regno;
739 {
740   if (regno == -1)
741     eb_fetch_registers ();
742   else
743     {
744       char *name = get_reg_name (regno);
745       fprintf (eb_stream, "dw %s,%s\n", name, name);
746       expect (name);
747       expect (" ");
748       get_hex_regs (1, regno);
749       expect_prompt ();
750     }
751   return;
752 }
753
754 /* Store the remote registers from the contents of the block REGS.  */
755
756 static void
757 eb_store_registers ()
758 {
759   int i, j;
760   fprintf (eb_stream, "s gr1,%x\n", read_register (GR1_REGNUM));
761   expect_prompt ();
762
763   for (j = 0; j < 32; j += 16)
764     {
765       fprintf (eb_stream, "s gr%d,", j + 96);
766       for (i = 0; i < 15; ++i)
767         fprintf (eb_stream, "%x,", read_register (GR96_REGNUM + j + i));
768       fprintf (eb_stream, "%x\n", read_register (GR96_REGNUM + j + 15));
769       expect_prompt ();
770     }
771
772   for (j = 0; j < 128; j += 16)
773     {
774       fprintf (eb_stream, "s lr%d,", j);
775       for (i = 0; i < 15; ++i)
776         fprintf (eb_stream, "%x,", read_register (LR0_REGNUM + j + i));
777       fprintf (eb_stream, "%x\n", read_register (LR0_REGNUM + j + 15));
778       expect_prompt ();
779     }
780
781   fprintf (eb_stream, "s sr133,%x,%x,%x\n", read_register (BP_REGNUM),
782            read_register (FC_REGNUM), read_register (CR_REGNUM));
783   expect_prompt ();
784   fprintf (eb_stream, "s sr131,%x\n", read_register (Q_REGNUM));
785   expect_prompt ();
786   fprintf (eb_stream, "s sr0,");
787   for (i = 0; i < 11; ++i)
788     fprintf (eb_stream, "%x,", read_register (VAB_REGNUM + i));
789   fprintf (eb_stream, "%x\n", read_register (VAB_REGNUM + 11));
790   expect_prompt ();
791 }
792
793 /* Store register REGNO, or all if REGNO == 0.
794    Return errno value.  */
795 void
796 eb_store_register (regno)
797      int regno;
798 {
799   if (regno == -1)
800     eb_store_registers ();
801   else
802     {
803       char *name = get_reg_name (regno);
804       fprintf (eb_stream, "s %s,%x\n", name, read_register (regno));
805       /* Setting GR1 changes the numbers of all the locals, so
806          invalidate the register cache.  Do this *after* calling
807          read_register, because we want read_register to return the
808          value that write_register has just stuffed into the registers
809          array, not the value of the register fetched from the
810          inferior.  */
811       if (regno == GR1_REGNUM)
812         registers_changed ();
813       expect_prompt ();
814     }
815 }
816
817 /* Get ready to modify the registers array.  On machines which store
818    individual registers, this doesn't need to do anything.  On machines
819    which store all the registers in one fell swoop, this makes sure
820    that registers contains all the registers from the program being
821    debugged.  */
822
823 void
824 eb_prepare_to_store ()
825 {
826   /* Do nothing, since we can store individual regs */
827 }
828
829
830 /* FIXME-someday!  Merge these two.  */
831 int
832 eb_xfer_inferior_memory (memaddr, myaddr, len, write, target)
833      CORE_ADDR memaddr;
834      char *myaddr;
835      int len;
836      int write;
837      struct target_ops *target;         /* ignored */
838 {
839   if (write)
840     return eb_write_inferior_memory (memaddr, myaddr, len);
841   else
842     return eb_read_inferior_memory (memaddr, myaddr, len);
843 }
844
845 void
846 eb_files_info ()
847 {
848   printf ("\tAttached to %s at %d baud and running program %s.\n",
849           dev_name, baudrate, prog_name);
850 }
851
852 /* Copy LEN bytes of data from debugger memory at MYADDR
853    to inferior's memory at MEMADDR.  Returns length moved.  */
854 int
855 eb_write_inferior_memory (memaddr, myaddr, len)
856      CORE_ADDR memaddr;
857      char *myaddr;
858      int len;
859 {
860   int i;
861
862   for (i = 0; i < len; i++)
863     {
864       if ((i % 16) == 0)
865         fprintf (eb_stream, "sb %x,", memaddr + i);
866       if ((i % 16) == 15 || i == len - 1)
867         {
868           fprintf (eb_stream, "%x\n", ((unsigned char *)myaddr)[i]);
869           expect_prompt ();
870         }
871       else
872         fprintf (eb_stream, "%x,", ((unsigned char *)myaddr)[i]);
873     }
874   return len;
875 }
876
877 /* Read LEN bytes from inferior memory at MEMADDR.  Put the result
878    at debugger address MYADDR.  Returns length moved.  */
879 int
880 eb_read_inferior_memory(memaddr, myaddr, len)
881      CORE_ADDR memaddr;
882      char *myaddr;
883      int len;
884 {
885   int i;
886
887   /* Number of bytes read so far.  */
888   int count;
889
890   /* Starting address of this pass.  */
891   unsigned long startaddr;
892
893   /* Number of bytes to read in this pass.  */
894   int len_this_pass;
895
896   /* Note that this code works correctly if startaddr is just less
897      than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
898      thing).  That is, something like
899      eb_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
900      works--it never adds len to memaddr and gets 0.  */
901   /* However, something like
902      eb_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
903      doesn't need to work.  Detect it and give up if there's an attempt
904      to do that.  */
905   if (((memaddr - 1) + len) < memaddr) {
906     errno = EIO;
907     return 0;
908   }
909   
910   startaddr = memaddr;
911   count = 0;
912   while (count < len)
913     {
914       len_this_pass = 16;
915       if ((startaddr % 16) != 0)
916         len_this_pass -= startaddr % 16;
917       if (len_this_pass > (len - count))
918         len_this_pass = (len - count);
919
920       fprintf (eb_stream, "db %x,%x\n", startaddr,
921                (startaddr - 1) + len_this_pass);
922       expect ("\n");
923
924       /* Look for 8 hex digits.  */
925       i = 0;
926       while (1)
927         {
928           if (isxdigit (readchar ()))
929             ++i;
930           else
931             {
932               expect_prompt ();
933               error ("Hex digit expected from remote system.");
934             }
935           if (i >= 8)
936             break;
937         }
938
939       expect ("  ");
940
941       for (i = 0; i < len_this_pass; i++)
942         get_hex_byte (&myaddr[count++]);
943
944       expect_prompt ();
945
946       startaddr += len_this_pass;
947     }
948   return len;
949 }
950
951 static void
952 eb_kill (args, from_tty)
953      char *args;
954      int from_tty;
955 {
956   return;               /* Ignore attempts to kill target system */
957 }
958
959 /* Clean up when a program exits.
960
961    The program actually lives on in the remote processor's RAM, and may be
962    run again without a download.  Don't leave it full of breakpoint
963    instructions.  */
964
965 void
966 eb_mourn_inferior ()
967 {
968   remove_breakpoints ();
969   unpush_target (&eb_ops);
970   generic_mourn_inferior ();    /* Do all the proper things now */
971 }
972 /* Define the target subroutine names */
973
974 struct target_ops eb_ops = {
975         "amd-eb", "Remote serial AMD EBMON target",
976         "Use a remote computer running EBMON connected by a serial line.\n\
977 Arguments are the name of the device for the serial line,\n\
978 the speed to connect at in bits per second, and the filename of the\n\
979 executable as it exists on the remote computer.  For example,\n\
980         target amd-eb /dev/ttya 9600 demo",
981         eb_open, eb_close, 
982         0, eb_detach, eb_resume, eb_wait,
983         eb_fetch_register, eb_store_register,
984         eb_prepare_to_store,
985         eb_xfer_inferior_memory, eb_files_info,
986         0, 0,   /* Breakpoints */
987         0, 0, 0, 0, 0,  /* Terminal handling */
988         eb_kill,
989         generic_load,   /* load */
990         0, /* lookup_symbol */
991         eb_create_inferior,
992         eb_mourn_inferior,
993         0,      /* can_run */
994         0, /* notice_signals */
995         process_stratum, 0, /* next */
996         1, 1, 1, 1, 1,  /* all mem, mem, stack, regs, exec */
997         0, 0,                   /* Section pointers */
998         OPS_MAGIC,              /* Always the last thing */
999 };
1000
1001 void
1002 _initialize_remote_eb ()
1003 {
1004   add_target (&eb_ops);
1005 }
This page took 0.075039 seconds and 4 git commands to generate.