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 /* Let 'er rip... */
1620 proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0);
1625 /* The process has died, clean up. */
1628 es1800_mourn_inferior ()
1630 remove_breakpoints ();
1631 unpush_target (&es1800_child_ops);
1632 generic_mourn_inferior (); /* Do all the proper things now */
1635 /* ES1800-protocol specific routines */
1637 /* Keep discarding input from the remote system, until STRING is found.
1638 Let the user break out immediately.
1639 string - the string to expect
1640 nowait - break out if string not the emulator's first respond otherwise
1641 read until string is found (== 0) */
1644 expect (string, nowait)
1659 if (c == toupper (*p))
1674 printf ("\'%s\' expected\n" , string);
1675 printf ("char %d is %d", p - string, c);
1681 /* Keep discarding input until we see the prompt. */
1690 /* Read one character */
1694 /* read from stdin */
1702 printf ("readchar, give one character\n");
1705 #if defined (LOG_FILE)
1706 putc (buf[0] & 0x7f, log_file);
1709 return (buf[0] & 0x7f);
1712 #else /* !DEBUG_STDIN */
1714 /* Read a character from the remote system, doing all the fancy
1726 /* termio does the timeout for us. */
1727 read (es1800_desc, buf, 1);
1732 while (read (es1800_desc, buf, 1) != 1)
1736 error ("Timeout reading from remote system.");
1738 else if (errno != EWOULDBLOCK)
1740 perror_with_name ("remote read");
1746 #if defined (LOG_FILE)
1747 putc (buf[0] & 0x7f, log_file);
1751 return (buf[0] & 0x7f);
1754 #endif /* DEBUG_STDIN */
1757 /* Send a command to the emulator and save the reply.
1758 Report an error if we get an error reply.
1759 string - the es1800 command
1760 buf - containing the emulator reply on return
1761 len - size of buf */
1764 send_with_reply (string, buf, len)
1769 write (es1800_desc, "\r", 1);
1776 getmessage (buf, len);
1780 /* Send the command in STR to the emulator adding \r. check
1781 the echo for consistency.
1782 string - the es1800 command */
1785 send_command (string)
1789 write (es1800_desc, "\r", 1);
1799 string - the es1800 command */
1807 fprintf (stderr, "Sending: %s\n", string);
1809 write (es1800_desc, string, strlen (string));
1813 /* Read a message from the emulator and store it in BUF.
1814 buf - containing the emulator reply on return
1815 len - size of buf */
1818 getmessage (buf, len)
1824 int prompt_found = 0;
1827 #if defined (LOG_FILE)
1828 /* This is a convenient place to do this. The idea is to do it often
1829 enough that we never lose much data if we terminate abnormally. */
1839 if (len-- < 2) /* char and terminaling NULL */
1841 error ("input buffer overrun\n");
1846 if ((c == '>') && (*(bp - 1) == ' '))
1851 while (!prompt_found);
1856 fprintf (stderr,"message received :%s\n", buf);
1861 download (instream, from_tty, format)
1870 send_command ("SET #2,$1A"); /* reset char = ^Z */
1871 send_command ("SET #3,$11,$13"); /* XON XOFF */
1874 send_command ("SET #26,#2");
1878 send_command ("SET #26,#5"); /* Format=Extended Tekhex */
1880 send_command ("DFB = $10");
1881 send_command ("PUR");
1882 send_command ("CES");
1887 printf (" 0 records loaded...\r");
1889 while (fgets (buf, 160, instream))
1894 printf ("%5d\b\b\b\b\b",++i);
1897 if ((c = readchar ()) != 006)
1899 error ("expected ACK");
1908 /* Additional commands */
1910 /* Talk directly to the emulator
1911 FIXME, uses busy wait, and is SUNOS (or at least BSD) specific */
1915 es1800_transparent (args, from_tty)
1920 struct sgttyb modebl;
1923 struct sgttyb console_mode_save;
1924 int console_fc_save;
1929 char consolebuf[80];
1931 char es1800_buf[80];
1935 if (es1800_desc < 0)
1937 printf ("No emulator attached, type emulator-command first\n");
1942 printf ("You are now communicating directly with the ES 1800 emulator.\n");
1943 printf ("To leave this mode (transparent mode), press ^E.\n");
1948 if ((console = open ("/dev/tty", O_RDWR)) == -1)
1950 perror_with_name ("/dev/tty:");
1953 if ((fcflag = fcntl (console, F_GETFL, 0)) == -1)
1955 perror_with_name ("fcntl console");
1958 console_fc_save = fcflag;
1959 fcflag = fcflag | FNDELAY;
1961 if (fcntl (console, F_SETFL, fcflag) == -1)
1963 perror_with_name ("fcntl console");
1966 if (ioctl (console, TIOCGETP, &modebl))
1968 perror_with_name ("ioctl console");
1971 console_mode_save = modebl;
1972 modebl.sg_flags = RAW;
1974 if (ioctl (console, TIOCSETP, &modebl))
1976 perror_with_name ("ioctl console");
1979 if ((fcflag = fcntl (es1800_desc, F_GETFL, 0)) == -1)
1981 perror_with_name ("fcntl serial");
1984 es1800_fc_save = fcflag;
1985 fcflag = fcflag | FNDELAY;
1987 if (fcntl (es1800_desc, F_SETFL, fcflag) == -1)
1989 perror_with_name ("fcntl serial");
1994 cc = read (console, inputbuf, inputcnt);
1997 if ((*inputbuf & 0x7f) == 0x05)
2001 for (i = 0; i < cc; )
2003 es1800_buf[es1800_cnt++] = inputbuf[i++];
2005 if ((cc = write (es1800_desc, es1800_buf, es1800_cnt)) == -1)
2007 perror_with_name ("FEL! read:");
2010 if (es1800_cnt && cc)
2012 for (i = 0; i < es1800_cnt; i++)
2014 es1800_buf[i] = es1800_buf[cc+i];
2018 else if (errno != EWOULDBLOCK)
2020 perror_with_name ("FEL! read:");
2023 cc = read (es1800_desc,inputbuf,inputcnt);
2026 for (i = 0; i < cc; )
2028 consolebuf[consolecnt++] = inputbuf[i++];
2030 if ((cc = write (console,consolebuf,consolecnt)) == -1)
2032 perror_with_name ("FEL! write:");
2035 if (consolecnt && cc)
2037 for (i = 0; i < consolecnt; i++)
2039 consolebuf[i] = consolebuf[cc+i];
2043 else if (errno != EWOULDBLOCK)
2045 perror_with_name ("FEL! read:");
2049 console_fc_save = console_fc_save & !FNDELAY;
2050 if (fcntl (console, F_SETFL, console_fc_save) == -1)
2052 perror_with_name ("FEL! fcntl");
2055 if (ioctl (console, TIOCSETP, &console_mode_save))
2057 perror_with_name ("FEL! ioctl");
2062 if (fcntl (es1800_desc, F_SETFL, es1800_fc_save) == -1)
2064 perror_with_name ("FEL! fcntl");
2072 es1800_init_break (args, from_tty)
2076 CORE_ADDR memaddress = 0;
2085 error_no_arg ("a trap vector");
2088 if (!(space_index = strchr (args, ' ')))
2090 error ("Two arguments needed (trap vector and address of break routine).\n");
2093 *space_index = '\0';
2095 es1800_break_vec = strtol (args, (char **) NULL, 0);
2096 es1800_break_address = parse_and_eval_address (space_index + 1);
2098 es1800_create_break_insn (es1800_break_insn, es1800_break_vec);
2102 send_with_reply ("VBR ", buf, sizeof (buf));
2104 for (k = 0; k < 4; k++)
2106 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
2108 error ("Emulator reply is too short: %s", buf);
2110 base_addr[k] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
2112 /* base addr of exception vector table */
2113 memaddress = *((CORE_ADDR *) base_addr);
2116 memaddress += (es1800_break_vec + 32) * 4; /* address of trap vector */
2118 sprintf (buf, "@.L%lx=$%lx", memaddress, es1800_break_address);
2119 send_command (buf); /* set the address of the break routine in the */
2122 sprintf (buf, "@.L%lx=$4E714E71", es1800_break_address); /* NOP; NOP */
2124 sprintf (buf, "@.L%lx=$4E714E73", es1800_break_address + 4); /* NOP; RTE */
2127 sprintf (buf, "AC2=$%lx", es1800_break_address + 4);
2128 /* breakpoint at es1800-break_address */
2130 send_command ("WHEN AC2 THEN BRK"); /* ie in exception routine */
2134 printf ("Breakpoint (trap $%x) routine at address: %lx\n",
2135 es1800_break_vec, es1800_break_address);
2140 es1800_child_open (arg, from_tty)
2144 error ("Use the \"run\" command to start a child process.");
2148 es1800_child_detach (args, from_tty)
2154 error ("Argument given to \"detach\" when remotely debugging.");
2160 printf ("Ending debugging the process %d.\n", inferior_pid);
2165 /* Define the target subroutine names */
2167 static struct target_ops es1800_ops =
2169 "es1800", /* to_shortname */
2171 "Remote serial target in ES1800-emulator protocol",
2173 "Remote debugging on the es1800 emulator via a serial line.\n\
2174 Specify the serial device it is connected to (e.g. /dev/ttya).",
2175 es1800_open, /* to_open */
2176 es1800_close, /* to_close */
2177 es1800_attach, /* to_attach */
2178 es1800_detach, /* to_detach */
2179 es1800_resume, /* to_resume */
2181 NULL, /* to_fetch_registers */
2182 NULL, /* to_store_registers */
2183 es1800_prepare_to_store, /* to_prepare_to_store */
2184 es1800_xfer_inferior_memory, /* to_xfer_memory */
2185 es1800_files_info, /* to_files_info */
2186 es1800_insert_breakpoint, /* to_insert_breakpoint */
2187 es1800_remove_breakpoint, /* to_remove_breakpoint */
2188 NULL, /* to_terminal_init */
2189 NULL, /* to_terminal_inferior */
2190 NULL, /* to_terminal_ours_for_output */
2191 NULL, /* to_terminal_ours */
2192 NULL, /* to_terminal_info */
2194 es1800_load, /* to_load */
2195 NULL, /* to_lookup_symbol */
2196 es1800_create_inferior, /* to_create_inferior */
2197 NULL, /* to_mourn_inferior */
2199 0, /* notice_signals */
2200 core_stratum, /* to_stratum */
2202 0, /* to_has_all_memory */
2203 1, /* to_has_memory */
2204 0, /* to_has_stack */
2205 0, /* to_has_registers */
2206 0, /* to_has_execution */
2207 NULL, /* to_sections */
2208 NULL, /* to_sections_end */
2209 OPS_MAGIC /* to_magic (always last) */
2212 /* Define the target subroutine names */
2214 static struct target_ops es1800_child_ops =
2216 "es1800_process", /* to_shortname */
2218 "Remote serial target in ES1800-emulator protocol",
2220 "Remote debugging on the es1800 emulator via a serial line.\n\
2221 Specify the serial device it is connected to (e.g. /dev/ttya).",
2222 es1800_child_open, /* to_open */
2223 NULL, /* to_close */
2224 es1800_attach, /* to_attach */
2225 es1800_child_detach, /* to_detach */
2226 es1800_resume, /* to_resume */
2227 es1800_wait, /* to_wait */
2228 es1800_fetch_register, /* to_fetch_registers */
2229 es1800_store_register, /* to_store_registers */
2230 es1800_prepare_to_store, /* to_prepare_to_store */
2231 es1800_xfer_inferior_memory, /* to_xfer_memory */
2232 es1800_files_info, /* to_files_info */
2233 es1800_insert_breakpoint, /* to_insert_breakpoint */
2234 es1800_remove_breakpoint, /* to_remove_breakpoint */
2235 NULL, /* to_terminal_init */
2236 NULL, /* to_terminal_inferior */
2237 NULL, /* to_terminal_ours_for_output */
2238 NULL, /* to_terminal_ours */
2239 NULL, /* to_terminal_info */
2240 es1800_kill, /* to_kill */
2241 es1800_load, /* to_load */
2242 NULL, /* to_lookup_symbol */
2243 es1800_create_inferior, /* to_create_inferior */
2244 es1800_mourn_inferior, /* to_mourn_inferior */
2246 0, /* notice_signals */
2247 process_stratum, /* to_stratum */
2249 1, /* to_has_all_memory */
2250 1, /* to_has_memory */
2251 1, /* to_has_stack */
2252 1, /* to_has_registers */
2253 1, /* to_has_execution */
2254 NULL, /* to_sections */
2255 NULL, /* to_sections_end */
2256 OPS_MAGIC /* to_magic (always last) */
2260 _initialize_es1800 ()
2262 add_target (&es1800_ops);
2263 add_target (&es1800_child_ops);
2264 add_com ("transparent", class_support, es1800_transparent,
2265 "Start transparent communication with the ES 1800 emulator.");
2266 add_com ("init_break", class_support, es1800_init_break,
2267 "Download break routine and initialize break facility on ES 1800");