1 /* Memory-access and commands for remote es1800 processes, for GDB.
2 Copyright (C) 1988, 1992 Free Software Foundation, Inc.
4 This file is added to GDB to make it possible to do debugging via an
5 ES-1800 emulator. The code was originally written by Johan Holmberg
6 TT/SJ Ericsson Telecom AB and later modified by Johan Henriksson
7 TT/SJ. It was modified for gdb 4.0 by TX/DK Jan Nordenand by TX/DKG
10 This file is part of GDB.
12 GDB is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 1, or (at your option)
17 GDB is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with GDB; see the file COPYING. If not, write to
24 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
27 /* Emulator communication protocol.
28 All values are encoded in ascii hex digits.
35 - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - -- 6 - - 7 -
36 D = XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
37 A = XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
38 PC = XXXXXX SSP = XXXXXX USP = XXXXXX SR = XXXXXXXX
40 Each byte of register data is described by two hex digits.
62 Each byte of register data is described by two hex digits.
68 AA..AA is address, XXXXXXX is the contents
73 AA..AA is address, XXXXXXXX is data
79 AA..AA is address to resume. If AA..AA is omitted, resume at same address.
85 AA..AA is address to resume. If AA..AA is omitted, resume at same address.
95 #include <sys/ioctl.h>
104 #include "inferior.h"
107 #include "terminal.h"
109 #include "remote-utils.h"
112 #include <sys/types.h>
118 /* External variables referenced. */
120 extern bfd *exec_bfd;
122 /* Prototypes for local functions */
125 es1800_child_detach PARAMS ((char *, int));
128 es1800_child_open PARAMS ((char *, int));
131 es1800_transparent PARAMS ((char *, int));
134 es1800_create_inferior PARAMS ((char *, char *, char **));
137 es1800_load PARAMS ((char *, int));
140 es1800_kill PARAMS ((void));
143 verify_break PARAMS ((int));
146 es1800_remove_breakpoint PARAMS ((CORE_ADDR, char *));
149 es1800_insert_breakpoint PARAMS ((CORE_ADDR, char *));
152 es1800_files_info PARAMS ((struct target_ops *));
155 es1800_xfer_inferior_memory PARAMS ((CORE_ADDR, char *, int, int,
156 struct target_ops *));
159 es1800_prepare_to_store PARAMS ((void));
162 es1800_wait PARAMS ((WAITTYPE *));
164 static void es1800_resume PARAMS ((int, int, enum target_signal));
167 es1800_detach PARAMS ((char *, int));
170 es1800_attach PARAMS ((char *, int));
173 damn_b PARAMS ((char *));
176 es1800_open PARAMS ((char *, int));
179 es1800_timer PARAMS ((void));
182 es1800_reset PARAMS ((char *));
185 es1800_request_quit PARAMS ((void));
188 readchar PARAMS ((void));
191 expect PARAMS ((char *, int));
194 expect_prompt PARAMS ((void));
197 download PARAMS ((FILE *, int, int));
201 bfd_copy PARAMS ((bfd *, bfd *));
205 get_break_addr PARAMS ((int, CORE_ADDR *));
208 fromhex PARAMS ((int));
211 tohex PARAMS ((int));
214 es1800_close PARAMS ((int));
217 es1800_fetch_registers PARAMS ((void));
220 es1800_fetch_register PARAMS ((int));
223 es1800_store_register PARAMS ((int));
226 es1800_read_bytes PARAMS ((CORE_ADDR, char *, int));
229 es1800_write_bytes PARAMS ((CORE_ADDR, char *, int));
232 send_with_reply PARAMS ((char *, char *, int));
235 send_command PARAMS ((char *));
238 send PARAMS ((char *));
241 getmessage PARAMS ((char *, int));
244 es1800_mourn_inferior PARAMS ((void));
247 es1800_create_break_insn PARAMS ((char *, int));
250 es1800_init_break PARAMS ((char *, int));
252 /* Local variables */
254 #define LOG_FILE "es1800.log"
255 #if defined (LOG_FILE)
256 static FILE *log_file;
259 extern struct target_ops es1800_ops; /* Forward decl */
260 extern struct target_ops es1800_child_ops; /* Forward decl */
263 static int timeout = 100;
264 static char *savename; /* Name of i/o device used */
265 static TERMINAL es1800_sg_save; /* Save stty state */
266 static int es1800_fc_save; /* Save fcntl state */
268 /* indicates that the emulator uses 32-bit data-adress (68020-mode)
269 instead of 24-bit (68000 -mode) */
273 #define MODE (m68020 ? "M68020" : "M68000" )
274 #define ES1800_BREAK_VEC (0xf)
276 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
277 es1800_open knows that we don't have a file open when the program
280 static int es1800_desc = -1;
283 #define HDRLEN sizeof("@.BAAAAAAAA=$VV\r")
285 /* Maximum number of bytes to read/write at once. The value here
286 is chosen to fill up a packet. */
288 #define MAXBUFBYTES ((PBUFSIZ-150)*16/75 )
290 static int es1800_break_vec = 0;
291 static char es1800_break_insn[2];
292 static long es1800_break_address;
293 static void (*old_sigint)(); /* Old signal-handler for sigint */
294 static jmp_buf interrupt;
296 /* Local signalhandler to allow breaking tranfers or program run.
297 Rely on global variables: old_sigint(), interrupt */
300 es1800_request_quit ()
302 /* restore original signalhandler */
303 signal (SIGINT, old_sigint);
304 longjmp (interrupt, 1);
309 Sending reset character(octal 32) to emulator.
310 quit - return to '(esgdb)' prompt or continue */
320 printf ("\nResetting emulator... ");
322 strcpy (buf, "\032");
332 /* Called when SIGALRM signal sent due to alarm() timeout.
333 Rely on global variables: timeout */
342 printf ("es1800_timer called\n");
347 #endif /* HAVE_TERMIO */
350 /* Open a connection to a remote debugger and push the new target
351 onto the stack. Check if the emulator is responding and find out
352 what kind of processor the emulator is connected to.
353 Initiate the breakpoint handling in the emulator.
355 name - the filename used for communication (ex. '/dev/tta')
356 from_tty - says whether to be verbose or not */
359 es1800_open (name, from_tty)
371 if (!name) /* no device name given in target command */
373 error_no_arg ("serial port device name");
375 sprintf(baudrate, "%d", sr_get_baud_rate());
377 target_preopen (from_tty);
380 /* open the device and configure it for communication */
384 es1800_desc = open (name, O_RDWR);
387 perror_with_name (name);
389 savename = savestring (name, strlen (name));
391 if (ioctl (es1800_desc, TIOCGETP, &sg) == -1)
393 perror_with_name (name);
397 if ((fcflag = fcntl (es1800_desc, F_GETFL, 0)) == -1)
399 perror_with_name ("fcntl serial");
401 es1800_fc_save = fcflag;
403 fcflag = (fcflag & (FREAD | FWRITE)); /* mask out any funny stuff */
404 if (fcntl (es1800_desc, F_SETFL, fcflag) == -1)
406 perror_with_name ("fcntl serial");
410 sg.c_cc[VMIN] = 0; /* read with timeout. */
411 sg.c_cc[VTIME] = timeout * 10;
412 sg.c_lflag &= ~(ICANON | ECHO);
413 sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
415 sg.sg_ispeed = damn_b (baudrate);
416 sg.sg_ospeed = damn_b (baudrate);
417 sg.sg_flags = CBREAK+TANDEM;
420 if ((ioctl (es1800_desc, TIOCSETP, &sg)) == -1)
422 perror ("es1800_open: error in ioctl");
425 #endif /* DEBUG_STDIN */
427 push_target (&es1800_ops); /* Switch to using remote target now */
430 printf ("Remote ES1800 debugging using %s\n", name);
435 #ifndef NO_SIGINTERRUPT
437 /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
440 if (siginterrupt (SIGALRM, 1) != 0)
442 perror ("es1800_open: error in siginterrupt");
445 #endif /* NO_SIGINTERRUPT */
447 /* Set up read timeout timer. */
449 if ((void(*)()) signal (SIGALRM, es1800_timer) == (void(*)()) -1)
451 perror ("es1800_open: error in signal");
454 #endif /* HAVE_TERMIO */
457 #if defined (LOG_FILE)
459 log_file = fopen (LOG_FILE, "w");
460 if (log_file == NULL)
462 perror_with_name (LOG_FILE);
465 #endif /* LOG_FILE */
467 /* Hello? Are you there?, also check mode */
469 /* send_with_reply( "DB 0 TO 1", buf, sizeof(buf)); */
470 /* for (p = buf, i = 0; *p++ =='0';) */ /* count the number of zeros */
474 getmessage (buf, sizeof (buf)); /* send reset character */
478 printf ("Checking mode.... ");
480 /* m68020 = (i==8); */ /* if eight zeros then we are in m68020 mode */
482 /* What kind of processor am i talking to ?*/
484 while (*p++ != '\n') {;}
485 while (*p++ != '\n') {;}
486 while (*p++ != '\n') {;}
487 for (i = 0; i < 20; i++, p++) {;}
488 m68020 = !strncmp (p, "68020", 5);
491 printf ("You are in %s(%c%c%c%c%c)-mode\n", MODE, p[0], p[1], p[2],
495 /* if no init_break statement is present in .gdb file we have to check
496 whether to download a breakpoint routine or not */
499 if ((es1800_break_vec == 0) || (verify_break (es1800_break_vec) != 0)
500 && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
502 CORE_ADDR memaddress;
503 printf ("Give the start address of the breakpoint routine: ");
504 scanf ("%li", &memaddress);
505 es1800_init_break ((es1800_break_vec ? es1800_break_vec :
506 ES1800_BREAK_VEC), memaddress);
512 /* Close out all files and local state before this target loses control.
513 quitting - are we quitting gdb now? */
516 es1800_close (quitting)
519 if (es1800_desc >= 0)
521 printf ("\nClosing connection to emulator...\n");
522 ioctl (es1800_desc, TIOCSETP, &es1800_sg_save);
523 fcntl (es1800_desc,F_SETFL, es1800_fc_save);
527 if (savename != NULL)
533 #if defined (LOG_FILE)
535 if (log_file != NULL)
537 if (ferror (log_file))
539 printf ("Error writing log file.\n");
541 if (fclose (log_file) != 0)
543 printf ("Error closing log file.\n");
548 #endif /* LOG_FILE */
554 Translate baud rates from integers to damn B_codes. Unix should
555 have outgrown this crap years ago, but even POSIX wouldn't buck it.
556 rate - the baudrate given as a string
557 return value: the baudrate as a B_code */
596 for (i = 0; baudtab[i].rate != 0; i++)
598 if (STREQ (rate, baudtab[i].rate))
600 return (baudtab[i].damn_b);
603 error ("Illegal baudrate");
607 /* Attaches to a process on the target side
608 proc_id - the id of the process to be attached.
609 from_tty - says whether to be verbose or not */
612 es1800_attach (args, from_tty)
616 error ("Cannot attach to pid %s, this feature is not implemented yet.",
621 /* Takes a program previously attached to and detaches it.
622 We better not have left any breakpoints
623 in the program or it'll die when it hits one.
624 Close the open connection to the remote debugger.
625 Use this when you want to detach and do something else
628 args - arguments given to the 'detach' command
629 from_tty - says whether to be verbose or not */
632 es1800_detach (args, from_tty)
638 error ("Argument given to \"detach\" when remotely debugging.");
643 printf ("Ending es1800 remote debugging.\n");
648 /* Tell the remote machine to resume.
649 step - single-step or run free
650 siggnal - the signal value to be given to the target (0 = no signal) */
653 es1800_resume (pid, step, siggnal)
656 enum target_signal siggnal;
662 error ("Can't send signals to a remote system.");
666 strcpy (buf,"STP\r");
671 send_command ("RBK");
675 /* Wait until the remote machine stops, then return,
676 storing status in STATUS just as `wait' would.
681 struct target_waitstatus *status;
683 unsigned char buf[PBUFSIZ];
684 int old_timeout = timeout;
686 status->kind = TARGET_WAITKIND_EXITED;
687 status->value.integer = 0;
689 timeout = 0; /* Don't time out -- user program is running. */
690 if (!setjmp (interrupt))
692 old_sigint = signal (SIGINT, es1800_request_quit);
695 getmessage (buf, sizeof(buf));
696 if (strncmp ( buf, "\r\n* BREAK *", 11) == 0)
698 status->kind = TARGET_WAITKIND_STOPPED;
699 status->value.sig = TARGET_SIGNAL_TRAP;
700 send_command ("STP"); /* Restore stack and PC and such */
703 send_command ("STP");
707 if (strncmp (buf, "STP\r\n ", 6) == 0)
709 status->kind = TARGET_WAITKIND_STOPPED;
710 status->value.sig = TARGET_SIGNAL_TRAP;
713 if (buf[strlen (buf) - 2] == 'R')
715 printf ("Unexpected emulator reply: \n%s\n", buf);
719 printf ("Unexpected stop: \n%s\n", buf);
720 status->kind = TARGET_WAITKIND_STOPPED;
721 status->value.sig = TARGET_SIGNAL_QUIT;
729 printf ("\nStopping emulator...");
730 if (!setjmp (interrupt))
732 old_sigint = signal (SIGINT, es1800_request_quit);
733 send_command ("STP");
734 printf (" emulator stopped\n");
735 status->kind = TARGET_WAITKIND_STOPPED;
736 status->value.sig = TARGET_SIGNAL_INT;
741 es1800_reset ((char*) 1);
744 signal (SIGINT, old_sigint);
745 timeout = old_timeout;
750 /* Fetch register values from remote machine.
751 regno - the register to be fetched (fetch all registers if -1) */
754 es1800_fetch_register (regno)
761 static char regtab[18][4] =
763 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
764 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
768 if ((regno < 15) || (regno == 16) || (regno == 17))
771 send_with_reply (regtab[regno], buf, sizeof (buf));
773 for (k = 0; k < 4; k++)
775 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
777 error ("Emulator reply is too short: %s", buf);
779 registers[r++] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
784 es1800_fetch_registers ();
788 /* Read the remote registers into REGISTERS.
789 Always fetches all registers. */
792 es1800_fetch_registers ()
795 char SR_buf[PBUFSIZ];
801 send_with_reply ("DR", buf, sizeof (buf));
803 /* Reply is edited to a string that describes registers byte by byte,
804 each byte encoded as two hex characters. */
809 /* parsing row one - D0-D7-registers */
811 while (*p++ != '\n') {;}
812 for (i = 4; i < 70; i += (i == 39 ? 3 : 1))
814 for (k = 0; k < 4; k++)
816 if (p[i+0] == 0 || p[i+1] == 0)
818 error ("Emulator reply is too short: %s", buf);
820 registers[r++] = (fromhex (p[i+0]) * 16) + fromhex (p[i+1]);
826 /* parsing row two - A0-A6-registers */
828 while (*p++ != '\n') {;}
829 for (i = 4; i < 61; i += (i == 39 ? 3 : 1))
831 for (k = 0; k < 4; k++)
833 if (p[i+0] == 0 || p[i+1] == 0)
835 error ("Emulator reply is too short: %s", buf);
837 registers[r++] = (fromhex (p[i+0])) * 16 + fromhex (p[i+1]);
843 while (*p++ != '\n') {;}
845 /* fetch SSP-, SR- and PC-registers */
847 /* first - check STATUS-word and decide which stackpointer to use */
849 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
855 if (*p == '3') /* use masterstackpointer MSP */
857 send_with_reply ("MSP", buf, sizeof (buf));
859 else if (*p == '2') /* use interruptstackpointer ISP */
861 send_with_reply ("ISP", buf, sizeof (buf));
863 else /* use userstackpointer USP */
865 send_with_reply ("USP", buf, sizeof (buf));
868 for (k = 0; k<4; k++)
870 if (p[k*2+1] == 0 || p[k*2+2] == 0)
872 error ("Emulator reply is too short: %s", buf);
874 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
878 for (k = 0; k < 4; k++)
880 if (p[k*2+1] == 0 || p[k*2+2] == 0)
882 error ("Emulator reply is too short: %s", buf);
885 fromhex (SR_buf[k*2+1]) * 16 + fromhex (SR_buf[k*2+2]);
887 send_with_reply ("PC", buf, sizeof (buf));
889 for (k = 0; k<4; k++)
891 if (p[k*2+1] == 0 || p[k*2+2] == 0)
893 error ("Emulator reply is too short: %s", buf);
895 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
898 else /* 68000-mode */
900 if (*p == '2') /* use supervisorstackpointer SSP */
902 send_with_reply ("SSP", buf, sizeof (buf));
904 else /* use userstackpointer USP */
906 send_with_reply ("USP", buf, sizeof (buf));
909 /* fetch STACKPOINTER */
912 for (k = 0; k < 4; k++)
914 if (p[k*2 + 1] == 0 || p[k*2 + 2] == 0)
916 error ("Emulator reply is too short: %s", buf);
918 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
924 for (k = 0; k < 4; k++)
926 if (p[k*2+1] == 0 || p[k*2+2] == 0)
928 error ("Emulator reply is too short: %s", buf);
931 fromhex (SR_buf[k*2+1]) * 16 + fromhex (SR_buf[k*2+2]);
936 send_with_reply ("PC", buf, sizeof (buf));
938 for (k = 0; k < 4; k++)
940 if (p[k*2+1] == 0 || p[k*2+2] == 0)
942 error ("Emulator reply is too short: %s", buf);
944 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
949 /* Store register value, located in REGISTER, on the target processor.
950 regno - the register-number of the register to store
951 (-1 means store them all)
952 FIXME: Return errno value. */
955 es1800_store_register(regno)
959 static char regtab[18][4] =
961 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
962 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
967 char SR_buf[PBUFSIZ];
968 char stack_pointer[4];
975 r = (unsigned char *) registers;
977 if (regno == -1) /* write all registers */
982 else /* write one register */
989 if ((regno == -1) || (regno == 15))
991 /* fetch current status */
992 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
997 if (*p == '3') /* use masterstackpointer MSP */
999 strcpy (stack_pointer,"MSP");
1003 if (*p == '2') /* use interruptstackpointer ISP */
1005 strcpy (stack_pointer,"ISP");
1009 strcpy (stack_pointer,"USP"); /* use userstackpointer USP */
1013 else /* 68000-mode */
1015 if (*p == '2') /* use supervisorstackpointer SSP */
1017 strcpy (stack_pointer,"SSP");
1021 strcpy (stack_pointer,"USP");/* use userstackpointer USP */
1024 strcpy (regtab[15],stack_pointer);
1027 for (i = j; i<k; i++)
1029 buf[0] = regtab[i][0];
1030 buf[1] = regtab[i][1];
1031 buf[2] = regtab[i][2];
1034 buf[5] = tohex ((*r >> 4) & 0x0f);
1035 buf[6] = tohex (*r++ & 0x0f);
1036 buf[7] = tohex ((*r >> 4) & 0x0f);
1037 buf[8] = tohex (*r++ & 0x0f);
1038 buf[9] = tohex ((*r >> 4) & 0x0f);
1039 buf[10] = tohex (*r++ & 0x0f);
1040 buf[11] = tohex ((*r >> 4) & 0x0f);
1041 buf[12] = tohex (*r++ & 0x0f);
1044 send_with_reply (buf, buf, sizeof (buf)); /* FIXME, reply not used? */
1049 /* Prepare to store registers. */
1052 es1800_prepare_to_store ()
1054 /* Do nothing, since we can store individual regs */
1057 /* Convert hex digit A to a number. */
1063 if (a >= '0' && a <= '9')
1067 else if (a >= 'a' && a <= 'f')
1069 return a - 'a' + 10;
1071 else if (a >= 'A' && a <= 'F')
1073 return a - 'A' + 10;
1077 error ("Reply contains invalid hex digit");
1083 /* Convert number NIB to a hex digit. */
1095 return ('A' + nib - 10);
1099 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
1100 to or from debugger address MYADDR. Write to inferior if WRITE is
1101 nonzero. Returns length of data written or read; 0 for error.
1103 memaddr - the target's address
1104 myaddr - gdb's address
1105 len - number of bytes
1106 write - write if != 0 otherwise read */
1109 es1800_xfer_inferior_memory (memaddr, myaddr, len, write, tops)
1114 struct target_ops *tops; /* Unused */
1121 xfersize = len > MAXBUFBYTES ? MAXBUFBYTES : len;
1124 es1800_write_bytes (memaddr, myaddr, xfersize);
1128 es1800_read_bytes (memaddr, myaddr, xfersize);
1130 memaddr += xfersize;
1134 return (origlen); /* no error possible */
1138 /* Write memory data directly to the emulator.
1139 This does not inform the data cache; the data cache uses this.
1140 MEMADDR is the address in the remote memory space.
1141 MYADDR is the address of the buffer in our space.
1142 LEN is the number of bytes.
1144 memaddr - the target's address
1145 myaddr - gdb's address
1146 len - number of bytes */
1149 es1800_write_bytes (memaddr, myaddr, len)
1159 for (i = 0; i < len; i++)
1161 sprintf (buf, "@.B$%x=$%x", memaddr+i, (*p++) & 0xff);
1162 send_with_reply (buf, buf, sizeof (buf)); /* FIXME send_command? */
1167 /* Read memory data directly from the emulator.
1168 This does not use the data cache; the data cache uses this.
1170 memaddr - the target's address
1171 myaddr - gdb's address
1172 len - number of bytes */
1175 es1800_read_bytes (memaddr, myaddr, len)
1180 static int DB_tab[16] = {8,11,14,17,20,23,26,29,34,37,40,43,46,49,52,55};
1187 if (len > PBUFSIZ / 2 - 1)
1192 if (len == 1) /* The emulator does not like expressions like: */
1194 len = 2; /* DB.B $20018 TO $20018 */
1197 /* Reply describes registers byte by byte, each byte encoded as two hex
1200 sprintf (buf, "DB.B $%x TO $%x", memaddr, memaddr+len-1);
1201 send_with_reply (buf, buf, sizeof (buf));
1203 low_addr = memaddr&0x0f;
1204 for (i = low_addr; i < low_addr + len; i++)
1206 if ((!(i % 16)) && i)
1207 { /* if (i = 16,32,48) */
1208 while (*p++!='\n') {;}
1211 p = b + DB_tab[i%16] + (m68020 ? 2 : 0);
1212 if (p[0] == 32 || p[1] == 32)
1214 error ("Emulator reply is too short: %s", buf);
1216 myaddr[i-low_addr] = fromhex (p[0]) * 16 + fromhex (p[1]);
1220 /* Information about the current target */
1223 es1800_files_info (tops)
1224 struct target_ops *tops; /* Unused */
1226 printf ("ES1800 Attached to %s at %d baud in %s mode\n", savename, 19200,
1231 /* We read the contents of the target location and stash it,
1232 then overwrite it with a breakpoint instruction.
1234 addr - is the target location in the target machine.
1235 contents_cache - is a pointer to memory allocated for saving the target contents.
1236 It is guaranteed by the caller to be long enough to save sizeof
1239 FIXME: This size is target_arch dependent and should be available in
1240 the target_arch transfer vector, if we ever have one... */
1243 es1800_insert_breakpoint (addr, contents_cache)
1245 char *contents_cache;
1249 val = target_read_memory (addr, contents_cache, sizeof (es1800_break_insn));
1253 val = target_write_memory (addr, es1800_break_insn,
1254 sizeof (es1800_break_insn));
1261 /* Write back the stashed instruction
1263 addr - is the target location in the target machine.
1264 contents_cache - is a pointer to memory allocated for saving the target contents.
1265 It is guaranteed by the caller to be long enough to save sizeof
1266 BREAKPOINT bytes. */
1269 es1800_remove_breakpoint (addr, contents_cache)
1271 char *contents_cache;
1274 return (target_write_memory (addr, contents_cache,
1275 sizeof (es1800_break_insn)));
1278 /* create_break_insn ()
1279 Primitive datastructures containing the es1800 breakpoint instruction */
1282 es1800_create_break_insn (ins, vec)
1295 Seach for breakpoint routine in emulator memory.
1296 returns non-zero on failure
1297 vec - trap vector used for breakpoints */
1303 CORE_ADDR memaddress;
1305 char *instr = "NqNqNqNs"; /* breakpoint routine */
1308 get_break_addr (vec, &memaddress);
1312 status = target_read_memory (memaddress, buf, 8);
1315 memory_error (status, memaddress);
1317 return (STRCMP (instr, buf));
1323 /* get_break_addr ()
1324 find address of breakpint routine
1325 vec - trap vector used for breakpoints
1326 addrp - store the address here */
1329 get_break_addr (vec, addrp)
1333 CORE_ADDR memaddress = 0;
1342 send_with_reply ("VBR ", buf, sizeof (buf));
1344 for (k = 0; k < 4; k++)
1346 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
1348 error ("Emulator reply is too short: %s", buf);
1350 base_addr[k] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
1352 /* base addr of exception vector table */
1353 memaddress = *((CORE_ADDR *) base_addr);
1356 memaddress += (vec + 32) * 4; /* address of trap vector */
1357 status = target_read_memory (memaddress, (char *) addrp, 4);
1360 memory_error (status, memaddress);
1365 /* Kill an inferior process */
1370 if (inferior_pid != 0)
1373 es1800_mourn_inferior ();
1378 /* Load a file to the ES1800 emulator.
1379 Converts the file from a.out format into Extended Tekhex format
1380 before the file is loaded.
1381 Also loads the trap routine, and sets the ES1800 breakpoint on it
1382 filename - the a.out to be loaded
1383 from_tty - says whether to be verbose or not
1384 FIXME Uses emulator overlay memory for trap routine */
1387 es1800_load (filename, from_tty)
1395 struct cleanup *old_chain;
1396 int es1800_load_format = 5;
1398 if (es1800_desc < 0)
1400 printf ("No emulator attached, type emulator-command first\n");
1404 filename = tilde_expand (filename);
1405 make_cleanup (free, filename);
1407 switch (es1800_load_format)
1409 case 2: /* Extended Tekhex */
1412 printf ("Converting \"%s\" to Extended Tekhex Format\n", filename);
1414 sprintf (buf, "tekhex %s", filename);
1416 sprintf (loadname, "out.hex");
1419 case 5: /* Motorola S-rec */
1422 printf ("Converting \"%s\" to Motorola S-record format\n",
1425 /* in the future the source code in copy (part of binutils-1.93) will
1426 be included in this file */
1428 "copy -s \"a.out-sunos-big\" -d \"srec\" %s /tmp/out.hex",
1431 sprintf (loadname, "/tmp/out.hex");
1435 error ("Downloading format not defined\n");
1438 breakpoint_init_inferior ();
1442 printf ("Downloading \"%s\" to the ES 1800\n",filename);
1444 if ((instream = fopen (loadname, "r")) == NULL)
1446 perror_with_name ("fopen:");
1449 old_chain = make_cleanup (fclose, instream);
1454 download (instream, from_tty, es1800_load_format);
1456 /* if breakpoint routine is not present anymore we have to check
1457 whether to download a new breakpoint routine or not */
1459 if ((verify_break (es1800_break_vec) != 0)
1460 && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
1463 printf ("Using break vector 0x%x\n", es1800_break_vec);
1464 sprintf (buf, "0x%x ", es1800_break_vec);
1465 printf ("Give the start address of the breakpoint routine: ");
1466 fgets (buf + strlen (buf), sizeof (buf) - strlen (buf), stdin);
1467 es1800_init_break (buf, 0);
1470 do_cleanups (old_chain);
1472 readchar (); /* FIXME I am getting a ^G = 7 after the prompt */
1475 if (fclose (instream) == EOF)
1480 if (es1800_load_format != 2)
1482 sprintf (buf, "/usr/bin/rm %s", loadname);
1486 symbol_file_command (filename, from_tty); /* reading symbol table */
1492 #define NUMCPYBYTES 20
1495 bfd_copy (from_bfd, to_bfd)
1501 char buf[NUMCPYBYTES];
1503 for (p = from_bfd->sections; p != NULL; p = p->next)
1505 printf (" Copying section %s. Size = %x.\n", p->name, p->_cooked_size);
1506 printf (" vma = %x, offset = %x, output_sec = %x\n",
1507 p->vma, p->output_offset, p->output_section);
1508 new = bfd_make_section (to_bfd, p->name);
1509 if (p->_cooked_size &&
1510 !bfd_set_section_size (to_bfd, new, p->_cooked_size))
1512 error ("Wrong BFD size!\n");
1514 if (!bfd_set_section_flags (to_bfd, new, p->flags))
1516 error ("bfd_set_section_flags");
1520 for (i = 0; (i + NUMCPYBYTES) < p->_cooked_size ; i += NUMCPYBYTES)
1522 if (!bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1523 (bfd_size_type) NUMCPYBYTES))
1525 error ("bfd_get_section_contents\n");
1527 if (!bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
1528 (bfd_size_type) NUMCPYBYTES))
1530 error ("bfd_set_section_contents\n");
1533 bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1534 (bfd_size_type) (p->_cooked_size - i));
1535 bfd_set_section_contents (to_bfd, new, (PTR) buf,(file_ptr) i,
1536 (bfd_size_type) (p->_cooked_size - i));
1542 /* Start an process on the es1800 and set inferior_pid to the new
1544 execfile - the file to run
1545 args - arguments passed to the program
1546 env - the environment vector to pass */
1549 es1800_create_inferior (execfile, args, env)
1557 struct expression *expr;
1558 register struct cleanup *old_chain = 0;
1564 error ("Can't pass arguments to remote ES1800 process");
1568 if (query ("Use 'start' as entry point? "))
1570 expr = parse_c_expression ("start");
1571 old_chain = make_cleanup (free_current_contents, &expr);
1572 val = evaluate_expression (expr);
1573 entry_pt = (val->location).address;
1577 printf ("Enter the program's entry point (in hexadecimal): ");
1578 scanf ("%x", &entry_pt);
1582 if (execfile == 0 || exec_bfd == 0)
1584 error ("No exec file specified");
1587 entry_pt = (int) bfd_get_start_address (exec_bfd);
1591 /* Now that we have a child process, make it our target. */
1593 push_target (&es1800_child_ops);
1595 /* The "process" (board) is already stopped awaiting our commands, and
1596 the program is already downloaded. We just set its PC and go. */
1598 inferior_pid = pid; /* Needed for wait_for_inferior below */
1600 clear_proceed_status ();
1602 /* Tell wait_for_inferior that we've started a new process. */
1604 init_wait_for_inferior ();
1606 /* Set up the "saved terminal modes" of the inferior
1607 based on what modes we are starting it with. */
1609 target_terminal_init ();
1611 /* Install inferior's terminal modes. */
1613 target_terminal_inferior ();
1615 /* remote_start (args); */
1616 /* trap_expected = 0; */
1617 /* insert_step_breakpoint (); FIXME, do we need this? */
1619 proceed ((CORE_ADDR) entry_pt, -1, 0); /* Let 'er rip... */
1624 /* The process has died, clean up. */
1627 es1800_mourn_inferior ()
1629 remove_breakpoints ();
1630 unpush_target (&es1800_child_ops);
1631 generic_mourn_inferior (); /* Do all the proper things now */
1634 /* ES1800-protocol specific routines */
1636 /* Keep discarding input from the remote system, until STRING is found.
1637 Let the user break out immediately.
1638 string - the string to expect
1639 nowait - break out if string not the emulator's first respond otherwise
1640 read until string is found (== 0) */
1643 expect (string, nowait)
1658 if (c == toupper (*p))
1673 printf ("\'%s\' expected\n" , string);
1674 printf ("char %d is %d", p - string, c);
1680 /* Keep discarding input until we see the prompt. */
1689 /* Read one character */
1693 /* read from stdin */
1701 printf ("readchar, give one character\n");
1704 #if defined (LOG_FILE)
1705 putc (buf[0] & 0x7f, log_file);
1708 return (buf[0] & 0x7f);
1711 #else /* !DEBUG_STDIN */
1713 /* Read a character from the remote system, doing all the fancy
1725 /* termio does the timeout for us. */
1726 read (es1800_desc, buf, 1);
1731 while (read (es1800_desc, buf, 1) != 1)
1735 error ("Timeout reading from remote system.");
1737 else if (errno != EWOULDBLOCK)
1739 perror_with_name ("remote read");
1745 #if defined (LOG_FILE)
1746 putc (buf[0] & 0x7f, log_file);
1750 return (buf[0] & 0x7f);
1753 #endif /* DEBUG_STDIN */
1756 /* Send a command to the emulator and save the reply.
1757 Report an error if we get an error reply.
1758 string - the es1800 command
1759 buf - containing the emulator reply on return
1760 len - size of buf */
1763 send_with_reply (string, buf, len)
1768 write (es1800_desc, "\r", 1);
1775 getmessage (buf, len);
1779 /* Send the command in STR to the emulator adding \r. check
1780 the echo for consistency.
1781 string - the es1800 command */
1784 send_command (string)
1788 write (es1800_desc, "\r", 1);
1798 string - the es1800 command */
1806 fprintf (stderr, "Sending: %s\n", string);
1808 write (es1800_desc, string, strlen (string));
1812 /* Read a message from the emulator and store it in BUF.
1813 buf - containing the emulator reply on return
1814 len - size of buf */
1817 getmessage (buf, len)
1823 int prompt_found = 0;
1826 #if defined (LOG_FILE)
1827 /* This is a convenient place to do this. The idea is to do it often
1828 enough that we never lose much data if we terminate abnormally. */
1838 if (len-- < 2) /* char and terminaling NULL */
1840 error ("input buffer overrun\n");
1845 if ((c == '>') && (*(bp - 1) == ' '))
1850 while (!prompt_found);
1855 fprintf (stderr,"message received :%s\n", buf);
1860 download (instream, from_tty, format)
1869 send_command ("SET #2,$1A"); /* reset char = ^Z */
1870 send_command ("SET #3,$11,$13"); /* XON XOFF */
1873 send_command ("SET #26,#2");
1877 send_command ("SET #26,#5"); /* Format=Extended Tekhex */
1879 send_command ("DFB = $10");
1880 send_command ("PUR");
1881 send_command ("CES");
1886 printf (" 0 records loaded...\r");
1888 while (fgets (buf, 160, instream))
1893 printf ("%5d\b\b\b\b\b",++i);
1896 if ((c = readchar ()) != 006)
1898 error ("expected ACK");
1907 /* Additional commands */
1909 /* Talk directly to the emulator
1910 FIXME, uses busy wait, and is SUNOS (or at least BSD) specific */
1914 es1800_transparent (args, from_tty)
1919 struct sgttyb modebl;
1922 struct sgttyb console_mode_save;
1923 int console_fc_save;
1928 char consolebuf[80];
1930 char es1800_buf[80];
1934 if (es1800_desc < 0)
1936 printf ("No emulator attached, type emulator-command first\n");
1941 printf ("You are now communicating directly with the ES 1800 emulator.\n");
1942 printf ("To leave this mode (transparent mode), press ^E.\n");
1947 if ((console = open ("/dev/tty", O_RDWR)) == -1)
1949 perror_with_name ("/dev/tty:");
1952 if ((fcflag = fcntl (console, F_GETFL, 0)) == -1)
1954 perror_with_name ("fcntl console");
1957 console_fc_save = fcflag;
1958 fcflag = fcflag | FNDELAY;
1960 if (fcntl (console, F_SETFL, fcflag) == -1)
1962 perror_with_name ("fcntl console");
1965 if (ioctl (console, TIOCGETP, &modebl))
1967 perror_with_name ("ioctl console");
1970 console_mode_save = modebl;
1971 modebl.sg_flags = RAW;
1973 if (ioctl (console, TIOCSETP, &modebl))
1975 perror_with_name ("ioctl console");
1978 if ((fcflag = fcntl (es1800_desc, F_GETFL, 0)) == -1)
1980 perror_with_name ("fcntl serial");
1983 es1800_fc_save = fcflag;
1984 fcflag = fcflag | FNDELAY;
1986 if (fcntl (es1800_desc, F_SETFL, fcflag) == -1)
1988 perror_with_name ("fcntl serial");
1993 cc = read (console, inputbuf, inputcnt);
1996 if ((*inputbuf & 0x7f) == 0x05)
2000 for (i = 0; i < cc; )
2002 es1800_buf[es1800_cnt++] = inputbuf[i++];
2004 if ((cc = write (es1800_desc, es1800_buf, es1800_cnt)) == -1)
2006 perror_with_name ("FEL! read:");
2009 if (es1800_cnt && cc)
2011 for (i = 0; i < es1800_cnt; i++)
2013 es1800_buf[i] = es1800_buf[cc+i];
2017 else if (errno != EWOULDBLOCK)
2019 perror_with_name ("FEL! read:");
2022 cc = read (es1800_desc,inputbuf,inputcnt);
2025 for (i = 0; i < cc; )
2027 consolebuf[consolecnt++] = inputbuf[i++];
2029 if ((cc = write (console,consolebuf,consolecnt)) == -1)
2031 perror_with_name ("FEL! write:");
2034 if (consolecnt && cc)
2036 for (i = 0; i < consolecnt; i++)
2038 consolebuf[i] = consolebuf[cc+i];
2042 else if (errno != EWOULDBLOCK)
2044 perror_with_name ("FEL! read:");
2048 console_fc_save = console_fc_save & !FNDELAY;
2049 if (fcntl (console, F_SETFL, console_fc_save) == -1)
2051 perror_with_name ("FEL! fcntl");
2054 if (ioctl (console, TIOCSETP, &console_mode_save))
2056 perror_with_name ("FEL! ioctl");
2061 if (fcntl (es1800_desc, F_SETFL, es1800_fc_save) == -1)
2063 perror_with_name ("FEL! fcntl");
2071 es1800_init_break (args, from_tty)
2075 CORE_ADDR memaddress = 0;
2084 error_no_arg ("a trap vector");
2087 if (!(space_index = strchr (args, ' ')))
2089 error ("Two arguments needed (trap vector and address of break routine).\n");
2092 *space_index = '\0';
2094 es1800_break_vec = strtol (args, (char **) NULL, 0);
2095 es1800_break_address = parse_and_eval_address (space_index + 1);
2097 es1800_create_break_insn (es1800_break_insn, es1800_break_vec);
2101 send_with_reply ("VBR ", buf, sizeof (buf));
2103 for (k = 0; k < 4; k++)
2105 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
2107 error ("Emulator reply is too short: %s", buf);
2109 base_addr[k] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
2111 /* base addr of exception vector table */
2112 memaddress = *((CORE_ADDR *) base_addr);
2115 memaddress += (es1800_break_vec + 32) * 4; /* address of trap vector */
2117 sprintf (buf, "@.L%lx=$%lx", memaddress, es1800_break_address);
2118 send_command (buf); /* set the address of the break routine in the */
2121 sprintf (buf, "@.L%lx=$4E714E71", es1800_break_address); /* NOP; NOP */
2123 sprintf (buf, "@.L%lx=$4E714E73", es1800_break_address + 4); /* NOP; RTE */
2126 sprintf (buf, "AC2=$%lx", es1800_break_address + 4);
2127 /* breakpoint at es1800-break_address */
2129 send_command ("WHEN AC2 THEN BRK"); /* ie in exception routine */
2133 printf ("Breakpoint (trap $%x) routine at address: %lx\n",
2134 es1800_break_vec, es1800_break_address);
2139 es1800_child_open (arg, from_tty)
2143 error ("Use the \"run\" command to start a child process.");
2147 es1800_child_detach (args, from_tty)
2153 error ("Argument given to \"detach\" when remotely debugging.");
2159 printf ("Ending debugging the process %d.\n", inferior_pid);
2164 /* Define the target subroutine names */
2166 static struct target_ops es1800_ops =
2168 "es1800", /* to_shortname */
2170 "Remote serial target in ES1800-emulator protocol",
2172 "Remote debugging on the es1800 emulator via a serial line.\n\
2173 Specify the serial device it is connected to (e.g. /dev/ttya).",
2174 es1800_open, /* to_open */
2175 es1800_close, /* to_close */
2176 es1800_attach, /* to_attach */
2177 es1800_detach, /* to_detach */
2178 es1800_resume, /* to_resume */
2180 NULL, /* to_fetch_registers */
2181 NULL, /* to_store_registers */
2182 es1800_prepare_to_store, /* to_prepare_to_store */
2183 es1800_xfer_inferior_memory, /* to_xfer_memory */
2184 es1800_files_info, /* to_files_info */
2185 es1800_insert_breakpoint, /* to_insert_breakpoint */
2186 es1800_remove_breakpoint, /* to_remove_breakpoint */
2187 NULL, /* to_terminal_init */
2188 NULL, /* to_terminal_inferior */
2189 NULL, /* to_terminal_ours_for_output */
2190 NULL, /* to_terminal_ours */
2191 NULL, /* to_terminal_info */
2193 es1800_load, /* to_load */
2194 NULL, /* to_lookup_symbol */
2195 es1800_create_inferior, /* to_create_inferior */
2196 NULL, /* to_mourn_inferior */
2198 0, /* notice_signals */
2199 core_stratum, /* to_stratum */
2201 0, /* to_has_all_memory */
2202 1, /* to_has_memory */
2203 0, /* to_has_stack */
2204 0, /* to_has_registers */
2205 0, /* to_has_execution */
2206 NULL, /* to_sections */
2207 NULL, /* to_sections_end */
2208 OPS_MAGIC /* to_magic (always last) */
2211 /* Define the target subroutine names */
2213 static struct target_ops es1800_child_ops =
2215 "es1800_process", /* to_shortname */
2217 "Remote serial target in ES1800-emulator protocol",
2219 "Remote debugging on the es1800 emulator via a serial line.\n\
2220 Specify the serial device it is connected to (e.g. /dev/ttya).",
2221 es1800_child_open, /* to_open */
2222 NULL, /* to_close */
2223 es1800_attach, /* to_attach */
2224 es1800_child_detach, /* to_detach */
2225 es1800_resume, /* to_resume */
2226 es1800_wait, /* to_wait */
2227 es1800_fetch_register, /* to_fetch_registers */
2228 es1800_store_register, /* to_store_registers */
2229 es1800_prepare_to_store, /* to_prepare_to_store */
2230 es1800_xfer_inferior_memory, /* to_xfer_memory */
2231 es1800_files_info, /* to_files_info */
2232 es1800_insert_breakpoint, /* to_insert_breakpoint */
2233 es1800_remove_breakpoint, /* to_remove_breakpoint */
2234 NULL, /* to_terminal_init */
2235 NULL, /* to_terminal_inferior */
2236 NULL, /* to_terminal_ours_for_output */
2237 NULL, /* to_terminal_ours */
2238 NULL, /* to_terminal_info */
2239 es1800_kill, /* to_kill */
2240 es1800_load, /* to_load */
2241 NULL, /* to_lookup_symbol */
2242 es1800_create_inferior, /* to_create_inferior */
2243 es1800_mourn_inferior, /* to_mourn_inferior */
2245 0, /* notice_signals */
2246 process_stratum, /* to_stratum */
2248 1, /* to_has_all_memory */
2249 1, /* to_has_memory */
2250 1, /* to_has_stack */
2251 1, /* to_has_registers */
2252 1, /* to_has_execution */
2253 NULL, /* to_sections */
2254 NULL, /* to_sections_end */
2255 OPS_MAGIC /* to_magic (always last) */
2259 _initialize_es1800 ()
2261 add_target (&es1800_ops);
2262 add_target (&es1800_child_ops);
2263 add_com ("transparent", class_support, es1800_transparent,
2264 "Start transparent communication with the ES 1800 emulator.");
2265 add_com ("init_break", class_support, es1800_init_break,
2266 "Download break routine and initialize break facility on ES 1800");