Create new file regcache.h. Update all uses.
[deliverable/binutils-gdb.git] / gdb / remote-adapt.c
1 /* Remote debugging interface for AMD 290*0 Adapt Monitor Version 2.1d18.
2 Copyright 1990, 1991, 1992, 2001 Free Software Foundation, Inc.
3 Contributed by David Wood at New York University (wood@lab.ultra.nyu.edu).
4 Adapted from work done at Cygnus Support in remote-eb.c.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 /* This is like remote.c but is for an esoteric situation--
24 having a 29k board attached to an Adapt inline monitor.
25 The monitor is connected via serial line to a unix machine
26 running gdb.
27
28 3/91 - developed on Sun3 OS 4.1, by David Wood
29 o - I can't get binary coff to load.
30 o - I can't get 19200 baud rate to work.
31 7/91 o - Freeze mode tracing can be done on a 29050. */
32
33
34
35 #include "defs.h"
36 #include "gdb_string.h"
37 #include "inferior.h"
38 #include "value.h"
39 #include <ctype.h>
40 #include <fcntl.h>
41 #include <signal.h>
42 #include <errno.h>
43 #include "terminal.h"
44 #include "target.h"
45 #include "gdbcore.h"
46 #include "regcache.h"
47
48 /* This processor is getting rusty but I am trying to keep it
49 up to date at least with data structure changes.
50 Activate this block to compile just this file.
51 */
52 #define COMPILE_CHECK 0
53 #if COMPILE_CHECK
54 #define Q_REGNUM 0
55 #define VAB_REGNUM 0
56 #define CPS_REGNUM 0
57 #define IPA_REGNUM 0
58 #define IPB_REGNUM 0
59 #define GR1_REGNUM 0
60 #define LR0_REGNUM 0
61 #define IPC_REGNUM 0
62 #define CR_REGNUM 0
63 #define BP_REGNUM 0
64 #define FC_REGNUM 0
65 #define INTE_REGNUM 0
66 #define EXO_REGNUM 0
67 #define GR96_REGNUM 0
68 #define NPC_REGNUM
69 #define FPE_REGNUM 0
70 #define PC2_REGNUM 0
71 #define FPS_REGNUM 0
72 #define ALU_REGNUM 0
73 #define LRU_REGNUM 0
74 #define TERMINAL int
75 #define RAW 1
76 #define ANYP 1
77 extern int a29k_freeze_mode;
78 extern int processor_type;
79 extern char *processor_name;
80 #endif
81
82 /* External data declarations */
83 extern int stop_soon_quietly; /* for wait_for_inferior */
84
85 /* Forward data declarations */
86 extern struct target_ops adapt_ops; /* Forward declaration */
87
88 /* Forward function declarations */
89 static void adapt_fetch_registers ();
90 static void adapt_store_registers ();
91 static void adapt_close ();
92 static int adapt_clear_breakpoints ();
93
94 #define FREEZE_MODE (read_register(CPS_REGNUM) && 0x400)
95 #define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
96
97 /* Can't seem to get binary coff working */
98 #define ASCII_COFF /* Adapt will be downloaded with ascii coff */
99
100 /* FIXME: Replace with `set remotedebug'. */
101 #define LOG_FILE "adapt.log"
102 #if defined (LOG_FILE)
103 FILE *log_file = NULL;
104 #endif
105
106 static int timeout = 5;
107 static char *dev_name;
108
109 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
110 adapt_open knows that we don't have a file open when the program
111 starts. */
112 int adapt_desc = -1;
113
114 /* stream which is fdopen'd from adapt_desc. Only valid when
115 adapt_desc != -1. */
116 FILE *adapt_stream;
117
118 #define ON 1
119 #define OFF 0
120 static void
121 rawmode (int desc, int turnon)
122 {
123
124 TERMINAL sg;
125
126 if (desc < 0)
127 return;
128
129 ioctl (desc, TIOCGETP, &sg);
130
131 if (turnon)
132 {
133 #ifdef HAVE_TERMIO
134 sg.c_lflag &= ~(ICANON);
135 #else
136 sg.sg_flags |= RAW;
137 #endif
138 }
139 else
140 {
141 #ifdef HAVE_TERMIO
142 sg.c_lflag |= ICANON;
143 #else
144 sg.sg_flags &= ~(RAW);
145 #endif
146 }
147 ioctl (desc, TIOCSETP, &sg);
148 }
149
150 /* Suck up all the input from the adapt */
151 slurp_input (void)
152 {
153 char buf[8];
154
155 #ifdef HAVE_TERMIO
156 /* termio does the timeout for us. */
157 while (read (adapt_desc, buf, 8) > 0);
158 #else
159 alarm (timeout);
160 while (read (adapt_desc, buf, 8) > 0);
161 alarm (0);
162 #endif
163 }
164
165 /* Read a character from the remote system, doing all the fancy
166 timeout stuff. */
167 static int
168 readchar (void)
169 {
170 char buf;
171
172 buf = '\0';
173 #ifdef HAVE_TERMIO
174 /* termio does the timeout for us. */
175 read (adapt_desc, &buf, 1);
176 #else
177 alarm (timeout);
178 if (read (adapt_desc, &buf, 1) < 0)
179 {
180 if (errno == EINTR)
181 error ("Timeout reading from remote system.");
182 else
183 perror_with_name ("remote");
184 }
185 alarm (0);
186 #endif
187
188 if (buf == '\0')
189 error ("Timeout reading from remote system.");
190 #if defined (LOG_FILE)
191 putc (buf & 0x7f, log_file);
192 #endif
193 return buf & 0x7f;
194 }
195
196 /* Keep discarding input from the remote system, until STRING is found.
197 Let the user break out immediately. */
198 static void
199 expect (char *string)
200 {
201 char *p = string;
202
203 fflush (adapt_stream);
204 immediate_quit++;
205 while (1)
206 {
207 if (readchar () == *p)
208 {
209 p++;
210 if (*p == '\0')
211 {
212 immediate_quit--;
213 return;
214 }
215 }
216 else
217 p = string;
218 }
219 }
220
221 /* Keep discarding input until we see the adapt prompt.
222
223 The convention for dealing with the prompt is that you
224 o give your command
225 o *then* wait for the prompt.
226
227 Thus the last thing that a procedure does with the serial line
228 will be an expect_prompt(). Exception: adapt_resume does not
229 wait for the prompt, because the terminal is being handed over
230 to the inferior. However, the next thing which happens after that
231 is a adapt_wait which does wait for the prompt.
232 Note that this includes abnormal exit, e.g. error(). This is
233 necessary to prevent getting into states from which we can't
234 recover. */
235 static void
236 expect_prompt (void)
237 {
238 #if defined (LOG_FILE)
239 /* This is a convenient place to do this. The idea is to do it often
240 enough that we never lose much data if we terminate abnormally. */
241 fflush (log_file);
242 #endif
243 fflush (adapt_stream);
244 expect ("\n# ");
245 }
246
247 /* Get a hex digit from the remote system & return its value.
248 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
249 static int
250 get_hex_digit (int ignore_space)
251 {
252 int ch;
253 while (1)
254 {
255 ch = readchar ();
256 if (ch >= '0' && ch <= '9')
257 return ch - '0';
258 else if (ch >= 'A' && ch <= 'F')
259 return ch - 'A' + 10;
260 else if (ch >= 'a' && ch <= 'f')
261 return ch - 'a' + 10;
262 else if (ch == ' ' && ignore_space)
263 ;
264 else
265 {
266 expect_prompt ();
267 error ("Invalid hex digit from remote system.");
268 }
269 }
270 }
271
272 /* Get a byte from adapt_desc and put it in *BYT. Accept any number
273 leading spaces. */
274 static void
275 get_hex_byte (char *byt)
276 {
277 int val;
278
279 val = get_hex_digit (1) << 4;
280 val |= get_hex_digit (0);
281 *byt = val;
282 }
283
284 /* Read a 32-bit hex word from the adapt, preceded by a space */
285 static long
286 get_hex_word (void)
287 {
288 long val;
289 int j;
290
291 val = 0;
292 for (j = 0; j < 8; j++)
293 val = (val << 4) + get_hex_digit (j == 0);
294 return val;
295 }
296 /* Get N 32-bit hex words from remote, each preceded by a space
297 and put them in registers starting at REGNO. */
298 static void
299 get_hex_regs (int n, int regno)
300 {
301 long val;
302 while (n--)
303 {
304 val = get_hex_word ();
305 supply_register (regno++, (char *) &val);
306 }
307 }
308 /* Called when SIGALRM signal sent due to alarm() timeout. */
309 #ifndef HAVE_TERMIO
310
311 #ifndef __STDC__
312 #ifndef volatile
313 #define volatile
314 /**/
315 # endif
316 #endif
317 volatile int n_alarms;
318
319 void
320 adapt_timer (void)
321 {
322 #if 0
323 if (kiodebug)
324 printf ("adapt_timer called\n");
325 #endif
326 n_alarms++;
327 }
328 #endif
329
330 /* malloc'd name of the program on the remote system. */
331 static char *prog_name = NULL;
332
333 /* Number of SIGTRAPs we need to simulate. That is, the next
334 NEED_ARTIFICIAL_TRAP calls to adapt_wait should just return
335 SIGTRAP without actually waiting for anything. */
336
337 static int need_artificial_trap = 0;
338
339 void
340 adapt_kill (char *arg, int from_tty)
341 {
342 fprintf (adapt_stream, "K");
343 fprintf (adapt_stream, "\r");
344 expect_prompt ();
345 }
346 /*
347 * Download a file specified in 'args', to the adapt.
348 * FIXME: Assumes the file to download is a binary coff file.
349 */
350 static void
351 adapt_load (char *args, int fromtty)
352 {
353 FILE *fp;
354 int n;
355 char buffer[1024];
356
357 if (!adapt_stream)
358 {
359 printf_filtered ("Adapt not open. Use 'target' command to open adapt\n");
360 return;
361 }
362
363 /* OK, now read in the file. Y=read, C=COFF, T=dTe port
364 0=start address. */
365
366 #ifdef ASCII_COFF /* Ascii coff */
367 fprintf (adapt_stream, "YA T,0\r");
368 fflush (adapt_stream); /* Just in case */
369 /* FIXME: should check args for only 1 argument */
370 sprintf (buffer, "cat %s | btoa > /tmp/#adapt-btoa", args);
371 system (buffer);
372 fp = fopen ("/tmp/#adapt-btoa", "r");
373 rawmode (adapt_desc, OFF);
374 while (n = fread (buffer, 1, 1024, fp))
375 {
376 do
377 {
378 n -= write (adapt_desc, buffer, n);
379 }
380 while (n > 0);
381 if (n < 0)
382 {
383 perror ("writing ascii coff");
384 break;
385 }
386 }
387 fclose (fp);
388 rawmode (adapt_desc, ON);
389 system ("rm /tmp/#adapt-btoa");
390 #else /* Binary coff - can't get it to work . */
391 fprintf (adapt_stream, "YC T,0\r");
392 fflush (adapt_stream); /* Just in case */
393 if (!(fp = fopen (args, "r")))
394 {
395 printf_filtered ("Can't open %s\n", args);
396 return;
397 }
398 while (n = fread (buffer, 1, 512, fp))
399 {
400 do
401 {
402 n -= write (adapt_desc, buffer, n);
403 }
404 while (n > 0);
405 if (n < 0)
406 {
407 perror ("writing ascii coff");
408 break;
409 }
410 }
411 fclose (fp);
412 #endif
413 expect_prompt (); /* Skip garbage that comes out */
414 fprintf (adapt_stream, "\r");
415 expect_prompt ();
416 }
417
418 /* This is called not only when we first attach, but also when the
419 user types "run" after having attached. */
420 void
421 adapt_create_inferior (char *execfile, char *args, char **env)
422 {
423 int entry_pt;
424
425 if (args && *args)
426 error ("Can't pass arguments to remote adapt process.");
427
428 if (execfile == 0 || exec_bfd == 0)
429 error ("No executable file specified");
430
431 entry_pt = (int) bfd_get_start_address (exec_bfd);
432
433 if (adapt_stream)
434 {
435 adapt_kill (NULL, NULL);
436 adapt_clear_breakpoints ();
437 init_wait_for_inferior ();
438 /* Clear the input because what the adapt sends back is different
439 * depending on whether it was running or not.
440 */
441 slurp_input (); /* After this there should be a prompt */
442 fprintf (adapt_stream, "\r");
443 expect_prompt ();
444 printf_filtered ("Do you want to download '%s' (y/n)? [y] : ", prog_name);
445 {
446 char buffer[10];
447 gets (buffer);
448 if (*buffer != 'n')
449 {
450 adapt_load (prog_name, 0);
451 }
452 }
453
454 #ifdef NOTDEF
455 /* Set the PC and wait for a go/cont */
456 fprintf (adapt_stream, "G %x,N\r", entry_pt);
457 printf_filtered ("Now use the 'continue' command to start.\n");
458 expect_prompt ();
459 #else
460 insert_breakpoints (); /* Needed to get correct instruction in cache */
461 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
462 #endif
463
464 }
465 else
466 {
467 printf_filtered ("Adapt not open yet.\n");
468 }
469 }
470
471 /* Translate baud rates from integers to damn B_codes. Unix should
472 have outgrown this crap years ago, but even POSIX wouldn't buck it. */
473
474 #ifndef B19200
475 #define B19200 EXTA
476 #endif
477 #ifndef B38400
478 #define B38400 EXTB
479 #endif
480
481 static struct
482 {
483 int rate, damn_b;
484 }
485 baudtab[] =
486 {
487 {
488 0, B0
489 }
490 ,
491 {
492 50, B50
493 }
494 ,
495 {
496 75, B75
497 }
498 ,
499 {
500 110, B110
501 }
502 ,
503 {
504 134, B134
505 }
506 ,
507 {
508 150, B150
509 }
510 ,
511 {
512 200, B200
513 }
514 ,
515 {
516 300, B300
517 }
518 ,
519 {
520 600, B600
521 }
522 ,
523 {
524 1200, B1200
525 }
526 ,
527 {
528 1800, B1800
529 }
530 ,
531 {
532 2400, B2400
533 }
534 ,
535 {
536 4800, B4800
537 }
538 ,
539 {
540 9600, B9600
541 }
542 ,
543 {
544 19200, B19200
545 }
546 ,
547 {
548 38400, B38400
549 }
550 ,
551 {
552 -1, -1
553 }
554 ,
555 };
556
557 static int
558 damn_b (int rate)
559 {
560 int i;
561
562 for (i = 0; baudtab[i].rate != -1; i++)
563 if (rate == baudtab[i].rate)
564 return baudtab[i].damn_b;
565 return B38400; /* Random */
566 }
567
568
569 /* Open a connection to a remote debugger.
570 NAME is the filename used for communication, then a space,
571 then the baud rate.
572 */
573
574 static int baudrate = 9600;
575 static void
576 adapt_open (char *name, int from_tty)
577 {
578 TERMINAL sg;
579 unsigned int prl;
580 char *p;
581
582 /* Find the first whitespace character, it separates dev_name from
583 prog_name. */
584 if (name == 0)
585 goto erroid;
586
587 for (p = name;
588 *p != '\0' && !isspace (*p); p++)
589 ;
590 if (*p == '\0')
591 erroid:
592 error ("\
593 Please include the name of the device for the serial port,\n\
594 the baud rate, and the name of the program to run on the remote system.");
595 dev_name = (char *) xmalloc (p - name + 1);
596 strncpy (dev_name, name, p - name);
597 dev_name[p - name] = '\0';
598
599 /* Skip over the whitespace after dev_name */
600 for (; isspace (*p); p++)
601 /*EMPTY */ ;
602
603 if (1 != sscanf (p, "%d ", &baudrate))
604 goto erroid;
605
606 /* Skip the number and then the spaces */
607 for (; isdigit (*p); p++)
608 /*EMPTY */ ;
609 for (; isspace (*p); p++)
610 /*EMPTY */ ;
611
612 if (prog_name != NULL)
613 xfree (prog_name);
614 prog_name = savestring (p, strlen (p));
615
616 adapt_close (0);
617
618 adapt_desc = open (dev_name, O_RDWR);
619 if (adapt_desc < 0)
620 perror_with_name (dev_name);
621 ioctl (adapt_desc, TIOCGETP, &sg);
622 #if ! defined(COMPILE_CHECK)
623 #ifdef HAVE_TERMIO
624 sg.c_cc[VMIN] = 0; /* read with timeout. */
625 sg.c_cc[VTIME] = timeout * 10;
626 sg.c_lflag &= ~(ICANON | ECHO);
627 sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
628 #else
629 sg.sg_ispeed = damn_b (baudrate);
630 sg.sg_ospeed = damn_b (baudrate);
631 sg.sg_flags |= RAW | ANYP;
632 sg.sg_flags &= ~ECHO;
633 #endif
634
635 ioctl (adapt_desc, TIOCSETP, &sg);
636 adapt_stream = fdopen (adapt_desc, "r+");
637 #endif /* compile_check */
638 push_target (&adapt_ops);
639
640 #ifndef HAVE_TERMIO
641 #ifndef NO_SIGINTERRUPT
642 /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
643 the read. */
644 if (siginterrupt (SIGALRM, 1) != 0)
645 perror ("adapt_open: error in siginterrupt");
646 #endif
647
648 /* Set up read timeout timer. */
649 if ((void (*)) signal (SIGALRM, adapt_timer) == (void (*)) -1)
650 perror ("adapt_open: error in signal");
651 #endif
652
653 #if defined (LOG_FILE)
654 log_file = fopen (LOG_FILE, "w");
655 if (log_file == NULL)
656 perror_with_name (LOG_FILE);
657 #endif
658
659 /* Put this port into NORMAL mode, send the 'normal' character */
660 write (adapt_desc, "\ 1", 1); /* Control A */
661 write (adapt_desc, "\r", 1);
662 expect_prompt ();
663
664 /* Hello? Are you there? */
665 write (adapt_desc, "\r", 1);
666
667 expect_prompt ();
668
669 /* Clear any break points */
670 adapt_clear_breakpoints ();
671
672 /* Print out some stuff, letting the user now what's going on */
673 printf_filtered ("Connected to an Adapt via %s.\n", dev_name);
674 /* FIXME: can this restriction be removed? */
675 printf_filtered ("Remote debugging using virtual addresses works only\n");
676 printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n");
677 if (processor_type != a29k_freeze_mode)
678 {
679 fprintf_filtered (gdb_stderr,
680 "Freeze-mode debugging not available, and can only be done on an A29050.\n");
681 }
682 }
683
684 /* Close out all files and local state before this target loses control. */
685
686 static void
687 adapt_close (int quitting)
688 {
689
690 /* Clear any break points */
691 adapt_clear_breakpoints ();
692
693 /* Put this port back into REMOTE mode */
694 if (adapt_stream)
695 {
696 fflush (adapt_stream);
697 sleep (1); /* Let any output make it all the way back */
698 write (adapt_desc, "R\r", 2);
699 }
700
701 /* Due to a bug in Unix, fclose closes not only the stdio stream,
702 but also the file descriptor. So we don't actually close
703 adapt_desc. */
704 if (adapt_stream)
705 fclose (adapt_stream); /* This also closes adapt_desc */
706 if (adapt_desc >= 0)
707 /* close (adapt_desc); */
708
709 /* Do not try to close adapt_desc again, later in the program. */
710 adapt_stream = NULL;
711 adapt_desc = -1;
712
713 #if defined (LOG_FILE)
714 if (log_file)
715 {
716 if (ferror (log_file))
717 printf_filtered ("Error writing log file.\n");
718 if (fclose (log_file) != 0)
719 printf_filtered ("Error closing log file.\n");
720 log_file = NULL;
721 }
722 #endif
723 }
724
725 /* Attach to the target that is already loaded and possibly running */
726 static void
727 adapt_attach (char *args, int from_tty)
728 {
729
730 if (from_tty)
731 printf_filtered ("Attaching to remote program %s.\n", prog_name);
732
733 /* Send the adapt a kill. It is ok if it is not already running */
734 fprintf (adapt_stream, "K\r");
735 fflush (adapt_stream);
736 expect_prompt (); /* Slurp the echo */
737 }
738
739
740 /* Terminate the open connection to the remote debugger.
741 Use this when you want to detach and do something else
742 with your gdb. */
743 void
744 adapt_detach (char *args, int from_tty)
745 {
746
747 if (adapt_stream)
748 { /* Send it on its way (tell it to continue) */
749 adapt_clear_breakpoints ();
750 fprintf (adapt_stream, "G\r");
751 }
752
753 pop_target (); /* calls adapt_close to do the real work */
754 if (from_tty)
755 printf_filtered ("Ending remote %s debugging\n", target_shortname);
756 }
757
758 /* Tell the remote machine to resume. */
759
760 void
761 adapt_resume (int pid, int step, enum target_signal sig)
762 {
763 if (step)
764 {
765 write (adapt_desc, "t 1,s\r", 6);
766 /* Wait for the echo. */
767 expect ("t 1,s\r\n");
768 /* Then comes a line containing the instruction we stepped to. */
769 expect ("@");
770 /* Then we get the prompt. */
771 expect_prompt ();
772
773 /* Force the next adapt_wait to return a trap. Not doing anything
774 about I/O from the target means that the user has to type
775 "continue" to see any. FIXME, this should be fixed. */
776 need_artificial_trap = 1;
777 }
778 else
779 {
780 write (adapt_desc, "G\r", 2);
781 /* Swallow the echo. */
782 expect_prompt ();
783 }
784 }
785
786 /* Wait until the remote machine stops, then return,
787 storing status in STATUS just as `wait' would. */
788
789 int
790 adapt_wait (struct target_waitstatus *status)
791 {
792 /* Strings to look for. '?' means match any single character.
793 Note that with the algorithm we use, the initial character
794 of the string cannot recur in the string, or we will not
795 find some cases of the string in the input. */
796
797 static char bpt[] = "@";
798 /* It would be tempting to look for "\n[__exit + 0x8]\n"
799 but that requires loading symbols with "yc i" and even if
800 we did do that we don't know that the file has symbols. */
801 static char exitmsg[] = "@????????I JMPTI GR121,LR0";
802 char *bp = bpt;
803 char *ep = exitmsg;
804
805 /* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars. */
806 char swallowed[50];
807 /* Current position in swallowed. */
808 char *swallowed_p = swallowed;
809
810 int ch;
811 int ch_handled;
812 int old_timeout = timeout;
813 int old_immediate_quit = immediate_quit;
814
815 status->kind = TARGET_WAITKIND_EXITED;
816 status->value.integer = 0;
817
818 if (need_artificial_trap != 0)
819 {
820 status->kind = TARGET_WAITKIND_STOPPED;
821 status->value.sig = TARGET_SIGNAL_TRAP;
822 need_artificial_trap--;
823 return 0;
824 }
825
826 timeout = 0; /* Don't time out -- user program is running. */
827 immediate_quit = 1; /* Helps ability to QUIT */
828 while (1)
829 {
830 QUIT; /* Let user quit and leave process running */
831 ch_handled = 0;
832 ch = readchar ();
833 if (ch == *bp)
834 {
835 bp++;
836 if (*bp == '\0')
837 break;
838 ch_handled = 1;
839
840 *swallowed_p++ = ch;
841 }
842 else
843 bp = bpt;
844 if (ch == *ep || *ep == '?')
845 {
846 ep++;
847 if (*ep == '\0')
848 break;
849
850 if (!ch_handled)
851 *swallowed_p++ = ch;
852 ch_handled = 1;
853 }
854 else
855 ep = exitmsg;
856 if (!ch_handled)
857 {
858 char *p;
859 /* Print out any characters which have been swallowed. */
860 for (p = swallowed; p < swallowed_p; ++p)
861 putc (*p, stdout);
862 swallowed_p = swallowed;
863 putc (ch, stdout);
864 }
865 }
866 expect_prompt ();
867 if (*bp == '\0')
868 {
869 status->kind = TARGET_WAITKIND_STOPPED;
870 status->value.sig = TARGET_SIGNAL_TRAP;
871 }
872 else
873 {
874 status->kind = TARGET_WAITKIND_EXITED;
875 status->value.integer = 0;
876 }
877 timeout = old_timeout;
878 immediate_quit = old_immediate_quit;
879 return 0;
880 }
881
882 /* Return the name of register number REGNO
883 in the form input and output by adapt.
884
885 Returns a pointer to a static buffer containing the answer. */
886 static char *
887 get_reg_name (int regno)
888 {
889 static char buf[80];
890 if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
891 sprintf (buf, "GR%03d", regno - GR96_REGNUM + 96);
892 #if defined(GR64_REGNUM)
893 else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
894 sprintf (buf, "GR%03d", regno - GR64_REGNUM + 64);
895 #endif
896 else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
897 sprintf (buf, "LR%03d", regno - LR0_REGNUM);
898 else if (regno == Q_REGNUM)
899 strcpy (buf, "SR131");
900 else if (regno >= BP_REGNUM && regno <= CR_REGNUM)
901 sprintf (buf, "SR%03d", regno - BP_REGNUM + 133);
902 else if (regno == ALU_REGNUM)
903 strcpy (buf, "SR132");
904 else if (regno >= IPC_REGNUM && regno <= IPB_REGNUM)
905 sprintf (buf, "SR%03d", regno - IPC_REGNUM + 128);
906 else if (regno >= VAB_REGNUM && regno <= LRU_REGNUM)
907 {
908 /* When a 29050 is in freeze-mode, read shadow pcs instead */
909 if ((regno >= NPC_REGNUM && regno <= PC2_REGNUM) && USE_SHADOW_PC)
910 sprintf (buf, "SR%03d", regno - NPC_REGNUM + 20);
911 else
912 sprintf (buf, "SR%03d", regno - VAB_REGNUM);
913 }
914 else if (regno == GR1_REGNUM)
915 strcpy (buf, "GR001");
916 return buf;
917 }
918
919 /* Read the remote registers. */
920
921 static void
922 adapt_fetch_registers (void)
923 {
924 int reg_index;
925 int regnum_index;
926 char tempbuf[10];
927 int sreg_buf[16];
928 int i, j;
929
930 /*
931 * Global registers
932 */
933 #if defined(GR64_REGNUM)
934 write (adapt_desc, "dw gr64,gr95\r", 13);
935 for (reg_index = 64, regnum_index = GR64_REGNUM;
936 reg_index < 96;
937 reg_index += 4, regnum_index += 4)
938 {
939 sprintf (tempbuf, "GR%03d ", reg_index);
940 expect (tempbuf);
941 get_hex_regs (4, regnum_index);
942 expect ("\n");
943 }
944 #endif
945 write (adapt_desc, "dw gr96,gr127\r", 14);
946 for (reg_index = 96, regnum_index = GR96_REGNUM;
947 reg_index < 128;
948 reg_index += 4, regnum_index += 4)
949 {
950 sprintf (tempbuf, "GR%03d ", reg_index);
951 expect (tempbuf);
952 get_hex_regs (4, regnum_index);
953 expect ("\n");
954 }
955
956 /*
957 * Local registers
958 */
959 for (i = 0; i < 128; i += 32)
960 {
961 /* The PC has a tendency to hang if we get these
962 all in one fell swoop ("dw lr0,lr127"). */
963 sprintf (tempbuf, "dw lr%d\r", i);
964 write (adapt_desc, tempbuf, strlen (tempbuf));
965 for (reg_index = i, regnum_index = LR0_REGNUM + i;
966 reg_index < i + 32;
967 reg_index += 4, regnum_index += 4)
968 {
969 sprintf (tempbuf, "LR%03d ", reg_index);
970 expect (tempbuf);
971 get_hex_regs (4, regnum_index);
972 expect ("\n");
973 }
974 }
975
976 /*
977 * Special registers
978 */
979 sprintf (tempbuf, "dw sr0\r");
980 write (adapt_desc, tempbuf, strlen (tempbuf));
981 for (i = 0; i < 4; i++)
982 { /* SR0 - SR14 */
983 sprintf (tempbuf, "SR%3d", i * 4);
984 expect (tempbuf);
985 for (j = 0; j < (i == 3 ? 3 : 4); j++)
986 sreg_buf[i * 4 + j] = get_hex_word ();
987 }
988 expect_prompt ();
989 /*
990 * Read the pcs individually if we are in freeze mode.
991 * See get_reg_name(), it translates the register names for the pcs to
992 * the names of the shadow pcs.
993 */
994 if (USE_SHADOW_PC)
995 {
996 sreg_buf[10] = read_register (NPC_REGNUM); /* pc0 */
997 sreg_buf[11] = read_register (PC_REGNUM); /* pc1 */
998 sreg_buf[12] = read_register (PC2_REGNUM); /* pc2 */
999 }
1000 for (i = 0; i < 14; i++) /* Supply vab -> lru */
1001 supply_register (VAB_REGNUM + i, (char *) &sreg_buf[i]);
1002 sprintf (tempbuf, "dw sr128\r");
1003 write (adapt_desc, tempbuf, strlen (tempbuf));
1004 for (i = 0; i < 2; i++)
1005 { /* SR128 - SR135 */
1006 sprintf (tempbuf, "SR%3d", 128 + i * 4);
1007 expect (tempbuf);
1008 for (j = 0; j < 4; j++)
1009 sreg_buf[i * 4 + j] = get_hex_word ();
1010 }
1011 expect_prompt ();
1012 supply_register (IPC_REGNUM, (char *) &sreg_buf[0]);
1013 supply_register (IPA_REGNUM, (char *) &sreg_buf[1]);
1014 supply_register (IPB_REGNUM, (char *) &sreg_buf[2]);
1015 supply_register (Q_REGNUM, (char *) &sreg_buf[3]);
1016 /* Skip ALU */
1017 supply_register (BP_REGNUM, (char *) &sreg_buf[5]);
1018 supply_register (FC_REGNUM, (char *) &sreg_buf[6]);
1019 supply_register (CR_REGNUM, (char *) &sreg_buf[7]);
1020
1021 /* There doesn't seem to be any way to get these. */
1022 {
1023 int val = -1;
1024 supply_register (FPE_REGNUM, (char *) &val);
1025 supply_register (INTE_REGNUM, (char *) &val);
1026 supply_register (FPS_REGNUM, (char *) &val);
1027 supply_register (EXO_REGNUM, (char *) &val);
1028 }
1029
1030 write (adapt_desc, "dw gr1,gr1\r", 11);
1031 expect ("GR001 ");
1032 get_hex_regs (1, GR1_REGNUM);
1033 expect_prompt ();
1034 }
1035
1036 /* Fetch register REGNO, or all registers if REGNO is -1.
1037 */
1038 static void
1039 adapt_fetch_register (int regno)
1040 {
1041 if (regno == -1)
1042 adapt_fetch_registers ();
1043 else
1044 {
1045 char *name = get_reg_name (regno);
1046 fprintf (adapt_stream, "dw %s,%s\r", name, name);
1047 expect (name);
1048 expect (" ");
1049 get_hex_regs (1, regno);
1050 expect_prompt ();
1051 }
1052 }
1053
1054 /* Store the remote registers from the contents of the block REGS. */
1055
1056 static void
1057 adapt_store_registers (void)
1058 {
1059 int i, j;
1060
1061 fprintf (adapt_stream, "s gr1,%x\r", read_register (GR1_REGNUM));
1062 expect_prompt ();
1063
1064 #if defined(GR64_REGNUM)
1065 for (j = 0; j < 32; j += 16)
1066 {
1067 fprintf (adapt_stream, "s gr%d,", j + 64);
1068 for (i = 0; i < 15; ++i)
1069 fprintf (adapt_stream, "%x,", read_register (GR64_REGNUM + j + i));
1070 fprintf (adapt_stream, "%x\r", read_register (GR64_REGNUM + j + 15));
1071 expect_prompt ();
1072 }
1073 #endif
1074 for (j = 0; j < 32; j += 16)
1075 {
1076 fprintf (adapt_stream, "s gr%d,", j + 96);
1077 for (i = 0; i < 15; ++i)
1078 fprintf (adapt_stream, "%x,", read_register (GR96_REGNUM + j + i));
1079 fprintf (adapt_stream, "%x\r", read_register (GR96_REGNUM + j + 15));
1080 expect_prompt ();
1081 }
1082
1083 for (j = 0; j < 128; j += 16)
1084 {
1085 fprintf (adapt_stream, "s lr%d,", j);
1086 for (i = 0; i < 15; ++i)
1087 fprintf (adapt_stream, "%x,", read_register (LR0_REGNUM + j + i));
1088 fprintf (adapt_stream, "%x\r", read_register (LR0_REGNUM + j + 15));
1089 expect_prompt ();
1090 }
1091
1092 fprintf (adapt_stream, "s sr128,%x,%x,%x\r", read_register (IPC_REGNUM),
1093 read_register (IPA_REGNUM), read_register (IPB_REGNUM));
1094 expect_prompt ();
1095 fprintf (adapt_stream, "s sr133,%x,%x,%x\r", read_register (BP_REGNUM),
1096 read_register (FC_REGNUM), read_register (CR_REGNUM));
1097 expect_prompt ();
1098 fprintf (adapt_stream, "s sr131,%x\r", read_register (Q_REGNUM));
1099 expect_prompt ();
1100 fprintf (adapt_stream, "s sr0,");
1101 for (i = 0; i < 7; ++i)
1102 fprintf (adapt_stream, "%x,", read_register (VAB_REGNUM + i));
1103 expect_prompt ();
1104 fprintf (adapt_stream, "s sr7,");
1105 for (i = 7; i < 14; ++i)
1106 fprintf (adapt_stream, "%x,", read_register (VAB_REGNUM + i));
1107 expect_prompt ();
1108 }
1109
1110 /* Store register REGNO, or all if REGNO == -1.
1111 Return errno value. */
1112 void
1113 adapt_store_register (int regno)
1114 {
1115 /* printf("adapt_store_register() called.\n"); fflush(stdout); /* */
1116 if (regno == -1)
1117 adapt_store_registers ();
1118 else
1119 {
1120 char *name = get_reg_name (regno);
1121 fprintf (adapt_stream, "s %s,%x\r", name, read_register (regno));
1122 /* Setting GR1 changes the numbers of all the locals, so
1123 invalidate the register cache. Do this *after* calling
1124 read_register, because we want read_register to return the
1125 value that write_register has just stuffed into the registers
1126 array, not the value of the register fetched from the
1127 inferior. */
1128 if (regno == GR1_REGNUM)
1129 registers_changed ();
1130 expect_prompt ();
1131 }
1132 }
1133
1134 /* Get ready to modify the registers array. On machines which store
1135 individual registers, this doesn't need to do anything. On machines
1136 which store all the registers in one fell swoop, this makes sure
1137 that registers contains all the registers from the program being
1138 debugged. */
1139
1140 void
1141 adapt_prepare_to_store (void)
1142 {
1143 /* Do nothing, since we can store individual regs */
1144 }
1145
1146 static CORE_ADDR
1147 translate_addr (CORE_ADDR addr)
1148 {
1149 #if defined(KERNEL_DEBUGGING)
1150 /* Check for a virtual address in the kernel */
1151 /* Assume physical address of ublock is in paddr_u register */
1152 if (addr >= UVADDR)
1153 {
1154 /* PADDR_U register holds the physical address of the ublock */
1155 CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
1156 return (i + addr - (CORE_ADDR) UVADDR);
1157 }
1158 else
1159 {
1160 return (addr);
1161 }
1162 #else
1163 return (addr);
1164 #endif
1165 }
1166
1167
1168 /* FIXME! Merge these two. */
1169 int
1170 adapt_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
1171 struct mem_attrib *attrib ATTRIBUTE_UNUSED,
1172 struct target_ops *target ATTRIBUTE_UNUSED)
1173 {
1174
1175 memaddr = translate_addr (memaddr);
1176
1177 if (write)
1178 return adapt_write_inferior_memory (memaddr, myaddr, len);
1179 else
1180 return adapt_read_inferior_memory (memaddr, myaddr, len);
1181 }
1182
1183 void
1184 adapt_files_info (void)
1185 {
1186 printf_filtered ("\tAttached to %s at %d baud and running program %s\n",
1187 dev_name, baudrate, prog_name);
1188 printf_filtered ("\ton an %s processor.\n", processor_name[processor_type]);
1189 }
1190
1191 /* Copy LEN bytes of data from debugger memory at MYADDR
1192 to inferior's memory at MEMADDR. Returns errno value.
1193 * sb/sh instructions don't work on unaligned addresses, when TU=1.
1194 */
1195 int
1196 adapt_write_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
1197 {
1198 int i;
1199 unsigned int cps;
1200
1201 /* Turn TU bit off so we can do 'sb' commands */
1202 cps = read_register (CPS_REGNUM);
1203 if (cps & 0x00000800)
1204 write_register (CPS_REGNUM, cps & ~(0x00000800));
1205
1206 for (i = 0; i < len; i++)
1207 {
1208 if ((i % 16) == 0)
1209 fprintf (adapt_stream, "sb %x,", memaddr + i);
1210 if ((i % 16) == 15 || i == len - 1)
1211 {
1212 fprintf (adapt_stream, "%x\r", ((unsigned char *) myaddr)[i]);
1213 expect_prompt ();
1214 }
1215 else
1216 fprintf (adapt_stream, "%x,", ((unsigned char *) myaddr)[i]);
1217 }
1218 /* Restore the old value of cps if the TU bit was on */
1219 if (cps & 0x00000800)
1220 write_register (CPS_REGNUM, cps);
1221 return len;
1222 }
1223
1224 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
1225 at debugger address MYADDR. Returns errno value. */
1226 int
1227 adapt_read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
1228 {
1229 int i;
1230
1231 /* Number of bytes read so far. */
1232 int count;
1233
1234 /* Starting address of this pass. */
1235 unsigned long startaddr;
1236
1237 /* Number of bytes to read in this pass. */
1238 int len_this_pass;
1239
1240 /* Note that this code works correctly if startaddr is just less
1241 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
1242 thing). That is, something like
1243 adapt_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
1244 works--it never adds len to memaddr and gets 0. */
1245 /* However, something like
1246 adapt_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
1247 doesn't need to work. Detect it and give up if there's an attempt
1248 to do that. */
1249
1250 if (((memaddr - 1) + len) < memaddr)
1251 return EIO;
1252
1253 startaddr = memaddr;
1254 count = 0;
1255 while (count < len)
1256 {
1257 len_this_pass = 16;
1258 if ((startaddr % 16) != 0)
1259 len_this_pass -= startaddr % 16;
1260 if (len_this_pass > (len - count))
1261 len_this_pass = (len - count);
1262
1263 fprintf (adapt_stream, "db %x,%x\r", startaddr,
1264 (startaddr - 1) + len_this_pass);
1265
1266 #ifdef NOTDEF /* Why do this */
1267 expect ("\n");
1268 /* Look for 8 hex digits. */
1269 i = 0;
1270 while (1)
1271 {
1272 if (isxdigit (readchar ()))
1273 ++i;
1274 else
1275 {
1276 expect_prompt ();
1277 error ("Hex digit expected from remote system.");
1278 }
1279 if (i >= 8)
1280 break;
1281 }
1282 #endif /* NOTDEF */
1283
1284 expect (" ");
1285
1286 for (i = 0; i < len_this_pass; i++)
1287 get_hex_byte (&myaddr[count++]);
1288
1289 expect_prompt ();
1290
1291 startaddr += len_this_pass;
1292 }
1293 return count;
1294 }
1295
1296 #define MAX_BREAKS 8
1297 static int num_brkpts = 0;
1298
1299 /* Insert a breakpoint at ADDR. SAVE is normally the address of the
1300 pattern buffer where the instruction that the breakpoint overwrites
1301 is saved. It is unused here since the Adapt Monitor is responsible
1302 for saving/restoring the original instruction. */
1303
1304 static int
1305 adapt_insert_breakpoint (CORE_ADDR addr, char *save)
1306 {
1307 if (num_brkpts < MAX_BREAKS)
1308 {
1309 num_brkpts++;
1310 fprintf (adapt_stream, "B %x", addr);
1311 fprintf (adapt_stream, "\r");
1312 expect_prompt ();
1313 return (0); /* Success */
1314 }
1315 else
1316 {
1317 fprintf_filtered (gdb_stderr,
1318 "Too many break points, break point not installed\n");
1319 return (1); /* Failure */
1320 }
1321
1322 }
1323
1324 /* Remove a breakpoint at ADDR. SAVE is normally the previously
1325 saved pattern, but is unused here as the Adapt Monitor is
1326 responsible for saving/restoring instructions. */
1327
1328 static int
1329 adapt_remove_breakpoint (CORE_ADDR addr, char *save)
1330 {
1331 if (num_brkpts > 0)
1332 {
1333 num_brkpts--;
1334 fprintf (adapt_stream, "BR %x", addr);
1335 fprintf (adapt_stream, "\r");
1336 fflush (adapt_stream);
1337 expect_prompt ();
1338 }
1339 return (0);
1340 }
1341
1342 /* Clear the adapts notion of what the break points are */
1343 static int
1344 adapt_clear_breakpoints (void)
1345 {
1346 if (adapt_stream)
1347 {
1348 fprintf (adapt_stream, "BR"); /* Clear all break points */
1349 fprintf (adapt_stream, "\r");
1350 fflush (adapt_stream);
1351 expect_prompt ();
1352 }
1353 num_brkpts = 0;
1354 }
1355 static void
1356 adapt_mourn (void)
1357 {
1358 adapt_clear_breakpoints ();
1359 pop_target (); /* Pop back to no-child state */
1360 generic_mourn_inferior ();
1361 }
1362
1363 /* Display everthing we read in from the adapt until we match/see the
1364 * specified string
1365 */
1366 static int
1367 display_until (char *str)
1368 {
1369 int i = 0, j, c;
1370
1371 while (c = readchar ())
1372 {
1373 if (c == str[i])
1374 {
1375 i++;
1376 if (i == strlen (str))
1377 return;
1378 }
1379 else
1380 {
1381 if (i)
1382 {
1383 for (j = 0; j < i; j++) /* Put everthing we matched */
1384 putchar (str[j]);
1385 i = 0;
1386 }
1387 putchar (c);
1388 }
1389 }
1390
1391 }
1392
1393
1394 /* Put a command string, in args, out to the adapt. The adapt is assumed to
1395 be in raw mode, all writing/reading done through adapt_desc.
1396 Ouput from the adapt is placed on the users terminal until the
1397 prompt from the adapt is seen.
1398 FIXME: Can't handle commands that take input. */
1399
1400 void
1401 adapt_com (char *args, int fromtty)
1402 {
1403 if (!adapt_stream)
1404 {
1405 printf_filtered ("Adapt not open. Use the 'target' command to open.\n");
1406 return;
1407 }
1408
1409 /* Clear all input so only command relative output is displayed */
1410 slurp_input ();
1411
1412 switch (islower (args[0]) ? toupper (args[0]) : args[0])
1413 {
1414 default:
1415 printf_filtered ("Unknown/Unimplemented adapt command '%s'\n", args);
1416 break;
1417 case 'G': /* Go, begin execution */
1418 write (adapt_desc, args, strlen (args));
1419 write (adapt_desc, "\r", 1);
1420 expect_prompt ();
1421 break;
1422 case 'B': /* Break points, B or BR */
1423 case 'C': /* Check current 29k status (running/halted) */
1424 case 'D': /* Display data/registers */
1425 case 'I': /* Input from i/o space */
1426 case 'J': /* Jam an instruction */
1427 case 'K': /* Kill, stop execution */
1428 case 'L': /* Disassemble */
1429 case 'O': /* Output to i/o space */
1430 case 'T': /* Trace */
1431 case 'P': /* Pulse an input line */
1432 case 'X': /* Examine special purpose registers */
1433 case 'Z': /* Display trace buffer */
1434 write (adapt_desc, args, strlen (args));
1435 write (adapt_desc, "\r", 1);
1436 expect (args); /* Don't display the command */
1437 display_until ("# ");
1438 break;
1439 /* Begin commands that take input in the form 'c x,y[,z...]' */
1440 case 'S': /* Set memory or register */
1441 if (strchr (args, ','))
1442 { /* Assume it is properly formatted */
1443 write (adapt_desc, args, strlen (args));
1444 write (adapt_desc, "\r", 1);
1445 expect_prompt ();
1446 }
1447 break;
1448 }
1449 }
1450
1451 /* Define the target subroutine names */
1452
1453 struct target_ops adapt_ops;
1454
1455 static void
1456 init_adapt_ops (void)
1457 {
1458 adapt_ops.to_shortname = "adapt";
1459 adapt_ops.to_longname = "Remote AMD `Adapt' target";
1460 adapt_ops.to_doc = "Remote debug an AMD 290*0 using an `Adapt' monitor via RS232";
1461 adapt_ops.to_open = adapt_open;
1462 adapt_ops.to_close = adapt_close;
1463 adapt_ops.to_attach = adapt_attach;
1464 adapt_ops.to_post_attach = NULL;
1465 adapt_ops.to_require_attach = NULL;
1466 adapt_ops.to_detach = adapt_detach;
1467 adapt_ops.to_require_detach = NULL;
1468 adapt_ops.to_resume = adapt_resume;
1469 adapt_ops.to_wait = adapt_wait;
1470 adapt_ops.to_post_wait = NULL;
1471 adapt_ops.to_fetch_registers = adapt_fetch_register;
1472 adapt_ops.to_store_registers = adapt_store_register;
1473 adapt_ops.to_prepare_to_store = adapt_prepare_to_store;
1474 adapt_ops.to_xfer_memory = adapt_xfer_inferior_memory;
1475 adapt_ops.to_files_info = adapt_files_info;
1476 adapt_ops.to_insert_breakpoint = adapt_insert_breakpoint;
1477 adapt_ops.to_remove_breakpoint = adapt_remove_breakpoint;
1478 adapt_ops.to_terminal_init = 0;
1479 adapt_ops.to_terminal_inferior = 0;
1480 adapt_ops.to_terminal_ours_for_output = 0;
1481 adapt_ops.to_terminal_ours = 0;
1482 adapt_ops.to_terminal_info = 0;
1483 adapt_ops.to_kill = adapt_kill;
1484 adapt_ops.to_load = adapt_load;
1485 adapt_ops.to_lookup_symbol = 0;
1486 adapt_ops.to_create_inferior = adapt_create_inferior;
1487 adapt_ops.to_post_startup_inferior = NULL;
1488 adapt_ops.to_acknowledge_created_inferior = NULL;
1489 adapt_ops.to_clone_and_follow_inferior = NULL;
1490 adapt_ops.to_post_follow_inferior_by_clone = NULL;
1491 adapt_ops.to_insert_fork_catchpoint = NULL;
1492 adapt_ops.to_remove_fork_catchpoint = NULL;
1493 adapt_ops.to_insert_vfork_catchpoint = NULL;
1494 adapt_ops.to_remove_vfork_catchpoint = NULL;
1495 adapt_ops.to_has_forked = NULL;
1496 adapt_ops.to_has_vforked = NULL;
1497 adapt_ops.to_can_follow_vfork_prior_to_exec = NULL;
1498 adapt_ops.to_post_follow_vfork = NULL;
1499 adapt_ops.to_insert_exec_catchpoint = NULL;
1500 adapt_ops.to_remove_exec_catchpoint = NULL;
1501 adapt_ops.to_has_execd = NULL;
1502 adapt_ops.to_reported_exec_events_per_exec_call = NULL;
1503 adapt_ops.to_has_exited = NULL;
1504 adapt_ops.to_mourn_inferior = adapt_mourn;
1505 adapt_ops.to_can_run = 0;
1506 adapt_ops.to_notice_signals = 0;
1507 adapt_ops.to_thread_alive = 0;
1508 adapt_ops.to_stop = 0; /* process_stratum; */
1509 adapt_ops.to_pid_to_exec_file = NULL;
1510 adapt_ops.to_core_file_to_sym_file = NULL;
1511 adapt_ops.to_stratum = 0;
1512 adapt_ops.DONT_USE = 0;
1513 adapt_ops.to_has_all_memory = 1;
1514 adapt_ops.to_has_memory = 1;
1515 adapt_ops.to_has_stack = 1;
1516 adapt_ops.to_has_registers = 1;
1517 adapt_ops.to_has_execution = 0;
1518 adapt_ops.to_sections = 0;
1519 adapt_ops.to_sections_end = 0;
1520 adapt_ops.to_magic = OPS_MAGIC;
1521 } /* init_adapt_ops */
1522
1523 void
1524 _initialize_remote_adapt (void)
1525 {
1526 init_adapt_ops ();
1527 add_target (&adapt_ops);
1528 add_com ("adapt <command>", class_obscure, adapt_com,
1529 "Send a command to the AMD Adapt remote monitor.");
1530 }
This page took 0.062079 seconds and 4 git commands to generate.