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 byJohan 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));
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 (!strcmp (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 (step, siggnal)
661 error ("Can't send signals to a remote system.");
665 strcpy (buf,"STP\r");
670 send_command ("RBK");
674 /* Wait until the remote machine stops, then return,
675 storing status in STATUS just as `wait' would.
682 unsigned char buf[PBUFSIZ];
683 int old_timeout = timeout;
685 WSETEXIT ((*status), 0);
686 timeout = 0; /* Don't time out -- user program is running. */
687 if (!setjmp (interrupt))
689 old_sigint = signal (SIGINT, es1800_request_quit);
692 getmessage (buf, sizeof(buf));
693 if (strncmp ( buf, "\r\n* BREAK *", 11) == 0)
695 WSETSTOP ((*status), SIGTRAP);
696 send_command ("STP"); /* Restore stack and PC and such */
699 send_command ("STP");
703 if (strncmp (buf, "STP\r\n ", 6) == 0)
705 WSETSTOP ((*status), SIGTRAP);
708 if (buf[strlen (buf) - 2] == 'R')
710 printf ("Unexpected emulator reply: \n%s\n", buf);
714 printf ("Unexpected stop: \n%s\n", buf);
715 WSETSTOP ((*status), SIGQUIT);
723 printf ("\nStopping emulator...");
724 if (!setjmp (interrupt))
726 old_sigint = signal (SIGINT, es1800_request_quit);
727 send_command ("STP");
728 printf (" emulator stopped\n");
729 WSETSTOP ((*status), SIGINT);
734 es1800_reset ((char*) 1);
737 signal (SIGINT, old_sigint);
738 timeout = old_timeout;
743 /* Fetch register values from remote machine.
744 regno - the register to be fetched (fetch all registers if -1) */
747 es1800_fetch_register (regno)
754 static char regtab[18][4] =
756 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
757 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
761 if ((regno < 15) || (regno == 16) || (regno == 17))
764 send_with_reply (regtab[regno], buf, sizeof (buf));
766 for (k = 0; k < 4; k++)
768 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
770 error ("Emulator reply is too short: %s", buf);
772 registers[r++] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
777 es1800_fetch_registers ();
781 /* Read the remote registers into REGISTERS.
782 Always fetches all registers. */
785 es1800_fetch_registers ()
788 char SR_buf[PBUFSIZ];
794 send_with_reply ("DR", buf, sizeof (buf));
796 /* Reply is edited to a string that describes registers byte by byte,
797 each byte encoded as two hex characters. */
802 /* parsing row one - D0-D7-registers */
804 while (*p++ != '\n') {;}
805 for (i = 4; i < 70; i += (i == 39 ? 3 : 1))
807 for (k = 0; k < 4; k++)
809 if (p[i+0] == 0 || p[i+1] == 0)
811 error ("Emulator reply is too short: %s", buf);
813 registers[r++] = (fromhex (p[i+0]) * 16) + fromhex (p[i+1]);
819 /* parsing row two - A0-A6-registers */
821 while (*p++ != '\n') {;}
822 for (i = 4; i < 61; i += (i == 39 ? 3 : 1))
824 for (k = 0; k < 4; k++)
826 if (p[i+0] == 0 || p[i+1] == 0)
828 error ("Emulator reply is too short: %s", buf);
830 registers[r++] = (fromhex (p[i+0])) * 16 + fromhex (p[i+1]);
836 while (*p++ != '\n') {;}
838 /* fetch SSP-, SR- and PC-registers */
840 /* first - check STATUS-word and decide which stackpointer to use */
842 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
848 if (*p == '3') /* use masterstackpointer MSP */
850 send_with_reply ("MSP", buf, sizeof (buf));
852 else if (*p == '2') /* use interruptstackpointer ISP */
854 send_with_reply ("ISP", buf, sizeof (buf));
856 else /* use userstackpointer USP */
858 send_with_reply ("USP", buf, sizeof (buf));
861 for (k = 0; k<4; k++)
863 if (p[k*2+1] == 0 || p[k*2+2] == 0)
865 error ("Emulator reply is too short: %s", buf);
867 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
871 for (k = 0; k < 4; k++)
873 if (p[k*2+1] == 0 || p[k*2+2] == 0)
875 error ("Emulator reply is too short: %s", buf);
878 fromhex (SR_buf[k*2+1]) * 16 + fromhex (SR_buf[k*2+2]);
880 send_with_reply ("PC", buf, sizeof (buf));
882 for (k = 0; k<4; k++)
884 if (p[k*2+1] == 0 || p[k*2+2] == 0)
886 error ("Emulator reply is too short: %s", buf);
888 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
891 else /* 68000-mode */
893 if (*p == '2') /* use supervisorstackpointer SSP */
895 send_with_reply ("SSP", buf, sizeof (buf));
897 else /* use userstackpointer USP */
899 send_with_reply ("USP", buf, sizeof (buf));
902 /* fetch STACKPOINTER */
905 for (k = 0; k < 4; k++)
907 if (p[k*2 + 1] == 0 || p[k*2 + 2] == 0)
909 error ("Emulator reply is too short: %s", buf);
911 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
917 for (k = 0; k < 4; k++)
919 if (p[k*2+1] == 0 || p[k*2+2] == 0)
921 error ("Emulator reply is too short: %s", buf);
924 fromhex (SR_buf[k*2+1]) * 16 + fromhex (SR_buf[k*2+2]);
929 send_with_reply ("PC", buf, sizeof (buf));
931 for (k = 0; k < 4; k++)
933 if (p[k*2+1] == 0 || p[k*2+2] == 0)
935 error ("Emulator reply is too short: %s", buf);
937 registers[r++] = fromhex (buf[k*2+1]) * 16 + fromhex (buf[k*2+2]);
942 /* Store register value, located in REGISTER, on the target processor.
943 regno - the register-number of the register to store
944 (-1 means store them all)
945 FIXME: Return errno value. */
948 es1800_store_register(regno)
952 static char regtab[18][4] =
954 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
955 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
960 char SR_buf[PBUFSIZ];
961 char stack_pointer[4];
968 r = (unsigned char *) registers;
970 if (regno == -1) /* write all registers */
975 else /* write one register */
982 if ((regno == -1) || (regno == 15))
984 /* fetch current status */
985 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
990 if (*p == '3') /* use masterstackpointer MSP */
992 strcpy (stack_pointer,"MSP");
996 if (*p == '2') /* use interruptstackpointer ISP */
998 strcpy (stack_pointer,"ISP");
1002 strcpy (stack_pointer,"USP"); /* use userstackpointer USP */
1006 else /* 68000-mode */
1008 if (*p == '2') /* use supervisorstackpointer SSP */
1010 strcpy (stack_pointer,"SSP");
1014 strcpy (stack_pointer,"USP");/* use userstackpointer USP */
1017 strcpy (regtab[15],stack_pointer);
1020 for (i = j; i<k; i++)
1022 buf[0] = regtab[i][0];
1023 buf[1] = regtab[i][1];
1024 buf[2] = regtab[i][2];
1027 buf[5] = tohex ((*r >> 4) & 0x0f);
1028 buf[6] = tohex (*r++ & 0x0f);
1029 buf[7] = tohex ((*r >> 4) & 0x0f);
1030 buf[8] = tohex (*r++ & 0x0f);
1031 buf[9] = tohex ((*r >> 4) & 0x0f);
1032 buf[10] = tohex (*r++ & 0x0f);
1033 buf[11] = tohex ((*r >> 4) & 0x0f);
1034 buf[12] = tohex (*r++ & 0x0f);
1037 send_with_reply (buf, buf, sizeof (buf)); /* FIXME, reply not used? */
1042 /* Prepare to store registers. */
1045 es1800_prepare_to_store ()
1047 /* Do nothing, since we can store individual regs */
1050 /* Convert hex digit A to a number. */
1056 if (a >= '0' && a <= '9')
1060 else if (a >= 'a' && a <= 'f')
1062 return a - 'a' + 10;
1064 else if (a >= 'A' && a <= 'F')
1066 return a - 'A' + 10;
1070 error ("Reply contains invalid hex digit");
1076 /* Convert number NIB to a hex digit. */
1088 return ('A' + nib - 10);
1092 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
1093 to or from debugger address MYADDR. Write to inferior if WRITE is
1094 nonzero. Returns length of data written or read; 0 for error.
1096 memaddr - the target's address
1097 myaddr - gdb's address
1098 len - number of bytes
1099 write - write if != 0 otherwise read */
1102 es1800_xfer_inferior_memory (memaddr, myaddr, len, write, tops)
1107 struct target_ops *tops; /* Unused */
1114 xfersize = len > MAXBUFBYTES ? MAXBUFBYTES : len;
1117 es1800_write_bytes (memaddr, myaddr, xfersize);
1121 es1800_read_bytes (memaddr, myaddr, xfersize);
1123 memaddr += xfersize;
1127 return (origlen); /* no error possible */
1131 /* Write memory data directly to the emulator.
1132 This does not inform the data cache; the data cache uses this.
1133 MEMADDR is the address in the remote memory space.
1134 MYADDR is the address of the buffer in our space.
1135 LEN is the number of bytes.
1137 memaddr - the target's address
1138 myaddr - gdb's address
1139 len - number of bytes */
1142 es1800_write_bytes (memaddr, myaddr, len)
1152 for (i = 0; i < len; i++)
1154 sprintf (buf, "@.B$%x=$%x", memaddr+i, (*p++) & 0xff);
1155 send_with_reply (buf, buf, sizeof (buf)); /* FIXME send_command? */
1160 /* Read memory data directly from the emulator.
1161 This does not use the data cache; the data cache uses this.
1163 memaddr - the target's address
1164 myaddr - gdb's address
1165 len - number of bytes */
1168 es1800_read_bytes (memaddr, myaddr, len)
1173 static int DB_tab[16] = {8,11,14,17,20,23,26,29,34,37,40,43,46,49,52,55};
1180 if (len > PBUFSIZ / 2 - 1)
1185 if (len == 1) /* The emulator does not like expressions like: */
1187 len = 2; /* DB.B $20018 TO $20018 */
1190 /* Reply describes registers byte by byte, each byte encoded as two hex
1193 sprintf (buf, "DB.B $%x TO $%x", memaddr, memaddr+len-1);
1194 send_with_reply (buf, buf, sizeof (buf));
1196 low_addr = memaddr&0x0f;
1197 for (i = low_addr; i < low_addr + len; i++)
1199 if ((!(i % 16)) && i)
1200 { /* if (i = 16,32,48) */
1201 while (*p++!='\n') {;}
1204 p = b + DB_tab[i%16] + (m68020 ? 2 : 0);
1205 if (p[0] == 32 || p[1] == 32)
1207 error ("Emulator reply is too short: %s", buf);
1209 myaddr[i-low_addr] = fromhex (p[0]) * 16 + fromhex (p[1]);
1213 /* Information about the current target */
1216 es1800_files_info (tops)
1217 struct target_ops *tops; /* Unused */
1219 printf ("ES1800 Attached to %s at %d baud in %s mode\n", savename, 19200,
1224 /* We read the contents of the target location and stash it,
1225 then overwrite it with a breakpoint instruction.
1227 addr - is the target location in the target machine.
1228 contents_cache - is a pointer to memory allocated for saving the target contents.
1229 It is guaranteed by the caller to be long enough to save sizeof
1232 FIXME: This size is target_arch dependent and should be available in
1233 the target_arch transfer vector, if we ever have one... */
1236 es1800_insert_breakpoint (addr, contents_cache)
1238 char *contents_cache;
1242 val = target_read_memory (addr, contents_cache, sizeof (es1800_break_insn));
1246 val = target_write_memory (addr, es1800_break_insn,
1247 sizeof (es1800_break_insn));
1254 /* Write back the stashed instruction
1256 addr - is the target location in the target machine.
1257 contents_cache - is a pointer to memory allocated for saving the target contents.
1258 It is guaranteed by the caller to be long enough to save sizeof
1259 BREAKPOINT bytes. */
1262 es1800_remove_breakpoint (addr, contents_cache)
1264 char *contents_cache;
1267 return (target_write_memory (addr, contents_cache,
1268 sizeof (es1800_break_insn)));
1271 /* create_break_insn ()
1272 Primitive datastructures containing the es1800 breakpoint instruction */
1275 es1800_create_break_insn (ins, vec)
1288 Seach for breakpoint routine in emulator memory.
1289 returns non-zero on failure
1290 vec - trap vector used for breakpoints */
1296 CORE_ADDR memaddress;
1298 char *instr = "NqNqNqNs"; /* breakpoint routine */
1301 get_break_addr (vec, &memaddress);
1305 status = target_read_memory (memaddress, buf, 8);
1308 memory_error (status, memaddress);
1310 return (strcmp (instr, buf));
1316 /* get_break_addr ()
1317 find address of breakpint routine
1318 vec - trap vector used for breakpoints
1319 addrp - store the address here */
1322 get_break_addr (vec, addrp)
1326 CORE_ADDR memaddress = 0;
1335 send_with_reply ("VBR ", buf, sizeof (buf));
1337 for (k = 0; k < 4; k++)
1339 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
1341 error ("Emulator reply is too short: %s", buf);
1343 base_addr[k] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
1345 /* base addr of exception vector table */
1346 memaddress = *((CORE_ADDR *) base_addr);
1349 memaddress += (vec + 32) * 4; /* address of trap vector */
1350 status = target_read_memory (memaddress, (char *) addrp, 4);
1353 memory_error (status, memaddress);
1358 /* Kill an inferior process */
1363 if (inferior_pid != 0)
1366 es1800_mourn_inferior ();
1371 /* Load a file to the ES1800 emulator.
1372 Converts the file from a.out format into Extended Tekhex format
1373 before the file is loaded.
1374 Also loads the trap routine, and sets the ES1800 breakpoint on it
1375 filename - the a.out to be loaded
1376 from_tty - says whether to be verbose or not
1377 FIXME Uses emulator overlay memory for trap routine */
1380 es1800_load (filename, from_tty)
1388 struct cleanup *old_chain;
1389 int es1800_load_format = 5;
1391 if (es1800_desc < 0)
1393 printf ("No emulator attached, type emulator-command first\n");
1397 filename = tilde_expand (filename);
1398 make_cleanup (free, filename);
1400 switch (es1800_load_format)
1402 case 2: /* Extended Tekhex */
1405 printf ("Converting \"%s\" to Extended Tekhex Format\n", filename);
1407 sprintf (buf, "tekhex %s", filename);
1409 sprintf (loadname, "out.hex");
1412 case 5: /* Motorola S-rec */
1415 printf ("Converting \"%s\" to Motorola S-record format\n",
1418 /* in the future the source code in copy (part of binutils-1.93) will
1419 be included in this file */
1421 "copy -s \"a.out-sunos-big\" -d \"srec\" %s /tmp/out.hex",
1424 sprintf (loadname, "/tmp/out.hex");
1428 error ("Downloading format not defined\n");
1431 mark_breakpoints_out ();
1435 printf ("Downloading \"%s\" to the ES 1800\n",filename);
1437 if ((instream = fopen (loadname, "r")) == NULL)
1439 perror_with_name ("fopen:");
1442 old_chain = make_cleanup (fclose, instream);
1447 download (instream, from_tty, es1800_load_format);
1449 /* if breakpoint routine is not present anymore we have to check
1450 whether to download a new breakpoint routine or not */
1452 if ((verify_break (es1800_break_vec) != 0)
1453 && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
1456 printf ("Using break vector 0x%x\n", es1800_break_vec);
1457 sprintf (buf, "0x%x ", es1800_break_vec);
1458 printf ("Give the start address of the breakpoint routine: ");
1459 fgets (buf + strlen (buf), sizeof (buf) - strlen (buf), stdin);
1460 es1800_init_break (buf, 0);
1463 do_cleanups (old_chain);
1465 readchar (); /* FIXME I am getting a ^G = 7 after the prompt */
1468 if (fclose (instream) == EOF)
1473 if (es1800_load_format != 2)
1475 sprintf (buf, "/usr/bin/rm %s", loadname);
1479 symbol_file_command (filename, from_tty); /* reading symbol table */
1485 #define NUMCPYBYTES 20
1488 bfd_copy (from_bfd, to_bfd)
1494 char buf[NUMCPYBYTES];
1496 for (p = from_bfd->sections; p != NULL; p = p->next)
1498 printf (" Copying section %s. Size = %x.\n", p->name, p->_cooked_size);
1499 printf (" vma = %x, offset = %x, output_sec = %x\n",
1500 p->vma, p->output_offset, p->output_section);
1501 new = bfd_make_section (to_bfd, p->name);
1502 if (p->_cooked_size &&
1503 !bfd_set_section_size (to_bfd, new, p->_cooked_size))
1505 error ("Wrong BFD size!\n");
1507 if (!bfd_set_section_flags (to_bfd, new, p->flags))
1509 error ("bfd_set_section_flags");
1513 for (i = 0; (i + NUMCPYBYTES) < p->_cooked_size ; i += NUMCPYBYTES)
1515 if (!bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1516 (bfd_size_type) NUMCPYBYTES))
1518 error ("bfd_get_section_contents\n");
1520 if (!bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
1521 (bfd_size_type) NUMCPYBYTES))
1523 error ("bfd_set_section_contents\n");
1526 bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1527 (bfd_size_type) (p->_cooked_size - i));
1528 bfd_set_section_contents (to_bfd, new, (PTR) buf,(file_ptr) i,
1529 (bfd_size_type) (p->_cooked_size - i));
1535 /* Start an process on the es1800 and set inferior_pid to the new
1537 execfile - the file to run
1538 args - arguments passed to the program
1539 env - the environment vector to pass */
1542 es1800_create_inferior (execfile, args, env)
1550 struct expression *expr;
1551 register struct cleanup *old_chain = 0;
1557 error ("Can't pass arguments to remote ES1800 process");
1561 if (query ("Use 'start' as entry point? "))
1563 expr = parse_c_expression ("start");
1564 old_chain = make_cleanup (free_current_contents, &expr);
1565 val = evaluate_expression (expr);
1566 entry_pt = (val->location).address;
1570 printf ("Enter the program's entry point (in hexadecimal): ");
1571 scanf ("%x", &entry_pt);
1575 if (execfile == 0 || exec_bfd == 0)
1577 error ("No exec file specified");
1580 entry_pt = (int) bfd_get_start_address (exec_bfd);
1584 /* Now that we have a child process, make it our target. */
1586 push_target (&es1800_child_ops);
1588 /* The "process" (board) is already stopped awaiting our commands, and
1589 the program is already downloaded. We just set its PC and go. */
1591 inferior_pid = pid; /* Needed for wait_for_inferior below */
1593 clear_proceed_status ();
1595 /* Tell wait_for_inferior that we've started a new process. */
1597 init_wait_for_inferior ();
1599 /* Set up the "saved terminal modes" of the inferior
1600 based on what modes we are starting it with. */
1602 target_terminal_init ();
1604 /* Install inferior's terminal modes. */
1606 target_terminal_inferior ();
1608 /* remote_start (args); */
1609 /* trap_expected = 0; */
1610 /* insert_step_breakpoint (); FIXME, do we need this? */
1612 proceed ((CORE_ADDR) entry_pt, -1, 0); /* Let 'er rip... */
1617 /* The process has died, clean up. */
1620 es1800_mourn_inferior ()
1622 remove_breakpoints ();
1623 unpush_target (&es1800_child_ops);
1624 generic_mourn_inferior (); /* Do all the proper things now */
1627 /* ES1800-protocol specific routines */
1629 /* Keep discarding input from the remote system, until STRING is found.
1630 Let the user break out immediately.
1631 string - the string to expect
1632 nowait - break out if string not the emulator's first respond otherwise
1633 read until string is found (== 0) */
1636 expect (string, nowait)
1651 if (c == toupper (*p))
1666 printf ("\'%s\' expected\n" , string);
1667 printf ("char %d is %d", p - string, c);
1673 /* Keep discarding input until we see the prompt. */
1682 /* Read one character */
1686 /* read from stdin */
1694 printf ("readchar, give one character\n");
1697 #if defined (LOG_FILE)
1698 putc (buf[0] & 0x7f, log_file);
1701 return (buf[0] & 0x7f);
1704 #else /* !DEBUG_STDIN */
1706 /* Read a character from the remote system, doing all the fancy
1718 /* termio does the timeout for us. */
1719 read (es1800_desc, buf, 1);
1724 while (read (es1800_desc, buf, 1) != 1)
1728 error ("Timeout reading from remote system.");
1730 else if (errno != EWOULDBLOCK)
1732 perror_with_name ("remote read");
1738 #if defined (LOG_FILE)
1739 putc (buf[0] & 0x7f, log_file);
1743 return (buf[0] & 0x7f);
1746 #endif /* DEBUG_STDIN */
1749 /* Send a command to the emulator and save the reply.
1750 Report an error if we get an error reply.
1751 string - the es1800 command
1752 buf - containing the emulator reply on return
1753 len - size of buf */
1756 send_with_reply (string, buf, len)
1761 write (es1800_desc, "\r", 1);
1768 getmessage (buf, len);
1772 /* Send the command in STR to the emulator adding \r. check
1773 the echo for consistency.
1774 string - the es1800 command */
1777 send_command (string)
1781 write (es1800_desc, "\r", 1);
1791 string - the es1800 command */
1799 fprintf (stderr, "Sending: %s\n", string);
1801 write (es1800_desc, string, strlen (string));
1805 /* Read a message from the emulator and store it in BUF.
1806 buf - containing the emulator reply on return
1807 len - size of buf */
1810 getmessage (buf, len)
1816 int prompt_found = 0;
1819 #if defined (LOG_FILE)
1820 /* This is a convenient place to do this. The idea is to do it often
1821 enough that we never lose much data if we terminate abnormally. */
1831 if (len-- < 2) /* char and terminaling NULL */
1833 error ("input buffer overrun\n");
1838 if ((c == '>') && (*(bp - 1) == ' '))
1843 while (!prompt_found);
1848 fprintf (stderr,"message received :%s\n", buf);
1853 download (instream, from_tty, format)
1862 send_command ("SET #2,$1A"); /* reset char = ^Z */
1863 send_command ("SET #3,$11,$13"); /* XON XOFF */
1866 send_command ("SET #26,#2");
1870 send_command ("SET #26,#5"); /* Format=Extended Tekhex */
1872 send_command ("DFB = $10");
1873 send_command ("PUR");
1874 send_command ("CES");
1879 printf (" 0 records loaded...\r");
1881 while (fgets (buf, 160, instream))
1886 printf ("%5d\b\b\b\b\b",++i);
1889 if ((c = readchar ()) != 006)
1891 error ("expected ACK");
1900 /* Additional commands */
1902 /* Talk directly to the emulator
1903 FIXME, uses busy wait, and is SUNOS (or at least BSD) specific */
1907 es1800_transparent (args, from_tty)
1912 struct sgttyb modebl;
1915 struct sgttyb console_mode_save;
1916 int console_fc_save;
1921 char consolebuf[80];
1923 char es1800_buf[80];
1927 if (es1800_desc < 0)
1929 printf ("No emulator attached, type emulator-command first\n");
1934 printf ("You are now communicating directly with the ES 1800 emulator.\n");
1935 printf ("To leave this mode (transparent mode), press ^E.\n");
1940 if ((console = open ("/dev/tty", O_RDWR)) == -1)
1942 perror_with_name ("/dev/tty:");
1945 if ((fcflag = fcntl (console, F_GETFL, 0)) == -1)
1947 perror_with_name ("fcntl console");
1950 console_fc_save = fcflag;
1951 fcflag = fcflag | FNDELAY;
1953 if (fcntl (console, F_SETFL, fcflag) == -1)
1955 perror_with_name ("fcntl console");
1958 if (ioctl (console, TIOCGETP, &modebl))
1960 perror_with_name ("ioctl console");
1963 console_mode_save = modebl;
1964 modebl.sg_flags = RAW;
1966 if (ioctl (console, TIOCSETP, &modebl))
1968 perror_with_name ("ioctl console");
1971 if ((fcflag = fcntl (es1800_desc, F_GETFL, 0)) == -1)
1973 perror_with_name ("fcntl serial");
1976 es1800_fc_save = fcflag;
1977 fcflag = fcflag | FNDELAY;
1979 if (fcntl (es1800_desc, F_SETFL, fcflag) == -1)
1981 perror_with_name ("fcntl serial");
1986 cc = read (console, inputbuf, inputcnt);
1989 if ((*inputbuf & 0x7f) == 0x05)
1993 for (i = 0; i < cc; )
1995 es1800_buf[es1800_cnt++] = inputbuf[i++];
1997 if ((cc = write (es1800_desc, es1800_buf, es1800_cnt)) == -1)
1999 perror_with_name ("FEL! read:");
2002 if (es1800_cnt && cc)
2004 for (i = 0; i < es1800_cnt; i++)
2006 es1800_buf[i] = es1800_buf[cc+i];
2010 else if (errno != EWOULDBLOCK)
2012 perror_with_name ("FEL! read:");
2015 cc = read (es1800_desc,inputbuf,inputcnt);
2018 for (i = 0; i < cc; )
2020 consolebuf[consolecnt++] = inputbuf[i++];
2022 if ((cc = write (console,consolebuf,consolecnt)) == -1)
2024 perror_with_name ("FEL! write:");
2027 if (consolecnt && cc)
2029 for (i = 0; i < consolecnt; i++)
2031 consolebuf[i] = consolebuf[cc+i];
2035 else if (errno != EWOULDBLOCK)
2037 perror_with_name ("FEL! read:");
2041 console_fc_save = console_fc_save & !FNDELAY;
2042 if (fcntl (console, F_SETFL, console_fc_save) == -1)
2044 perror_with_name ("FEL! fcntl");
2047 if (ioctl (console, TIOCSETP, &console_mode_save))
2049 perror_with_name ("FEL! ioctl");
2054 if (fcntl (es1800_desc, F_SETFL, es1800_fc_save) == -1)
2056 perror_with_name ("FEL! fcntl");
2064 es1800_init_break (args, from_tty)
2068 CORE_ADDR memaddress = 0;
2077 error_no_arg ("a trap vector");
2080 if (!(space_index = strchr (args, ' ')))
2082 error ("Two arguments needed (trap vector and address of break routine).\n");
2085 *space_index = '\0';
2087 es1800_break_vec = strtol (args, (char **) NULL, 0);
2088 es1800_break_address = parse_and_eval_address (space_index + 1);
2090 es1800_create_break_insn (es1800_break_insn, es1800_break_vec);
2094 send_with_reply ("VBR ", buf, sizeof (buf));
2096 for (k = 0; k < 4; k++)
2098 if ((p[k*2 + 1] == 0) || (p[k*2 + 2] == 0))
2100 error ("Emulator reply is too short: %s", buf);
2102 base_addr[k] = (fromhex (p[k*2 + 1]) * 16) + fromhex (p[k*2 + 2]);
2104 /* base addr of exception vector table */
2105 memaddress = *((CORE_ADDR *) base_addr);
2108 memaddress += (es1800_break_vec + 32) * 4; /* address of trap vector */
2110 sprintf (buf, "@.L%lx=$%lx", memaddress, es1800_break_address);
2111 send_command (buf); /* set the address of the break routine in the */
2114 sprintf (buf, "@.L%lx=$4E714E71", es1800_break_address); /* NOP; NOP */
2116 sprintf (buf, "@.L%lx=$4E714E73", es1800_break_address + 4); /* NOP; RTE */
2119 sprintf (buf, "AC2=$%lx", es1800_break_address + 4);
2120 /* breakpoint at es1800-break_address */
2122 send_command ("WHEN AC2 THEN BRK"); /* ie in exception routine */
2126 printf ("Breakpoint (trap $%x) routine at address: %lx\n",
2127 es1800_break_vec, es1800_break_address);
2132 es1800_child_open (arg, from_tty)
2136 error ("Use the \"run\" command to start a child process.");
2140 es1800_child_detach (args, from_tty)
2146 error ("Argument given to \"detach\" when remotely debugging.");
2152 printf ("Ending debugging the process %d.\n", inferior_pid);
2157 /* Define the target subroutine names */
2159 static struct target_ops es1800_ops =
2161 "es1800", /* to_shortname */
2163 "Remote serial target in ES1800-emulator protocol",
2165 "Remote debugging on the es1800 emulator via a serial line.\n\
2166 Specify the serial device it is connected to (e.g. /dev/ttya).",
2167 es1800_open, /* to_open */
2168 es1800_close, /* to_close */
2169 es1800_attach, /* to_attach */
2170 es1800_detach, /* to_detach */
2171 es1800_resume, /* to_resume */
2173 NULL, /* to_fetch_registers */
2174 NULL, /* to_store_registers */
2175 es1800_prepare_to_store, /* to_prepare_to_store */
2176 es1800_xfer_inferior_memory, /* to_xfer_memory */
2177 es1800_files_info, /* to_files_info */
2178 es1800_insert_breakpoint, /* to_insert_breakpoint */
2179 es1800_remove_breakpoint, /* to_remove_breakpoint */
2180 NULL, /* to_terminal_init */
2181 NULL, /* to_terminal_inferior */
2182 NULL, /* to_terminal_ours_for_output */
2183 NULL, /* to_terminal_ours */
2184 NULL, /* to_terminal_info */
2186 es1800_load, /* to_load */
2187 NULL, /* to_lookup_symbol */
2188 es1800_create_inferior, /* to_create_inferior */
2189 NULL, /* to_mourn_inferior */
2191 0, /* notice_signals */
2192 core_stratum, /* to_stratum */
2194 0, /* to_has_all_memory */
2195 1, /* to_has_memory */
2196 0, /* to_has_stack */
2197 0, /* to_has_registers */
2198 0, /* to_has_execution */
2199 NULL, /* to_sections */
2200 NULL, /* to_sections_end */
2201 OPS_MAGIC /* to_magic (always last) */
2204 /* Define the target subroutine names */
2206 static struct target_ops es1800_child_ops =
2208 "es1800_process", /* to_shortname */
2210 "Remote serial target in ES1800-emulator protocol",
2212 "Remote debugging on the es1800 emulator via a serial line.\n\
2213 Specify the serial device it is connected to (e.g. /dev/ttya).",
2214 es1800_child_open, /* to_open */
2215 NULL, /* to_close */
2216 es1800_attach, /* to_attach */
2217 es1800_child_detach, /* to_detach */
2218 es1800_resume, /* to_resume */
2219 es1800_wait, /* to_wait */
2220 es1800_fetch_register, /* to_fetch_registers */
2221 es1800_store_register, /* to_store_registers */
2222 es1800_prepare_to_store, /* to_prepare_to_store */
2223 es1800_xfer_inferior_memory, /* to_xfer_memory */
2224 es1800_files_info, /* to_files_info */
2225 es1800_insert_breakpoint, /* to_insert_breakpoint */
2226 es1800_remove_breakpoint, /* to_remove_breakpoint */
2227 NULL, /* to_terminal_init */
2228 NULL, /* to_terminal_inferior */
2229 NULL, /* to_terminal_ours_for_output */
2230 NULL, /* to_terminal_ours */
2231 NULL, /* to_terminal_info */
2232 es1800_kill, /* to_kill */
2233 es1800_load, /* to_load */
2234 NULL, /* to_lookup_symbol */
2235 es1800_create_inferior, /* to_create_inferior */
2236 es1800_mourn_inferior, /* to_mourn_inferior */
2238 0, /* notice_signals */
2239 process_stratum, /* to_stratum */
2241 1, /* to_has_all_memory */
2242 1, /* to_has_memory */
2243 1, /* to_has_stack */
2244 1, /* to_has_registers */
2245 1, /* to_has_execution */
2246 NULL, /* to_sections */
2247 NULL, /* to_sections_end */
2248 OPS_MAGIC /* to_magic (always last) */
2251 /* _initialize_es1800 () */
2254 _initialize_es1800 ()
2256 add_target (&es1800_ops);
2257 add_target (&es1800_child_ops);
2258 add_com ("transparent", class_support, es1800_transparent,
2259 "Start transparent communication with the ES 1800 emulator.");
2260 add_com ("init_break", class_support, es1800_init_break,
2261 "Download break routine and initialize break facility on ES 1800");