1 /* Remote debugging interface for AMD 290*0 Adapt Monitor Version 2.1d18.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
3 2001 Free Software Foundation, Inc.
5 Adapted from work done at Cygnus Support in remote-eb.c.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
24 /* This is like remote.c but is for an esoteric situation--
25 having a 29k board attached to an Adapt inline monitor.
26 The monitor is connected via serial line to a unix machine
29 3/91 - developed on Sun3 OS 4.1, by David Wood
30 o - I can't get binary coff to load.
31 o - I can't get 19200 baud rate to work.
32 7/91 o - Freeze mode tracing can be done on a 29050. */
37 #include "gdb_string.h"
49 /* This processor is getting rusty but I am trying to keep it
50 up to date at least with data structure changes.
51 Activate this block to compile just this file.
53 #define COMPILE_CHECK 0
78 extern int a29k_freeze_mode;
79 extern int processor_type;
80 extern char *processor_name;
83 /* External data declarations */
84 extern int stop_soon_quietly; /* for wait_for_inferior */
86 /* Forward data declarations */
87 extern struct target_ops adapt_ops; /* Forward declaration */
89 /* Forward function declarations */
90 static void adapt_fetch_registers ();
91 static void adapt_store_registers ();
92 static void adapt_close ();
93 static int adapt_clear_breakpoints ();
95 #define FREEZE_MODE (read_register(CPS_REGNUM) && 0x400)
96 #define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
98 /* Can't seem to get binary coff working */
99 #define ASCII_COFF /* Adapt will be downloaded with ascii coff */
101 /* FIXME: Replace with `set remotedebug'. */
102 #define LOG_FILE "adapt.log"
103 #if defined (LOG_FILE)
104 FILE *log_file = NULL;
107 static int timeout = 5;
108 static char *dev_name;
110 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
111 adapt_open knows that we don't have a file open when the program
115 /* stream which is fdopen'd from adapt_desc. Only valid when
122 rawmode (int desc, int turnon)
130 ioctl (desc, TIOCGETP, &sg);
135 sg.c_lflag &= ~(ICANON);
143 sg.c_lflag |= ICANON;
145 sg.sg_flags &= ~(RAW);
148 ioctl (desc, TIOCSETP, &sg);
151 /* Suck up all the input from the adapt */
157 /* termio does the timeout for us. */
158 while (read (adapt_desc, buf, 8) > 0);
161 while (read (adapt_desc, buf, 8) > 0);
166 /* Read a character from the remote system, doing all the fancy
175 /* termio does the timeout for us. */
176 read (adapt_desc, &buf, 1);
179 if (read (adapt_desc, &buf, 1) < 0)
182 error ("Timeout reading from remote system.");
184 perror_with_name ("remote");
190 error ("Timeout reading from remote system.");
191 #if defined (LOG_FILE)
192 putc (buf & 0x7f, log_file);
197 /* Keep discarding input from the remote system, until STRING is found.
198 Let the user break out immediately. */
200 expect (char *string)
204 fflush (adapt_stream);
208 if (readchar () == *p)
222 /* Keep discarding input until we see the adapt prompt.
224 The convention for dealing with the prompt is that you
226 o *then* wait for the prompt.
228 Thus the last thing that a procedure does with the serial line
229 will be an expect_prompt(). Exception: adapt_resume does not
230 wait for the prompt, because the terminal is being handed over
231 to the inferior. However, the next thing which happens after that
232 is a adapt_wait which does wait for the prompt.
233 Note that this includes abnormal exit, e.g. error(). This is
234 necessary to prevent getting into states from which we can't
239 #if defined (LOG_FILE)
240 /* This is a convenient place to do this. The idea is to do it often
241 enough that we never lose much data if we terminate abnormally. */
244 fflush (adapt_stream);
248 /* Get a hex digit from the remote system & return its value.
249 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
251 get_hex_digit (int ignore_space)
257 if (ch >= '0' && ch <= '9')
259 else if (ch >= 'A' && ch <= 'F')
260 return ch - 'A' + 10;
261 else if (ch >= 'a' && ch <= 'f')
262 return ch - 'a' + 10;
263 else if (ch == ' ' && ignore_space)
268 error ("Invalid hex digit from remote system.");
273 /* Get a byte from adapt_desc and put it in *BYT. Accept any number
276 get_hex_byte (char *byt)
280 val = get_hex_digit (1) << 4;
281 val |= get_hex_digit (0);
285 /* Read a 32-bit hex word from the adapt, preceded by a space */
293 for (j = 0; j < 8; j++)
294 val = (val << 4) + get_hex_digit (j == 0);
297 /* Get N 32-bit hex words from remote, each preceded by a space
298 and put them in registers starting at REGNO. */
300 get_hex_regs (int n, int regno)
305 val = get_hex_word ();
306 supply_register (regno++, (char *) &val);
309 /* Called when SIGALRM signal sent due to alarm() timeout. */
318 volatile int n_alarms;
325 printf ("adapt_timer called\n");
331 /* malloc'd name of the program on the remote system. */
332 static char *prog_name = NULL;
334 /* Number of SIGTRAPs we need to simulate. That is, the next
335 NEED_ARTIFICIAL_TRAP calls to adapt_wait should just return
336 SIGTRAP without actually waiting for anything. */
338 static int need_artificial_trap = 0;
341 adapt_kill (char *arg, int from_tty)
343 fprintf (adapt_stream, "K");
344 fprintf (adapt_stream, "\r");
348 * Download a file specified in 'args', to the adapt.
349 * FIXME: Assumes the file to download is a binary coff file.
352 adapt_load (char *args, int fromtty)
360 printf_filtered ("Adapt not open. Use 'target' command to open adapt\n");
364 /* OK, now read in the file. Y=read, C=COFF, T=dTe port
367 #ifdef ASCII_COFF /* Ascii coff */
368 fprintf (adapt_stream, "YA T,0\r");
369 fflush (adapt_stream); /* Just in case */
370 /* FIXME: should check args for only 1 argument */
371 sprintf (buffer, "cat %s | btoa > /tmp/#adapt-btoa", args);
373 fp = fopen ("/tmp/#adapt-btoa", "r");
374 rawmode (adapt_desc, OFF);
375 while (n = fread (buffer, 1, 1024, fp))
379 n -= write (adapt_desc, buffer, n);
384 perror ("writing ascii coff");
389 rawmode (adapt_desc, ON);
390 system ("rm /tmp/#adapt-btoa");
391 #else /* Binary coff - can't get it to work . */
392 fprintf (adapt_stream, "YC T,0\r");
393 fflush (adapt_stream); /* Just in case */
394 if (!(fp = fopen (args, "r")))
396 printf_filtered ("Can't open %s\n", args);
399 while (n = fread (buffer, 1, 512, fp))
403 n -= write (adapt_desc, buffer, n);
408 perror ("writing ascii coff");
414 expect_prompt (); /* Skip garbage that comes out */
415 fprintf (adapt_stream, "\r");
419 /* This is called not only when we first attach, but also when the
420 user types "run" after having attached. */
422 adapt_create_inferior (char *execfile, char *args, char **env)
427 error ("Can't pass arguments to remote adapt process.");
429 if (execfile == 0 || exec_bfd == 0)
430 error ("No executable file specified");
432 entry_pt = (int) bfd_get_start_address (exec_bfd);
436 adapt_kill (NULL, NULL);
437 adapt_clear_breakpoints ();
438 init_wait_for_inferior ();
439 /* Clear the input because what the adapt sends back is different
440 * depending on whether it was running or not.
442 slurp_input (); /* After this there should be a prompt */
443 fprintf (adapt_stream, "\r");
445 printf_filtered ("Do you want to download '%s' (y/n)? [y] : ", prog_name);
451 adapt_load (prog_name, 0);
456 /* Set the PC and wait for a go/cont */
457 fprintf (adapt_stream, "G %x,N\r", entry_pt);
458 printf_filtered ("Now use the 'continue' command to start.\n");
461 insert_breakpoints (); /* Needed to get correct instruction in cache */
462 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
468 printf_filtered ("Adapt not open yet.\n");
472 /* Translate baud rates from integers to damn B_codes. Unix should
473 have outgrown this crap years ago, but even POSIX wouldn't buck it. */
563 for (i = 0; baudtab[i].rate != -1; i++)
564 if (rate == baudtab[i].rate)
565 return baudtab[i].damn_b;
566 return B38400; /* Random */
570 /* Open a connection to a remote debugger.
571 NAME is the filename used for communication, then a space,
575 static int baudrate = 9600;
577 adapt_open (char *name, int from_tty)
583 /* Find the first whitespace character, it separates dev_name from
589 *p != '\0' && !isspace (*p); p++)
594 Please include the name of the device for the serial port,\n\
595 the baud rate, and the name of the program to run on the remote system.");
596 dev_name = (char *) xmalloc (p - name + 1);
597 strncpy (dev_name, name, p - name);
598 dev_name[p - name] = '\0';
600 /* Skip over the whitespace after dev_name */
601 for (; isspace (*p); p++)
604 if (1 != sscanf (p, "%d ", &baudrate))
607 /* Skip the number and then the spaces */
608 for (; isdigit (*p); p++)
610 for (; isspace (*p); p++)
613 if (prog_name != NULL)
615 prog_name = savestring (p, strlen (p));
619 adapt_desc = open (dev_name, O_RDWR);
621 perror_with_name (dev_name);
622 ioctl (adapt_desc, TIOCGETP, &sg);
623 #if ! defined(COMPILE_CHECK)
625 sg.c_cc[VMIN] = 0; /* read with timeout. */
626 sg.c_cc[VTIME] = timeout * 10;
627 sg.c_lflag &= ~(ICANON | ECHO);
628 sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
630 sg.sg_ispeed = damn_b (baudrate);
631 sg.sg_ospeed = damn_b (baudrate);
632 sg.sg_flags |= RAW | ANYP;
633 sg.sg_flags &= ~ECHO;
636 ioctl (adapt_desc, TIOCSETP, &sg);
637 adapt_stream = fdopen (adapt_desc, "r+");
638 #endif /* compile_check */
639 push_target (&adapt_ops);
642 #ifndef NO_SIGINTERRUPT
643 /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
645 if (siginterrupt (SIGALRM, 1) != 0)
646 perror ("adapt_open: error in siginterrupt");
649 /* Set up read timeout timer. */
650 if ((void (*)) signal (SIGALRM, adapt_timer) == (void (*)) -1)
651 perror ("adapt_open: error in signal");
654 #if defined (LOG_FILE)
655 log_file = fopen (LOG_FILE, "w");
656 if (log_file == NULL)
657 perror_with_name (LOG_FILE);
660 /* Put this port into NORMAL mode, send the 'normal' character */
661 write (adapt_desc, "
\ 1", 1); /* Control A */
662 write (adapt_desc, "\r", 1);
665 /* Hello? Are you there? */
666 write (adapt_desc, "\r", 1);
670 /* Clear any break points */
671 adapt_clear_breakpoints ();
673 /* Print out some stuff, letting the user now what's going on */
674 printf_filtered ("Connected to an Adapt via %s.\n", dev_name);
675 /* FIXME: can this restriction be removed? */
676 printf_filtered ("Remote debugging using virtual addresses works only\n");
677 printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n");
678 if (processor_type != a29k_freeze_mode)
680 fprintf_filtered (gdb_stderr,
681 "Freeze-mode debugging not available, and can only be done on an A29050.\n");
685 /* Close out all files and local state before this target loses control. */
688 adapt_close (int quitting)
691 /* Clear any break points */
692 adapt_clear_breakpoints ();
694 /* Put this port back into REMOTE mode */
697 fflush (adapt_stream);
698 sleep (1); /* Let any output make it all the way back */
699 write (adapt_desc, "R\r", 2);
702 /* Due to a bug in Unix, fclose closes not only the stdio stream,
703 but also the file descriptor. So we don't actually close
706 fclose (adapt_stream); /* This also closes adapt_desc */
708 /* close (adapt_desc); */
710 /* Do not try to close adapt_desc again, later in the program. */
714 #if defined (LOG_FILE)
717 if (ferror (log_file))
718 printf_filtered ("Error writing log file.\n");
719 if (fclose (log_file) != 0)
720 printf_filtered ("Error closing log file.\n");
726 /* Attach to the target that is already loaded and possibly running */
728 adapt_attach (char *args, int from_tty)
732 printf_filtered ("Attaching to remote program %s.\n", prog_name);
734 /* Send the adapt a kill. It is ok if it is not already running */
735 fprintf (adapt_stream, "K\r");
736 fflush (adapt_stream);
737 expect_prompt (); /* Slurp the echo */
741 /* Terminate the open connection to the remote debugger.
742 Use this when you want to detach and do something else
745 adapt_detach (char *args, int from_tty)
749 { /* Send it on its way (tell it to continue) */
750 adapt_clear_breakpoints ();
751 fprintf (adapt_stream, "G\r");
754 pop_target (); /* calls adapt_close to do the real work */
756 printf_filtered ("Ending remote %s debugging\n", target_shortname);
759 /* Tell the remote machine to resume. */
762 adapt_resume (int pid, int step, enum target_signal sig)
766 write (adapt_desc, "t 1,s\r", 6);
767 /* Wait for the echo. */
768 expect ("t 1,s\r\n");
769 /* Then comes a line containing the instruction we stepped to. */
771 /* Then we get the prompt. */
774 /* Force the next adapt_wait to return a trap. Not doing anything
775 about I/O from the target means that the user has to type
776 "continue" to see any. FIXME, this should be fixed. */
777 need_artificial_trap = 1;
781 write (adapt_desc, "G\r", 2);
782 /* Swallow the echo. */
787 /* Wait until the remote machine stops, then return,
788 storing status in STATUS just as `wait' would. */
791 adapt_wait (struct target_waitstatus *status)
793 /* Strings to look for. '?' means match any single character.
794 Note that with the algorithm we use, the initial character
795 of the string cannot recur in the string, or we will not
796 find some cases of the string in the input. */
798 static char bpt[] = "@";
799 /* It would be tempting to look for "\n[__exit + 0x8]\n"
800 but that requires loading symbols with "yc i" and even if
801 we did do that we don't know that the file has symbols. */
802 static char exitmsg[] = "@????????I JMPTI GR121,LR0";
806 /* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars. */
808 /* Current position in swallowed. */
809 char *swallowed_p = swallowed;
813 int old_timeout = timeout;
814 int old_immediate_quit = immediate_quit;
816 status->kind = TARGET_WAITKIND_EXITED;
817 status->value.integer = 0;
819 if (need_artificial_trap != 0)
821 status->kind = TARGET_WAITKIND_STOPPED;
822 status->value.sig = TARGET_SIGNAL_TRAP;
823 need_artificial_trap--;
827 timeout = 0; /* Don't time out -- user program is running. */
828 immediate_quit = 1; /* Helps ability to QUIT */
831 QUIT; /* Let user quit and leave process running */
845 if (ch == *ep || *ep == '?')
860 /* Print out any characters which have been swallowed. */
861 for (p = swallowed; p < swallowed_p; ++p)
863 swallowed_p = swallowed;
870 status->kind = TARGET_WAITKIND_STOPPED;
871 status->value.sig = TARGET_SIGNAL_TRAP;
875 status->kind = TARGET_WAITKIND_EXITED;
876 status->value.integer = 0;
878 timeout = old_timeout;
879 immediate_quit = old_immediate_quit;
883 /* Return the name of register number REGNO
884 in the form input and output by adapt.
886 Returns a pointer to a static buffer containing the answer. */
888 get_reg_name (int regno)
891 if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
892 sprintf (buf, "GR%03d", regno - GR96_REGNUM + 96);
893 #if defined(GR64_REGNUM)
894 else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
895 sprintf (buf, "GR%03d", regno - GR64_REGNUM + 64);
897 else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
898 sprintf (buf, "LR%03d", regno - LR0_REGNUM);
899 else if (regno == Q_REGNUM)
900 strcpy (buf, "SR131");
901 else if (regno >= BP_REGNUM && regno <= CR_REGNUM)
902 sprintf (buf, "SR%03d", regno - BP_REGNUM + 133);
903 else if (regno == ALU_REGNUM)
904 strcpy (buf, "SR132");
905 else if (regno >= IPC_REGNUM && regno <= IPB_REGNUM)
906 sprintf (buf, "SR%03d", regno - IPC_REGNUM + 128);
907 else if (regno >= VAB_REGNUM && regno <= LRU_REGNUM)
909 /* When a 29050 is in freeze-mode, read shadow pcs instead */
910 if ((regno >= NPC_REGNUM && regno <= PC2_REGNUM) && USE_SHADOW_PC)
911 sprintf (buf, "SR%03d", regno - NPC_REGNUM + 20);
913 sprintf (buf, "SR%03d", regno - VAB_REGNUM);
915 else if (regno == GR1_REGNUM)
916 strcpy (buf, "GR001");
920 /* Read the remote registers. */
923 adapt_fetch_registers (void)
934 #if defined(GR64_REGNUM)
935 write (adapt_desc, "dw gr64,gr95\r", 13);
936 for (reg_index = 64, regnum_index = GR64_REGNUM;
938 reg_index += 4, regnum_index += 4)
940 sprintf (tempbuf, "GR%03d ", reg_index);
942 get_hex_regs (4, regnum_index);
946 write (adapt_desc, "dw gr96,gr127\r", 14);
947 for (reg_index = 96, regnum_index = GR96_REGNUM;
949 reg_index += 4, regnum_index += 4)
951 sprintf (tempbuf, "GR%03d ", reg_index);
953 get_hex_regs (4, regnum_index);
960 for (i = 0; i < 128; i += 32)
962 /* The PC has a tendency to hang if we get these
963 all in one fell swoop ("dw lr0,lr127"). */
964 sprintf (tempbuf, "dw lr%d\r", i);
965 write (adapt_desc, tempbuf, strlen (tempbuf));
966 for (reg_index = i, regnum_index = LR0_REGNUM + i;
968 reg_index += 4, regnum_index += 4)
970 sprintf (tempbuf, "LR%03d ", reg_index);
972 get_hex_regs (4, regnum_index);
980 sprintf (tempbuf, "dw sr0\r");
981 write (adapt_desc, tempbuf, strlen (tempbuf));
982 for (i = 0; i < 4; i++)
984 sprintf (tempbuf, "SR%3d", i * 4);
986 for (j = 0; j < (i == 3 ? 3 : 4); j++)
987 sreg_buf[i * 4 + j] = get_hex_word ();
991 * Read the pcs individually if we are in freeze mode.
992 * See get_reg_name(), it translates the register names for the pcs to
993 * the names of the shadow pcs.
997 sreg_buf[10] = read_register (NPC_REGNUM); /* pc0 */
998 sreg_buf[11] = read_register (PC_REGNUM); /* pc1 */
999 sreg_buf[12] = read_register (PC2_REGNUM); /* pc2 */
1001 for (i = 0; i < 14; i++) /* Supply vab -> lru */
1002 supply_register (VAB_REGNUM + i, (char *) &sreg_buf[i]);
1003 sprintf (tempbuf, "dw sr128\r");
1004 write (adapt_desc, tempbuf, strlen (tempbuf));
1005 for (i = 0; i < 2; i++)
1006 { /* SR128 - SR135 */
1007 sprintf (tempbuf, "SR%3d", 128 + i * 4);
1009 for (j = 0; j < 4; j++)
1010 sreg_buf[i * 4 + j] = get_hex_word ();
1013 supply_register (IPC_REGNUM, (char *) &sreg_buf[0]);
1014 supply_register (IPA_REGNUM, (char *) &sreg_buf[1]);
1015 supply_register (IPB_REGNUM, (char *) &sreg_buf[2]);
1016 supply_register (Q_REGNUM, (char *) &sreg_buf[3]);
1018 supply_register (BP_REGNUM, (char *) &sreg_buf[5]);
1019 supply_register (FC_REGNUM, (char *) &sreg_buf[6]);
1020 supply_register (CR_REGNUM, (char *) &sreg_buf[7]);
1022 /* There doesn't seem to be any way to get these. */
1025 supply_register (FPE_REGNUM, (char *) &val);
1026 supply_register (INTE_REGNUM, (char *) &val);
1027 supply_register (FPS_REGNUM, (char *) &val);
1028 supply_register (EXO_REGNUM, (char *) &val);
1031 write (adapt_desc, "dw gr1,gr1\r", 11);
1033 get_hex_regs (1, GR1_REGNUM);
1037 /* Fetch register REGNO, or all registers if REGNO is -1.
1040 adapt_fetch_register (int regno)
1043 adapt_fetch_registers ();
1046 char *name = get_reg_name (regno);
1047 fprintf (adapt_stream, "dw %s,%s\r", name, name);
1050 get_hex_regs (1, regno);
1055 /* Store the remote registers from the contents of the block REGS. */
1058 adapt_store_registers (void)
1062 fprintf (adapt_stream, "s gr1,%x\r", read_register (GR1_REGNUM));
1065 #if defined(GR64_REGNUM)
1066 for (j = 0; j < 32; j += 16)
1068 fprintf (adapt_stream, "s gr%d,", j + 64);
1069 for (i = 0; i < 15; ++i)
1070 fprintf (adapt_stream, "%x,", read_register (GR64_REGNUM + j + i));
1071 fprintf (adapt_stream, "%x\r", read_register (GR64_REGNUM + j + 15));
1075 for (j = 0; j < 32; j += 16)
1077 fprintf (adapt_stream, "s gr%d,", j + 96);
1078 for (i = 0; i < 15; ++i)
1079 fprintf (adapt_stream, "%x,", read_register (GR96_REGNUM + j + i));
1080 fprintf (adapt_stream, "%x\r", read_register (GR96_REGNUM + j + 15));
1084 for (j = 0; j < 128; j += 16)
1086 fprintf (adapt_stream, "s lr%d,", j);
1087 for (i = 0; i < 15; ++i)
1088 fprintf (adapt_stream, "%x,", read_register (LR0_REGNUM + j + i));
1089 fprintf (adapt_stream, "%x\r", read_register (LR0_REGNUM + j + 15));
1093 fprintf (adapt_stream, "s sr128,%x,%x,%x\r", read_register (IPC_REGNUM),
1094 read_register (IPA_REGNUM), read_register (IPB_REGNUM));
1096 fprintf (adapt_stream, "s sr133,%x,%x,%x\r", read_register (BP_REGNUM),
1097 read_register (FC_REGNUM), read_register (CR_REGNUM));
1099 fprintf (adapt_stream, "s sr131,%x\r", read_register (Q_REGNUM));
1101 fprintf (adapt_stream, "s sr0,");
1102 for (i = 0; i < 7; ++i)
1103 fprintf (adapt_stream, "%x,", read_register (VAB_REGNUM + i));
1105 fprintf (adapt_stream, "s sr7,");
1106 for (i = 7; i < 14; ++i)
1107 fprintf (adapt_stream, "%x,", read_register (VAB_REGNUM + i));
1111 /* Store register REGNO, or all if REGNO == -1.
1112 Return errno value. */
1114 adapt_store_register (int regno)
1116 /* printf("adapt_store_register() called.\n"); fflush(stdout); /* */
1118 adapt_store_registers ();
1121 char *name = get_reg_name (regno);
1122 fprintf (adapt_stream, "s %s,%x\r", name, read_register (regno));
1123 /* Setting GR1 changes the numbers of all the locals, so
1124 invalidate the register cache. Do this *after* calling
1125 read_register, because we want read_register to return the
1126 value that write_register has just stuffed into the registers
1127 array, not the value of the register fetched from the
1129 if (regno == GR1_REGNUM)
1130 registers_changed ();
1135 /* Get ready to modify the registers array. On machines which store
1136 individual registers, this doesn't need to do anything. On machines
1137 which store all the registers in one fell swoop, this makes sure
1138 that registers contains all the registers from the program being
1142 adapt_prepare_to_store (void)
1144 /* Do nothing, since we can store individual regs */
1148 translate_addr (CORE_ADDR addr)
1150 #if defined(KERNEL_DEBUGGING)
1151 /* Check for a virtual address in the kernel */
1152 /* Assume physical address of ublock is in paddr_u register */
1155 /* PADDR_U register holds the physical address of the ublock */
1156 CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
1157 return (i + addr - (CORE_ADDR) UVADDR);
1169 /* FIXME! Merge these two. */
1171 adapt_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
1172 struct mem_attrib *attrib ATTRIBUTE_UNUSED,
1173 struct target_ops *target ATTRIBUTE_UNUSED)
1176 memaddr = translate_addr (memaddr);
1179 return adapt_write_inferior_memory (memaddr, myaddr, len);
1181 return adapt_read_inferior_memory (memaddr, myaddr, len);
1185 adapt_files_info (void)
1187 printf_filtered ("\tAttached to %s at %d baud and running program %s\n",
1188 dev_name, baudrate, prog_name);
1189 printf_filtered ("\ton an %s processor.\n", processor_name[processor_type]);
1192 /* Copy LEN bytes of data from debugger memory at MYADDR
1193 to inferior's memory at MEMADDR. Returns errno value.
1194 * sb/sh instructions don't work on unaligned addresses, when TU=1.
1197 adapt_write_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
1202 /* Turn TU bit off so we can do 'sb' commands */
1203 cps = read_register (CPS_REGNUM);
1204 if (cps & 0x00000800)
1205 write_register (CPS_REGNUM, cps & ~(0x00000800));
1207 for (i = 0; i < len; i++)
1210 fprintf (adapt_stream, "sb %x,", memaddr + i);
1211 if ((i % 16) == 15 || i == len - 1)
1213 fprintf (adapt_stream, "%x\r", ((unsigned char *) myaddr)[i]);
1217 fprintf (adapt_stream, "%x,", ((unsigned char *) myaddr)[i]);
1219 /* Restore the old value of cps if the TU bit was on */
1220 if (cps & 0x00000800)
1221 write_register (CPS_REGNUM, cps);
1225 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
1226 at debugger address MYADDR. Returns errno value. */
1228 adapt_read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
1232 /* Number of bytes read so far. */
1235 /* Starting address of this pass. */
1236 unsigned long startaddr;
1238 /* Number of bytes to read in this pass. */
1241 /* Note that this code works correctly if startaddr is just less
1242 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
1243 thing). That is, something like
1244 adapt_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
1245 works--it never adds len to memaddr and gets 0. */
1246 /* However, something like
1247 adapt_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
1248 doesn't need to work. Detect it and give up if there's an attempt
1251 if (((memaddr - 1) + len) < memaddr)
1254 startaddr = memaddr;
1259 if ((startaddr % 16) != 0)
1260 len_this_pass -= startaddr % 16;
1261 if (len_this_pass > (len - count))
1262 len_this_pass = (len - count);
1264 fprintf (adapt_stream, "db %x,%x\r", startaddr,
1265 (startaddr - 1) + len_this_pass);
1267 #ifdef NOTDEF /* Why do this */
1269 /* Look for 8 hex digits. */
1273 if (isxdigit (readchar ()))
1278 error ("Hex digit expected from remote system.");
1287 for (i = 0; i < len_this_pass; i++)
1288 get_hex_byte (&myaddr[count++]);
1292 startaddr += len_this_pass;
1297 #define MAX_BREAKS 8
1298 static int num_brkpts = 0;
1300 /* Insert a breakpoint at ADDR. SAVE is normally the address of the
1301 pattern buffer where the instruction that the breakpoint overwrites
1302 is saved. It is unused here since the Adapt Monitor is responsible
1303 for saving/restoring the original instruction. */
1306 adapt_insert_breakpoint (CORE_ADDR addr, char *save)
1308 if (num_brkpts < MAX_BREAKS)
1311 fprintf (adapt_stream, "B %x", addr);
1312 fprintf (adapt_stream, "\r");
1314 return (0); /* Success */
1318 fprintf_filtered (gdb_stderr,
1319 "Too many break points, break point not installed\n");
1320 return (1); /* Failure */
1325 /* Remove a breakpoint at ADDR. SAVE is normally the previously
1326 saved pattern, but is unused here as the Adapt Monitor is
1327 responsible for saving/restoring instructions. */
1330 adapt_remove_breakpoint (CORE_ADDR addr, char *save)
1335 fprintf (adapt_stream, "BR %x", addr);
1336 fprintf (adapt_stream, "\r");
1337 fflush (adapt_stream);
1343 /* Clear the adapts notion of what the break points are */
1345 adapt_clear_breakpoints (void)
1349 fprintf (adapt_stream, "BR"); /* Clear all break points */
1350 fprintf (adapt_stream, "\r");
1351 fflush (adapt_stream);
1359 adapt_clear_breakpoints ();
1360 pop_target (); /* Pop back to no-child state */
1361 generic_mourn_inferior ();
1364 /* Display everthing we read in from the adapt until we match/see the
1368 display_until (char *str)
1372 while (c = readchar ())
1377 if (i == strlen (str))
1384 for (j = 0; j < i; j++) /* Put everthing we matched */
1395 /* Put a command string, in args, out to the adapt. The adapt is assumed to
1396 be in raw mode, all writing/reading done through adapt_desc.
1397 Ouput from the adapt is placed on the users terminal until the
1398 prompt from the adapt is seen.
1399 FIXME: Can't handle commands that take input. */
1402 adapt_com (char *args, int fromtty)
1406 printf_filtered ("Adapt not open. Use the 'target' command to open.\n");
1410 /* Clear all input so only command relative output is displayed */
1413 switch (islower (args[0]) ? toupper (args[0]) : args[0])
1416 printf_filtered ("Unknown/Unimplemented adapt command '%s'\n", args);
1418 case 'G': /* Go, begin execution */
1419 write (adapt_desc, args, strlen (args));
1420 write (adapt_desc, "\r", 1);
1423 case 'B': /* Break points, B or BR */
1424 case 'C': /* Check current 29k status (running/halted) */
1425 case 'D': /* Display data/registers */
1426 case 'I': /* Input from i/o space */
1427 case 'J': /* Jam an instruction */
1428 case 'K': /* Kill, stop execution */
1429 case 'L': /* Disassemble */
1430 case 'O': /* Output to i/o space */
1431 case 'T': /* Trace */
1432 case 'P': /* Pulse an input line */
1433 case 'X': /* Examine special purpose registers */
1434 case 'Z': /* Display trace buffer */
1435 write (adapt_desc, args, strlen (args));
1436 write (adapt_desc, "\r", 1);
1437 expect (args); /* Don't display the command */
1438 display_until ("# ");
1440 /* Begin commands that take input in the form 'c x,y[,z...]' */
1441 case 'S': /* Set memory or register */
1442 if (strchr (args, ','))
1443 { /* Assume it is properly formatted */
1444 write (adapt_desc, args, strlen (args));
1445 write (adapt_desc, "\r", 1);
1452 /* Define the target subroutine names */
1454 struct target_ops adapt_ops;
1457 init_adapt_ops (void)
1459 adapt_ops.to_shortname = "adapt";
1460 adapt_ops.to_longname = "Remote AMD `Adapt' target";
1461 adapt_ops.to_doc = "Remote debug an AMD 290*0 using an `Adapt' monitor via RS232";
1462 adapt_ops.to_open = adapt_open;
1463 adapt_ops.to_close = adapt_close;
1464 adapt_ops.to_attach = adapt_attach;
1465 adapt_ops.to_post_attach = NULL;
1466 adapt_ops.to_require_attach = NULL;
1467 adapt_ops.to_detach = adapt_detach;
1468 adapt_ops.to_require_detach = NULL;
1469 adapt_ops.to_resume = adapt_resume;
1470 adapt_ops.to_wait = adapt_wait;
1471 adapt_ops.to_post_wait = NULL;
1472 adapt_ops.to_fetch_registers = adapt_fetch_register;
1473 adapt_ops.to_store_registers = adapt_store_register;
1474 adapt_ops.to_prepare_to_store = adapt_prepare_to_store;
1475 adapt_ops.to_xfer_memory = adapt_xfer_inferior_memory;
1476 adapt_ops.to_files_info = adapt_files_info;
1477 adapt_ops.to_insert_breakpoint = adapt_insert_breakpoint;
1478 adapt_ops.to_remove_breakpoint = adapt_remove_breakpoint;
1479 adapt_ops.to_terminal_init = 0;
1480 adapt_ops.to_terminal_inferior = 0;
1481 adapt_ops.to_terminal_ours_for_output = 0;
1482 adapt_ops.to_terminal_ours = 0;
1483 adapt_ops.to_terminal_info = 0;
1484 adapt_ops.to_kill = adapt_kill;
1485 adapt_ops.to_load = adapt_load;
1486 adapt_ops.to_lookup_symbol = 0;
1487 adapt_ops.to_create_inferior = adapt_create_inferior;
1488 adapt_ops.to_post_startup_inferior = NULL;
1489 adapt_ops.to_acknowledge_created_inferior = NULL;
1490 adapt_ops.to_clone_and_follow_inferior = NULL;
1491 adapt_ops.to_post_follow_inferior_by_clone = NULL;
1492 adapt_ops.to_insert_fork_catchpoint = NULL;
1493 adapt_ops.to_remove_fork_catchpoint = NULL;
1494 adapt_ops.to_insert_vfork_catchpoint = NULL;
1495 adapt_ops.to_remove_vfork_catchpoint = NULL;
1496 adapt_ops.to_has_forked = NULL;
1497 adapt_ops.to_has_vforked = NULL;
1498 adapt_ops.to_can_follow_vfork_prior_to_exec = NULL;
1499 adapt_ops.to_post_follow_vfork = NULL;
1500 adapt_ops.to_insert_exec_catchpoint = NULL;
1501 adapt_ops.to_remove_exec_catchpoint = NULL;
1502 adapt_ops.to_has_execd = NULL;
1503 adapt_ops.to_reported_exec_events_per_exec_call = NULL;
1504 adapt_ops.to_has_exited = NULL;
1505 adapt_ops.to_mourn_inferior = adapt_mourn;
1506 adapt_ops.to_can_run = 0;
1507 adapt_ops.to_notice_signals = 0;
1508 adapt_ops.to_thread_alive = 0;
1509 adapt_ops.to_stop = 0; /* process_stratum; */
1510 adapt_ops.to_pid_to_exec_file = NULL;
1511 adapt_ops.to_core_file_to_sym_file = NULL;
1512 adapt_ops.to_stratum = 0;
1513 adapt_ops.DONT_USE = 0;
1514 adapt_ops.to_has_all_memory = 1;
1515 adapt_ops.to_has_memory = 1;
1516 adapt_ops.to_has_stack = 1;
1517 adapt_ops.to_has_registers = 1;
1518 adapt_ops.to_has_execution = 0;
1519 adapt_ops.to_sections = 0;
1520 adapt_ops.to_sections_end = 0;
1521 adapt_ops.to_magic = OPS_MAGIC;
1522 } /* init_adapt_ops */
1525 _initialize_remote_adapt (void)
1528 add_target (&adapt_ops);
1529 add_com ("adapt <command>", class_obscure, adapt_com,
1530 "Send a command to the AMD Adapt remote monitor.");