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"
111 #include <sys/types.h>
117 /* External variables referenced. */
119 extern bfd *exec_bfd;
121 /* Prototypes for local functions */
124 es1800_child_detach PARAMS ((char *, int));
127 es1800_child_open PARAMS ((char *, int));
130 es1800_transparent PARAMS ((char *, int));
133 es1800_create_inferior PARAMS ((char *, char *, char **));
136 es1800_load PARAMS ((char *, int));
139 es1800_kill PARAMS ((void));
142 verify_break PARAMS ((int));
145 es1800_remove_breakpoint PARAMS ((CORE_ADDR, char *));
148 es1800_insert_breakpoint PARAMS ((CORE_ADDR, char *));
151 es1800_files_info PARAMS ((struct target_ops *));
154 es1800_xfer_inferior_memory PARAMS ((CORE_ADDR, char *, int, int,
155 struct target_ops *));
158 es1800_prepare_to_store PARAMS ((void));
161 es1800_wait PARAMS ((WAITTYPE *));
164 es1800_resume PARAMS ((int, int, int));
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 baudrate = baud_rate ? baud_rate : "19200"; /* default baudrate = 19200 */
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)
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.
683 unsigned char buf[PBUFSIZ];
684 int old_timeout = timeout;
686 WSETEXIT ((*status), 0);
687 timeout = 0; /* Don't time out -- user program is running. */
688 if (!setjmp (interrupt))
690 old_sigint = signal (SIGINT, es1800_request_quit);
693 getmessage (buf, sizeof(buf));
694 if (strncmp ( buf, "\r\n* BREAK *", 11) == 0)
696 WSETSTOP ((*status), SIGTRAP);
697 send_command ("STP"); /* Restore stack and PC and such */
700 send_command ("STP");
704 if (strncmp (buf, "STP\r\n ", 6) == 0)
706 WSETSTOP ((*status), SIGTRAP);
709 if (buf[strlen (buf) - 2] == 'R')
711 printf ("Unexpected emulator reply: \n%s\n", buf);
715 printf ("Unexpected stop: \n%s\n", buf);
716 WSETSTOP ((*status), SIGQUIT);
724 printf ("\nStopping emulator...");
725 if (!setjmp (interrupt))
727 old_sigint = signal (SIGINT, es1800_request_quit);
728 send_command ("STP");
729 printf (" emulator stopped\n");
730 WSETSTOP ((*status), SIGINT);
735 es1800_reset ((char*) 1);
738 signal (SIGINT, old_sigint);
739 timeout = old_timeout;
744 /* Fetch register values from remote machine.
745 regno - the register to be fetched (fetch all registers if -1) */
748 es1800_fetch_register (regno)
755 static char regtab[18][4] =
757 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
758 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
762 if ((regno < 15) || (regno == 16) || (regno == 17))
765 send_with_reply (regtab[regno], buf, sizeof (buf));
767 for (k = 0; k < 4; k++)
769 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
771 error ("Emulator reply is too short: %s", buf);
773 registers[r++] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
778 es1800_fetch_registers ();
782 /* Read the remote registers into REGISTERS.
783 Always fetches all registers. */
786 es1800_fetch_registers ()
789 char SR_buf[PBUFSIZ];
795 send_with_reply ("DR", buf, sizeof (buf));
797 /* Reply is edited to a string that describes registers byte by byte,
798 each byte encoded as two hex characters. */
803 /* parsing row one - D0-D7-registers */
805 while (*p++ != '\n') {;}
806 for (i = 4; i < 70; i += (i == 39 ? 3 : 1))
808 for (k = 0; k < 4; k++)
810 if (p[i+0] == 0 || p[i+1] == 0)
812 error ("Emulator reply is too short: %s", buf);
814 registers[r++] = (fromhex (p[i+0]) * 16) + fromhex (p[i+1]);
820 /* parsing row two - A0-A6-registers */
822 while (*p++ != '\n') {;}
823 for (i = 4; i < 61; i += (i == 39 ? 3 : 1))
825 for (k = 0; k < 4; k++)
827 if (p[i+0] == 0 || p[i+1] == 0)
829 error ("Emulator reply is too short: %s", buf);
831 registers[r++] = (fromhex (p[i+0])) * 16 + fromhex (p[i+1]);
837 while (*p++ != '\n') {;}
839 /* fetch SSP-, SR- and PC-registers */
841 /* first - check STATUS-word and decide which stackpointer to use */
843 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
849 if (*p == '3') /* use masterstackpointer MSP */
851 send_with_reply ("MSP", buf, sizeof (buf));
853 else if (*p == '2') /* use interruptstackpointer ISP */
855 send_with_reply ("ISP", buf, sizeof (buf));
857 else /* use userstackpointer USP */
859 send_with_reply ("USP", buf, sizeof (buf));
862 for (k = 0; k<4; k++)
864 if (p[k*2+1] == 0 || p[k*2+2] == 0)
866 error ("Emulator reply is too short: %s", buf);
868 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
872 for (k = 0; k < 4; k++)
874 if (p[k*2+1] == 0 || p[k*2+2] == 0)
876 error ("Emulator reply is too short: %s", buf);
879 fromhex (SR_buf[k*2+1]) * 16 + fromhex (SR_buf[k*2+2]);
881 send_with_reply ("PC", buf, sizeof (buf));
883 for (k = 0; k<4; k++)
885 if (p[k*2+1] == 0 || p[k*2+2] == 0)
887 error ("Emulator reply is too short: %s", buf);
889 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
892 else /* 68000-mode */
894 if (*p == '2') /* use supervisorstackpointer SSP */
896 send_with_reply ("SSP", buf, sizeof (buf));
898 else /* use userstackpointer USP */
900 send_with_reply ("USP", buf, sizeof (buf));
903 /* fetch STACKPOINTER */
906 for (k = 0; k < 4; k++)
908 if (p[k*2 + 1] == 0 || p[k*2 + 2] == 0)
910 error ("Emulator reply is too short: %s", buf);
912 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
918 for (k = 0; k < 4; k++)
920 if (p[k*2+1] == 0 || p[k*2+2] == 0)
922 error ("Emulator reply is too short: %s", buf);
925 fromhex (SR_buf[k*2+1]) * 16 + fromhex (SR_buf[k*2+2]);
930 send_with_reply ("PC", buf, sizeof (buf));
932 for (k = 0; k < 4; k++)
934 if (p[k*2+1] == 0 || p[k*2+2] == 0)
936 error ("Emulator reply is too short: %s", buf);
938 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
943 /* Store register value, located in REGISTER, on the target processor.
944 regno - the register-number of the register to store
945 (-1 means store them all)
946 FIXME: Return errno value. */
949 es1800_store_register(regno)
953 static char regtab[18][4] =
955 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
956 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
961 char SR_buf[PBUFSIZ];
962 char stack_pointer[4];
969 r = (unsigned char *) registers;
971 if (regno == -1) /* write all registers */
976 else /* write one register */
983 if ((regno == -1) || (regno == 15))
985 /* fetch current status */
986 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
991 if (*p == '3') /* use masterstackpointer MSP */
993 strcpy (stack_pointer,"MSP");
997 if (*p == '2') /* use interruptstackpointer ISP */
999 strcpy (stack_pointer,"ISP");
1003 strcpy (stack_pointer,"USP"); /* use userstackpointer USP */
1007 else /* 68000-mode */
1009 if (*p == '2') /* use supervisorstackpointer SSP */
1011 strcpy (stack_pointer,"SSP");
1015 strcpy (stack_pointer,"USP");/* use userstackpointer USP */
1018 strcpy (regtab[15],stack_pointer);
1021 for (i = j; i<k; i++)
1023 buf[0] = regtab[i][0];
1024 buf[1] = regtab[i][1];
1025 buf[2] = regtab[i][2];
1028 buf[5] = tohex ((*r >> 4) & 0x0f);
1029 buf[6] = tohex (*r++ & 0x0f);
1030 buf[7] = tohex ((*r >> 4) & 0x0f);
1031 buf[8] = tohex (*r++ & 0x0f);
1032 buf[9] = tohex ((*r >> 4) & 0x0f);
1033 buf[10] = tohex (*r++ & 0x0f);
1034 buf[11] = tohex ((*r >> 4) & 0x0f);
1035 buf[12] = tohex (*r++ & 0x0f);
1038 send_with_reply (buf, buf, sizeof (buf)); /* FIXME, reply not used? */
1043 /* Prepare to store registers. */
1046 es1800_prepare_to_store ()
1048 /* Do nothing, since we can store individual regs */
1051 /* Convert hex digit A to a number. */
1057 if (a >= '0' && a <= '9')
1061 else if (a >= 'a' && a <= 'f')
1063 return a - 'a' + 10;
1065 else if (a >= 'A' && a <= 'F')
1067 return a - 'A' + 10;
1071 error ("Reply contains invalid hex digit");
1077 /* Convert number NIB to a hex digit. */
1089 return ('A' + nib - 10);
1093 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
1094 to or from debugger address MYADDR. Write to inferior if WRITE is
1095 nonzero. Returns length of data written or read; 0 for error.
1097 memaddr - the target's address
1098 myaddr - gdb's address
1099 len - number of bytes
1100 write - write if != 0 otherwise read */
1103 es1800_xfer_inferior_memory (memaddr, myaddr, len, write, tops)
1108 struct target_ops *tops; /* Unused */
1115 xfersize = len > MAXBUFBYTES ? MAXBUFBYTES : len;
1118 es1800_write_bytes (memaddr, myaddr, xfersize);
1122 es1800_read_bytes (memaddr, myaddr, xfersize);
1124 memaddr += xfersize;
1128 return (origlen); /* no error possible */
1132 /* Write memory data directly to the emulator.
1133 This does not inform the data cache; the data cache uses this.
1134 MEMADDR is the address in the remote memory space.
1135 MYADDR is the address of the buffer in our space.
1136 LEN is the number of bytes.
1138 memaddr - the target's address
1139 myaddr - gdb's address
1140 len - number of bytes */
1143 es1800_write_bytes (memaddr, myaddr, len)
1153 for (i = 0; i < len; i++)
1155 sprintf (buf, "@.B$%x=$%x", memaddr+i, (*p++) & 0xff);
1156 send_with_reply (buf, buf, sizeof (buf)); /* FIXME send_command? */
1161 /* Read memory data directly from the emulator.
1162 This does not use the data cache; the data cache uses this.
1164 memaddr - the target's address
1165 myaddr - gdb's address
1166 len - number of bytes */
1169 es1800_read_bytes (memaddr, myaddr, len)
1174 static int DB_tab[16] = {8,11,14,17,20,23,26,29,34,37,40,43,46,49,52,55};
1181 if (len > PBUFSIZ / 2 - 1)
1186 if (len == 1) /* The emulator does not like expressions like: */
1188 len = 2; /* DB.B $20018 TO $20018 */
1191 /* Reply describes registers byte by byte, each byte encoded as two hex
1194 sprintf (buf, "DB.B $%x TO $%x", memaddr, memaddr+len-1);
1195 send_with_reply (buf, buf, sizeof (buf));
1197 low_addr = memaddr&0x0f;
1198 for (i = low_addr; i < low_addr + len; i++)
1200 if ((!(i % 16)) && i)
1201 { /* if (i = 16,32,48) */
1202 while (*p++!='\n') {;}
1205 p = b + DB_tab[i%16] + (m68020 ? 2 : 0);
1206 if (p[0] == 32 || p[1] == 32)
1208 error ("Emulator reply is too short: %s", buf);
1210 myaddr[i-low_addr] = fromhex (p[0]) * 16 + fromhex (p[1]);
1214 /* Information about the current target */
1217 es1800_files_info (tops)
1218 struct target_ops *tops; /* Unused */
1220 printf ("ES1800 Attached to %s at %d baud in %s mode\n", savename, 19200,
1225 /* We read the contents of the target location and stash it,
1226 then overwrite it with a breakpoint instruction.
1228 addr - is the target location in the target machine.
1229 contents_cache - is a pointer to memory allocated for saving the target contents.
1230 It is guaranteed by the caller to be long enough to save sizeof
1233 FIXME: This size is target_arch dependent and should be available in
1234 the target_arch transfer vector, if we ever have one... */
1237 es1800_insert_breakpoint (addr, contents_cache)
1239 char *contents_cache;
1243 val = target_read_memory (addr, contents_cache, sizeof (es1800_break_insn));
1247 val = target_write_memory (addr, es1800_break_insn,
1248 sizeof (es1800_break_insn));
1255 /* Write back the stashed instruction
1257 addr - is the target location in the target machine.
1258 contents_cache - is a pointer to memory allocated for saving the target contents.
1259 It is guaranteed by the caller to be long enough to save sizeof
1260 BREAKPOINT bytes. */
1263 es1800_remove_breakpoint (addr, contents_cache)
1265 char *contents_cache;
1268 return (target_write_memory (addr, contents_cache,
1269 sizeof (es1800_break_insn)));
1272 /* create_break_insn ()
1273 Primitive datastructures containing the es1800 breakpoint instruction */
1276 es1800_create_break_insn (ins, vec)
1289 Seach for breakpoint routine in emulator memory.
1290 returns non-zero on failure
1291 vec - trap vector used for breakpoints */
1297 CORE_ADDR memaddress;
1299 char *instr = "NqNqNqNs"; /* breakpoint routine */
1302 get_break_addr (vec, &memaddress);
1306 status = target_read_memory (memaddress, buf, 8);
1309 memory_error (status, memaddress);
1311 return (STRCMP (instr, buf));
1317 /* get_break_addr ()
1318 find address of breakpint routine
1319 vec - trap vector used for breakpoints
1320 addrp - store the address here */
1323 get_break_addr (vec, addrp)
1327 CORE_ADDR memaddress = 0;
1336 send_with_reply ("VBR ", buf, sizeof (buf));
1338 for (k = 0; k < 4; k++)
1340 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
1342 error ("Emulator reply is too short: %s", buf);
1344 base_addr[k] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
1346 /* base addr of exception vector table */
1347 memaddress = *((CORE_ADDR *) base_addr);
1350 memaddress += (vec + 32) * 4; /* address of trap vector */
1351 status = target_read_memory (memaddress, (char *) addrp, 4);
1354 memory_error (status, memaddress);
1359 /* Kill an inferior process */
1364 if (inferior_pid != 0)
1367 es1800_mourn_inferior ();
1372 /* Load a file to the ES1800 emulator.
1373 Converts the file from a.out format into Extended Tekhex format
1374 before the file is loaded.
1375 Also loads the trap routine, and sets the ES1800 breakpoint on it
1376 filename - the a.out to be loaded
1377 from_tty - says whether to be verbose or not
1378 FIXME Uses emulator overlay memory for trap routine */
1381 es1800_load (filename, from_tty)
1389 struct cleanup *old_chain;
1390 int es1800_load_format = 5;
1392 if (es1800_desc < 0)
1394 printf ("No emulator attached, type emulator-command first\n");
1398 filename = tilde_expand (filename);
1399 make_cleanup (free, filename);
1401 switch (es1800_load_format)
1403 case 2: /* Extended Tekhex */
1406 printf ("Converting \"%s\" to Extended Tekhex Format\n", filename);
1408 sprintf (buf, "tekhex %s", filename);
1410 sprintf (loadname, "out.hex");
1413 case 5: /* Motorola S-rec */
1416 printf ("Converting \"%s\" to Motorola S-record format\n",
1419 /* in the future the source code in copy (part of binutils-1.93) will
1420 be included in this file */
1422 "copy -s \"a.out-sunos-big\" -d \"srec\" %s /tmp/out.hex",
1425 sprintf (loadname, "/tmp/out.hex");
1429 error ("Downloading format not defined\n");
1432 mark_breakpoints_out ();
1436 printf ("Downloading \"%s\" to the ES 1800\n",filename);
1438 if ((instream = fopen (loadname, "r")) == NULL)
1440 perror_with_name ("fopen:");
1443 old_chain = make_cleanup (fclose, instream);
1448 download (instream, from_tty, es1800_load_format);
1450 /* if breakpoint routine is not present anymore we have to check
1451 whether to download a new breakpoint routine or not */
1453 if ((verify_break (es1800_break_vec) != 0)
1454 && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
1457 printf ("Using break vector 0x%x\n", es1800_break_vec);
1458 sprintf (buf, "0x%x ", es1800_break_vec);
1459 printf ("Give the start address of the breakpoint routine: ");
1460 fgets (buf + strlen (buf), sizeof (buf) - strlen (buf), stdin);
1461 es1800_init_break (buf, 0);
1464 do_cleanups (old_chain);
1466 readchar (); /* FIXME I am getting a ^G = 7 after the prompt */
1469 if (fclose (instream) == EOF)
1474 if (es1800_load_format != 2)
1476 sprintf (buf, "/usr/bin/rm %s", loadname);
1480 symbol_file_command (filename, from_tty); /* reading symbol table */
1486 #define NUMCPYBYTES 20
1489 bfd_copy (from_bfd, to_bfd)
1495 char buf[NUMCPYBYTES];
1497 for (p = from_bfd->sections; p != NULL; p = p->next)
1499 printf (" Copying section %s. Size = %x.\n", p->name, p->_cooked_size);
1500 printf (" vma = %x, offset = %x, output_sec = %x\n",
1501 p->vma, p->output_offset, p->output_section);
1502 new = bfd_make_section (to_bfd, p->name);
1503 if (p->_cooked_size &&
1504 !bfd_set_section_size (to_bfd, new, p->_cooked_size))
1506 error ("Wrong BFD size!\n");
1508 if (!bfd_set_section_flags (to_bfd, new, p->flags))
1510 error ("bfd_set_section_flags");
1514 for (i = 0; (i + NUMCPYBYTES) < p->_cooked_size ; i += NUMCPYBYTES)
1516 if (!bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1517 (bfd_size_type) NUMCPYBYTES))
1519 error ("bfd_get_section_contents\n");
1521 if (!bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
1522 (bfd_size_type) NUMCPYBYTES))
1524 error ("bfd_set_section_contents\n");
1527 bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1528 (bfd_size_type) (p->_cooked_size - i));
1529 bfd_set_section_contents (to_bfd, new, (PTR) buf,(file_ptr) i,
1530 (bfd_size_type) (p->_cooked_size - i));
1536 /* Start an process on the es1800 and set inferior_pid to the new
1538 execfile - the file to run
1539 args - arguments passed to the program
1540 env - the environment vector to pass */
1543 es1800_create_inferior (execfile, args, env)
1551 struct expression *expr;
1552 register struct cleanup *old_chain = 0;
1558 error ("Can't pass arguments to remote ES1800 process");
1562 if (query ("Use 'start' as entry point? "))
1564 expr = parse_c_expression ("start");
1565 old_chain = make_cleanup (free_current_contents, &expr);
1566 val = evaluate_expression (expr);
1567 entry_pt = (val->location).address;
1571 printf ("Enter the program's entry point (in hexadecimal): ");
1572 scanf ("%x", &entry_pt);
1576 if (execfile == 0 || exec_bfd == 0)
1578 error ("No exec file specified");
1581 entry_pt = (int) bfd_get_start_address (exec_bfd);
1585 /* Now that we have a child process, make it our target. */
1587 push_target (&es1800_child_ops);
1589 /* The "process" (board) is already stopped awaiting our commands, and
1590 the program is already downloaded. We just set its PC and go. */
1592 inferior_pid = pid; /* Needed for wait_for_inferior below */
1594 clear_proceed_status ();
1596 /* Tell wait_for_inferior that we've started a new process. */
1598 init_wait_for_inferior ();
1600 /* Set up the "saved terminal modes" of the inferior
1601 based on what modes we are starting it with. */
1603 target_terminal_init ();
1605 /* Install inferior's terminal modes. */
1607 target_terminal_inferior ();
1609 /* remote_start (args); */
1610 /* trap_expected = 0; */
1611 /* insert_step_breakpoint (); FIXME, do we need this? */
1613 proceed ((CORE_ADDR) entry_pt, -1, 0); /* Let 'er rip... */
1618 /* The process has died, clean up. */
1621 es1800_mourn_inferior ()
1623 remove_breakpoints ();
1624 unpush_target (&es1800_child_ops);
1625 generic_mourn_inferior (); /* Do all the proper things now */
1628 /* ES1800-protocol specific routines */
1630 /* Keep discarding input from the remote system, until STRING is found.
1631 Let the user break out immediately.
1632 string - the string to expect
1633 nowait - break out if string not the emulator's first respond otherwise
1634 read until string is found (== 0) */
1637 expect (string, nowait)
1652 if (c == toupper (*p))
1667 printf ("\'%s\' expected\n" , string);
1668 printf ("char %d is %d", p - string, c);
1674 /* Keep discarding input until we see the prompt. */
1683 /* Read one character */
1687 /* read from stdin */
1695 printf ("readchar, give one character\n");
1698 #if defined (LOG_FILE)
1699 putc (buf[0] & 0x7f, log_file);
1702 return (buf[0] & 0x7f);
1705 #else /* !DEBUG_STDIN */
1707 /* Read a character from the remote system, doing all the fancy
1719 /* termio does the timeout for us. */
1720 read (es1800_desc, buf, 1);
1725 while (read (es1800_desc, buf, 1) != 1)
1729 error ("Timeout reading from remote system.");
1731 else if (errno != EWOULDBLOCK)
1733 perror_with_name ("remote read");
1739 #if defined (LOG_FILE)
1740 putc (buf[0] & 0x7f, log_file);
1744 return (buf[0] & 0x7f);
1747 #endif /* DEBUG_STDIN */
1750 /* Send a command to the emulator and save the reply.
1751 Report an error if we get an error reply.
1752 string - the es1800 command
1753 buf - containing the emulator reply on return
1754 len - size of buf */
1757 send_with_reply (string, buf, len)
1762 write (es1800_desc, "\r", 1);
1769 getmessage (buf, len);
1773 /* Send the command in STR to the emulator adding \r. check
1774 the echo for consistency.
1775 string - the es1800 command */
1778 send_command (string)
1782 write (es1800_desc, "\r", 1);
1792 string - the es1800 command */
1800 fprintf (stderr, "Sending: %s\n", string);
1802 write (es1800_desc, string, strlen (string));
1806 /* Read a message from the emulator and store it in BUF.
1807 buf - containing the emulator reply on return
1808 len - size of buf */
1811 getmessage (buf, len)
1817 int prompt_found = 0;
1820 #if defined (LOG_FILE)
1821 /* This is a convenient place to do this. The idea is to do it often
1822 enough that we never lose much data if we terminate abnormally. */
1832 if (len-- < 2) /* char and terminaling NULL */
1834 error ("input buffer overrun\n");
1839 if ((c == '>') && (*(bp - 1) == ' '))
1844 while (!prompt_found);
1849 fprintf (stderr,"message received :%s\n", buf);
1854 download (instream, from_tty, format)
1863 send_command ("SET #2,$1A"); /* reset char = ^Z */
1864 send_command ("SET #3,$11,$13"); /* XON XOFF */
1867 send_command ("SET #26,#2");
1871 send_command ("SET #26,#5"); /* Format=Extended Tekhex */
1873 send_command ("DFB = $10");
1874 send_command ("PUR");
1875 send_command ("CES");
1880 printf (" 0 records loaded...\r");
1882 while (fgets (buf, 160, instream))
1887 printf ("%5d\b\b\b\b\b",++i);
1890 if ((c = readchar ()) != 006)
1892 error ("expected ACK");
1901 /* Additional commands */
1903 /* Talk directly to the emulator
1904 FIXME, uses busy wait, and is SUNOS (or at least BSD) specific */
1908 es1800_transparent (args, from_tty)
1913 struct sgttyb modebl;
1916 struct sgttyb console_mode_save;
1917 int console_fc_save;
1922 char consolebuf[80];
1924 char es1800_buf[80];
1928 if (es1800_desc < 0)
1930 printf ("No emulator attached, type emulator-command first\n");
1935 printf ("You are now communicating directly with the ES 1800 emulator.\n");
1936 printf ("To leave this mode (transparent mode), press ^E.\n");
1941 if ((console = open ("/dev/tty", O_RDWR)) == -1)
1943 perror_with_name ("/dev/tty:");
1946 if ((fcflag = fcntl (console, F_GETFL, 0)) == -1)
1948 perror_with_name ("fcntl console");
1951 console_fc_save = fcflag;
1952 fcflag = fcflag | FNDELAY;
1954 if (fcntl (console, F_SETFL, fcflag) == -1)
1956 perror_with_name ("fcntl console");
1959 if (ioctl (console, TIOCGETP, &modebl))
1961 perror_with_name ("ioctl console");
1964 console_mode_save = modebl;
1965 modebl.sg_flags = RAW;
1967 if (ioctl (console, TIOCSETP, &modebl))
1969 perror_with_name ("ioctl console");
1972 if ((fcflag = fcntl (es1800_desc, F_GETFL, 0)) == -1)
1974 perror_with_name ("fcntl serial");
1977 es1800_fc_save = fcflag;
1978 fcflag = fcflag | FNDELAY;
1980 if (fcntl (es1800_desc, F_SETFL, fcflag) == -1)
1982 perror_with_name ("fcntl serial");
1987 cc = read (console, inputbuf, inputcnt);
1990 if ((*inputbuf & 0x7f) == 0x05)
1994 for (i = 0; i < cc; )
1996 es1800_buf[es1800_cnt++] = inputbuf[i++];
1998 if ((cc = write (es1800_desc, es1800_buf, es1800_cnt)) == -1)
2000 perror_with_name ("FEL! read:");
2003 if (es1800_cnt && cc)
2005 for (i = 0; i < es1800_cnt; i++)
2007 es1800_buf[i] = es1800_buf[cc+i];
2011 else if (errno != EWOULDBLOCK)
2013 perror_with_name ("FEL! read:");
2016 cc = read (es1800_desc,inputbuf,inputcnt);
2019 for (i = 0; i < cc; )
2021 consolebuf[consolecnt++] = inputbuf[i++];
2023 if ((cc = write (console,consolebuf,consolecnt)) == -1)
2025 perror_with_name ("FEL! write:");
2028 if (consolecnt && cc)
2030 for (i = 0; i < consolecnt; i++)
2032 consolebuf[i] = consolebuf[cc+i];
2036 else if (errno != EWOULDBLOCK)
2038 perror_with_name ("FEL! read:");
2042 console_fc_save = console_fc_save & !FNDELAY;
2043 if (fcntl (console, F_SETFL, console_fc_save) == -1)
2045 perror_with_name ("FEL! fcntl");
2048 if (ioctl (console, TIOCSETP, &console_mode_save))
2050 perror_with_name ("FEL! ioctl");
2055 if (fcntl (es1800_desc, F_SETFL, es1800_fc_save) == -1)
2057 perror_with_name ("FEL! fcntl");
2065 es1800_init_break (args, from_tty)
2069 CORE_ADDR memaddress = 0;
2078 error_no_arg ("a trap vector");
2081 if (!(space_index = strchr (args, ' ')))
2083 error ("Two arguments needed (trap vector and address of break routine).\n");
2086 *space_index = '\0';
2088 es1800_break_vec = strtol (args, (char **) NULL, 0);
2089 es1800_break_address = parse_and_eval_address (space_index + 1);
2091 es1800_create_break_insn (es1800_break_insn, es1800_break_vec);
2095 send_with_reply ("VBR ", buf, sizeof (buf));
2097 for (k = 0; k < 4; k++)
2099 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
2101 error ("Emulator reply is too short: %s", buf);
2103 base_addr[k] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
2105 /* base addr of exception vector table */
2106 memaddress = *((CORE_ADDR *) base_addr);
2109 memaddress += (es1800_break_vec + 32) * 4; /* address of trap vector */
2111 sprintf (buf, "@.L%lx=$%lx", memaddress, es1800_break_address);
2112 send_command (buf); /* set the address of the break routine in the */
2115 sprintf (buf, "@.L%lx=$4E714E71", es1800_break_address); /* NOP; NOP */
2117 sprintf (buf, "@.L%lx=$4E714E73", es1800_break_address + 4); /* NOP; RTE */
2120 sprintf (buf, "AC2=$%lx", es1800_break_address + 4);
2121 /* breakpoint at es1800-break_address */
2123 send_command ("WHEN AC2 THEN BRK"); /* ie in exception routine */
2127 printf ("Breakpoint (trap $%x) routine at address: %lx\n",
2128 es1800_break_vec, es1800_break_address);
2133 es1800_child_open (arg, from_tty)
2137 error ("Use the \"run\" command to start a child process.");
2141 es1800_child_detach (args, from_tty)
2147 error ("Argument given to \"detach\" when remotely debugging.");
2153 printf ("Ending debugging the process %d.\n", inferior_pid);
2158 /* Define the target subroutine names */
2160 static struct target_ops es1800_ops =
2162 "es1800", /* to_shortname */
2164 "Remote serial target in ES1800-emulator protocol",
2166 "Remote debugging on the es1800 emulator via a serial line.\n\
2167 Specify the serial device it is connected to (e.g. /dev/ttya).",
2168 es1800_open, /* to_open */
2169 es1800_close, /* to_close */
2170 es1800_attach, /* to_attach */
2171 es1800_detach, /* to_detach */
2172 es1800_resume, /* to_resume */
2174 NULL, /* to_fetch_registers */
2175 NULL, /* to_store_registers */
2176 es1800_prepare_to_store, /* to_prepare_to_store */
2177 es1800_xfer_inferior_memory, /* to_xfer_memory */
2178 es1800_files_info, /* to_files_info */
2179 es1800_insert_breakpoint, /* to_insert_breakpoint */
2180 es1800_remove_breakpoint, /* to_remove_breakpoint */
2181 NULL, /* to_terminal_init */
2182 NULL, /* to_terminal_inferior */
2183 NULL, /* to_terminal_ours_for_output */
2184 NULL, /* to_terminal_ours */
2185 NULL, /* to_terminal_info */
2187 es1800_load, /* to_load */
2188 NULL, /* to_lookup_symbol */
2189 es1800_create_inferior, /* to_create_inferior */
2190 NULL, /* to_mourn_inferior */
2192 0, /* notice_signals */
2193 core_stratum, /* to_stratum */
2195 0, /* to_has_all_memory */
2196 1, /* to_has_memory */
2197 0, /* to_has_stack */
2198 0, /* to_has_registers */
2199 0, /* to_has_execution */
2200 NULL, /* to_sections */
2201 NULL, /* to_sections_end */
2202 OPS_MAGIC /* to_magic (always last) */
2205 /* Define the target subroutine names */
2207 static struct target_ops es1800_child_ops =
2209 "es1800_process", /* to_shortname */
2211 "Remote serial target in ES1800-emulator protocol",
2213 "Remote debugging on the es1800 emulator via a serial line.\n\
2214 Specify the serial device it is connected to (e.g. /dev/ttya).",
2215 es1800_child_open, /* to_open */
2216 NULL, /* to_close */
2217 es1800_attach, /* to_attach */
2218 es1800_child_detach, /* to_detach */
2219 es1800_resume, /* to_resume */
2220 es1800_wait, /* to_wait */
2221 es1800_fetch_register, /* to_fetch_registers */
2222 es1800_store_register, /* to_store_registers */
2223 es1800_prepare_to_store, /* to_prepare_to_store */
2224 es1800_xfer_inferior_memory, /* to_xfer_memory */
2225 es1800_files_info, /* to_files_info */
2226 es1800_insert_breakpoint, /* to_insert_breakpoint */
2227 es1800_remove_breakpoint, /* to_remove_breakpoint */
2228 NULL, /* to_terminal_init */
2229 NULL, /* to_terminal_inferior */
2230 NULL, /* to_terminal_ours_for_output */
2231 NULL, /* to_terminal_ours */
2232 NULL, /* to_terminal_info */
2233 es1800_kill, /* to_kill */
2234 es1800_load, /* to_load */
2235 NULL, /* to_lookup_symbol */
2236 es1800_create_inferior, /* to_create_inferior */
2237 es1800_mourn_inferior, /* to_mourn_inferior */
2239 0, /* notice_signals */
2240 process_stratum, /* to_stratum */
2242 1, /* to_has_all_memory */
2243 1, /* to_has_memory */
2244 1, /* to_has_stack */
2245 1, /* to_has_registers */
2246 1, /* to_has_execution */
2247 NULL, /* to_sections */
2248 NULL, /* to_sections_end */
2249 OPS_MAGIC /* to_magic (always last) */
2252 /* _initialize_es1800 () */
2255 _initialize_es1800 ()
2257 add_target (&es1800_ops);
2258 add_target (&es1800_child_ops);
2259 add_com ("transparent", class_support, es1800_transparent,
2260 "Start transparent communication with the ES 1800 emulator.");
2261 add_com ("init_break", class_support, es1800_init_break,
2262 "Download break routine and initialize break facility on ES 1800");