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 this program; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. */
28 /* Emulator communication protocol.
29 All values are encoded in ascii hex digits.
36 - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - -- 6 - - 7 -
37 D = XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
38 A = XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
39 PC = XXXXXX SSP = XXXXXX USP = XXXXXX SR = XXXXXXXX
41 Each byte of register data is described by two hex digits.
63 Each byte of register data is described by two hex digits.
69 AA..AA is address, XXXXXXX is the contents
74 AA..AA is address, XXXXXXXX is data
80 AA..AA is address to resume. If AA..AA is omitted, resume at same address.
86 AA..AA is address to resume. If AA..AA is omitted, resume at same address.
96 #include <sys/ioctl.h>
103 #include "gdb_string.h"
105 #include "inferior.h"
107 #include "gdb_wait.h"
109 #include "remote-utils.h"
113 /* Prototypes for local functions */
115 static void es1800_child_detach (char *, int);
117 static void es1800_child_open (char *, int);
119 static void es1800_transparent (char *, int);
121 static void es1800_create_inferior (char *, char *, char **);
123 static void es1800_load (char *, int);
125 static void es1800_kill (void);
127 static int verify_break (int);
129 static int es1800_remove_breakpoint (CORE_ADDR, char *);
131 static int es1800_insert_breakpoint (CORE_ADDR, char *);
133 static void es1800_files_info (struct target_ops *);
136 es1800_xfer_inferior_memory (CORE_ADDR, char *, int, int,
137 struct target_ops *);
139 static void es1800_prepare_to_store (void);
141 static int es1800_wait (int, struct target_waitstatus *);
143 static void es1800_resume (int, int, enum target_signal);
145 static void es1800_detach (char *, int);
147 static void es1800_attach (char *, int);
149 static int damn_b (char *);
151 static void es1800_open (char *, int);
153 static void es1800_timer (void);
155 static void es1800_reset (char *);
157 static void es1800_request_quit (void);
159 static int readchar (void);
161 static void expect (char *, int);
163 static void expect_prompt (void);
165 static void download (FILE *, int, int);
168 static void bfd_copy (bfd *, bfd *);
171 static void get_break_addr (int, CORE_ADDR *);
173 static int fromhex (int);
175 static int tohex (int);
177 static void es1800_close (int);
179 static void es1800_fetch_registers (void);
181 static void es1800_fetch_register (int);
183 static void es1800_store_register (int);
185 static void es1800_read_bytes (CORE_ADDR, char *, int);
187 static void es1800_write_bytes (CORE_ADDR, char *, int);
189 static void send_with_reply (char *, char *, int);
191 static void send_command (char *);
193 static void send (char *);
195 static void getmessage (char *, int);
197 static void es1800_mourn_inferior (void);
199 static void es1800_create_break_insn (char *, int);
201 static void es1800_init_break (char *, int);
203 /* Local variables */
205 /* FIXME: Convert this to use "set remotedebug" instead. */
206 #define LOG_FILE "es1800.log"
207 #if defined (LOG_FILE)
208 static FILE *log_file;
211 extern struct target_ops es1800_ops; /* Forward decl */
212 extern struct target_ops es1800_child_ops; /* Forward decl */
215 static int timeout = 100;
216 static char *savename; /* Name of i/o device used */
217 static serial_ttystate es1800_saved_ttystate;
218 static int es1800_fc_save; /* Save fcntl state */
220 /* indicates that the emulator uses 32-bit data-adress (68020-mode)
221 instead of 24-bit (68000 -mode) */
225 #define MODE (m68020 ? "M68020" : "M68000" )
226 #define ES1800_BREAK_VEC (0xf)
228 /* Descriptor for I/O to remote machine. Initialize it to NULL so that
229 es1800_open knows that we don't have a file open when the program
232 static serial_t es1800_desc = NULL;
235 #define HDRLEN sizeof("@.BAAAAAAAA=$VV\r")
237 /* Maximum number of bytes to read/write at once. The value here
238 is chosen to fill up a packet. */
240 #define MAXBUFBYTES ((PBUFSIZ-150)*16/75 )
242 static int es1800_break_vec = 0;
243 static char es1800_break_insn[2];
244 static long es1800_break_address;
245 static void (*old_sigint) (); /* Old signal-handler for sigint */
246 static jmp_buf interrupt;
248 /* Local signalhandler to allow breaking tranfers or program run.
249 Rely on global variables: old_sigint(), interrupt */
252 es1800_request_quit (void)
254 /* restore original signalhandler */
255 signal (SIGINT, old_sigint);
256 longjmp (interrupt, 1);
261 Sending reset character(octal 32) to emulator.
262 quit - return to '(esgdb)' prompt or continue */
265 es1800_reset (char *quit)
271 printf ("\nResetting emulator... ");
273 strcpy (buf, "\032");
283 /* Open a connection to a remote debugger and push the new target
284 onto the stack. Check if the emulator is responding and find out
285 what kind of processor the emulator is connected to.
286 Initiate the breakpoint handling in the emulator.
288 name - the filename used for communication (ex. '/dev/tta')
289 from_tty - says whether to be verbose or not */
292 es1800_open (char *name, int from_tty)
300 if (!name) /* no device name given in target command */
302 error_no_arg ("serial port device name");
305 target_preopen (from_tty);
308 /* open the device and configure it for communication */
312 es1800_desc = SERIAL_OPEN (name);
313 if (es1800_desc == NULL)
315 perror_with_name (name);
317 savename = savestring (name, strlen (name));
319 es1800_saved_ttystate = SERIAL_GET_TTY_STATE (es1800_desc);
321 if ((fcflag = fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_GETFL, 0)) == -1)
323 perror_with_name ("fcntl serial");
325 es1800_fc_save = fcflag;
327 fcflag = (fcflag & (FREAD | FWRITE)); /* mask out any funny stuff */
328 if (fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_SETFL, fcflag) == -1)
330 perror_with_name ("fcntl serial");
335 if (SERIAL_SETBAUDRATE (es1800_desc, baud_rate))
337 SERIAL_CLOSE (es1800_desc);
338 perror_with_name (name);
342 SERIAL_RAW (es1800_desc);
344 /* If there is something sitting in the buffer we might take it as a
345 response to a command, which would be bad. */
346 SERIAL_FLUSH_INPUT (es1800_desc);
348 #endif /* DEBUG_STDIN */
350 push_target (&es1800_ops); /* Switch to using remote target now */
353 printf ("Remote ES1800 debugging using %s\n", name);
356 #if defined (LOG_FILE)
358 log_file = fopen (LOG_FILE, "w");
359 if (log_file == NULL)
361 perror_with_name (LOG_FILE);
364 #endif /* LOG_FILE */
366 /* Hello? Are you there?, also check mode */
368 /* send_with_reply( "DB 0 TO 1", buf, sizeof(buf)); */
369 /* for (p = buf, i = 0; *p++ =='0';) *//* count the number of zeros */
373 getmessage (buf, sizeof (buf)); /* send reset character */
377 printf ("Checking mode.... ");
379 /* m68020 = (i==8); *//* if eight zeros then we are in m68020 mode */
381 /* What kind of processor am i talking to ? */
392 for (i = 0; i < 20; i++, p++)
395 m68020 = !strncmp (p, "68020", 5);
398 printf ("You are in %s(%c%c%c%c%c)-mode\n", MODE, p[0], p[1], p[2],
402 /* if no init_break statement is present in .gdb file we have to check
403 whether to download a breakpoint routine or not */
406 if ((es1800_break_vec == 0) || (verify_break (es1800_break_vec) != 0)
407 && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
409 CORE_ADDR memaddress;
410 printf ("Give the start address of the breakpoint routine: ");
411 scanf ("%li", &memaddress);
412 es1800_init_break ((es1800_break_vec ? es1800_break_vec :
413 ES1800_BREAK_VEC), memaddress);
419 /* Close out all files and local state before this target loses control.
420 quitting - are we quitting gdb now? */
423 es1800_close (int quitting)
425 if (es1800_desc != NULL)
427 printf ("\nClosing connection to emulator...\n");
428 if (SERIAL_SET_TTY_STATE (es1800_desc, es1800_saved_ttystate) < 0)
429 print_sys_errmsg ("warning: unable to restore tty state", errno);
430 fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_SETFL, es1800_fc_save);
431 SERIAL_CLOSE (es1800_desc);
434 if (savename != NULL)
440 #if defined (LOG_FILE)
442 if (log_file != NULL)
444 if (ferror (log_file))
446 printf ("Error writing log file.\n");
448 if (fclose (log_file) != 0)
450 printf ("Error closing log file.\n");
455 #endif /* LOG_FILE */
459 /* Attaches to a process on the target side
460 proc_id - the id of the process to be attached.
461 from_tty - says whether to be verbose or not */
464 es1800_attach (char *args, int from_tty)
466 error ("Cannot attach to pid %s, this feature is not implemented yet.",
471 /* Takes a program previously attached to and detaches it.
472 We better not have left any breakpoints
473 in the program or it'll die when it hits one.
474 Close the open connection to the remote debugger.
475 Use this when you want to detach and do something else
478 args - arguments given to the 'detach' command
479 from_tty - says whether to be verbose or not */
482 es1800_detach (char *args, int from_tty)
486 error ("Argument given to \"detach\" when remotely debugging.");
491 printf ("Ending es1800 remote debugging.\n");
496 /* Tell the remote machine to resume.
497 step - single-step or run free
498 siggnal - the signal value to be given to the target (0 = no signal) */
501 es1800_resume (int pid, int step, enum target_signal siggnal)
507 error ("Can't send signals to a remote system.");
511 strcpy (buf, "STP\r");
516 send_command ("RBK");
520 /* Wait until the remote machine stops, then return,
521 storing status in STATUS just as `wait' would.
525 es1800_wait (int pid, struct target_waitstatus *status)
527 unsigned char buf[PBUFSIZ];
528 int old_timeout = timeout;
530 status->kind = TARGET_WAITKIND_EXITED;
531 status->value.integer = 0;
533 timeout = 0; /* Don't time out -- user program is running. */
534 if (!setjmp (interrupt))
536 old_sigint = signal (SIGINT, es1800_request_quit);
539 getmessage (buf, sizeof (buf));
540 if (strncmp (buf, "\r\n* BREAK *", 11) == 0)
542 status->kind = TARGET_WAITKIND_STOPPED;
543 status->value.sig = TARGET_SIGNAL_TRAP;
544 send_command ("STP"); /* Restore stack and PC and such */
547 send_command ("STP");
551 if (strncmp (buf, "STP\r\n ", 6) == 0)
553 status->kind = TARGET_WAITKIND_STOPPED;
554 status->value.sig = TARGET_SIGNAL_TRAP;
557 if (buf[strlen (buf) - 2] == 'R')
559 printf ("Unexpected emulator reply: \n%s\n", buf);
563 printf ("Unexpected stop: \n%s\n", buf);
564 status->kind = TARGET_WAITKIND_STOPPED;
565 status->value.sig = TARGET_SIGNAL_QUIT;
573 printf ("\nStopping emulator...");
574 if (!setjmp (interrupt))
576 old_sigint = signal (SIGINT, es1800_request_quit);
577 send_command ("STP");
578 printf (" emulator stopped\n");
579 status->kind = TARGET_WAITKIND_STOPPED;
580 status->value.sig = TARGET_SIGNAL_INT;
585 es1800_reset ((char *) 1);
588 signal (SIGINT, old_sigint);
589 timeout = old_timeout;
594 /* Fetch register values from remote machine.
595 regno - the register to be fetched (fetch all registers if -1) */
598 es1800_fetch_register (int regno)
604 static char regtab[18][4] =
606 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
607 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
611 if ((regno < 15) || (regno == 16) || (regno == 17))
614 send_with_reply (regtab[regno], buf, sizeof (buf));
616 for (k = 0; k < 4; k++)
618 if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
620 error ("Emulator reply is too short: %s", buf);
622 registers[r++] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
627 es1800_fetch_registers ();
631 /* Read the remote registers into REGISTERS.
632 Always fetches all registers. */
635 es1800_fetch_registers (void)
638 char SR_buf[PBUFSIZ];
644 send_with_reply ("DR", buf, sizeof (buf));
646 /* Reply is edited to a string that describes registers byte by byte,
647 each byte encoded as two hex characters. */
652 /* parsing row one - D0-D7-registers */
657 for (i = 4; i < 70; i += (i == 39 ? 3 : 1))
659 for (k = 0; k < 4; k++)
661 if (p[i + 0] == 0 || p[i + 1] == 0)
663 error ("Emulator reply is too short: %s", buf);
665 registers[r++] = (fromhex (p[i + 0]) * 16) + fromhex (p[i + 1]);
671 /* parsing row two - A0-A6-registers */
676 for (i = 4; i < 61; i += (i == 39 ? 3 : 1))
678 for (k = 0; k < 4; k++)
680 if (p[i + 0] == 0 || p[i + 1] == 0)
682 error ("Emulator reply is too short: %s", buf);
684 registers[r++] = (fromhex (p[i + 0])) * 16 + fromhex (p[i + 1]);
694 /* fetch SSP-, SR- and PC-registers */
696 /* first - check STATUS-word and decide which stackpointer to use */
698 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
704 if (*p == '3') /* use masterstackpointer MSP */
706 send_with_reply ("MSP", buf, sizeof (buf));
708 else if (*p == '2') /* use interruptstackpointer ISP */
710 send_with_reply ("ISP", buf, sizeof (buf));
713 /* use userstackpointer USP */
715 send_with_reply ("USP", buf, sizeof (buf));
718 for (k = 0; k < 4; k++)
720 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
722 error ("Emulator reply is too short: %s", buf);
724 registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
728 for (k = 0; k < 4; k++)
730 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
732 error ("Emulator reply is too short: %s", buf);
735 fromhex (SR_buf[k * 2 + 1]) * 16 + fromhex (SR_buf[k * 2 + 2]);
737 send_with_reply ("PC", buf, sizeof (buf));
739 for (k = 0; k < 4; k++)
741 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
743 error ("Emulator reply is too short: %s", buf);
745 registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
751 if (*p == '2') /* use supervisorstackpointer SSP */
753 send_with_reply ("SSP", buf, sizeof (buf));
756 /* use userstackpointer USP */
758 send_with_reply ("USP", buf, sizeof (buf));
761 /* fetch STACKPOINTER */
764 for (k = 0; k < 4; k++)
766 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
768 error ("Emulator reply is too short: %s", buf);
770 registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
776 for (k = 0; k < 4; k++)
778 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
780 error ("Emulator reply is too short: %s", buf);
783 fromhex (SR_buf[k * 2 + 1]) * 16 + fromhex (SR_buf[k * 2 + 2]);
788 send_with_reply ("PC", buf, sizeof (buf));
790 for (k = 0; k < 4; k++)
792 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
794 error ("Emulator reply is too short: %s", buf);
796 registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
801 /* Store register value, located in REGISTER, on the target processor.
802 regno - the register-number of the register to store
803 (-1 means store them all)
804 FIXME: Return errno value. */
807 es1800_store_register (int regno)
810 static char regtab[18][4] =
812 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
813 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
818 char SR_buf[PBUFSIZ];
819 char stack_pointer[4];
826 r = (unsigned char *) registers;
828 if (regno == -1) /* write all registers */
834 /* write one register */
841 if ((regno == -1) || (regno == 15))
843 /* fetch current status */
844 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
849 if (*p == '3') /* use masterstackpointer MSP */
851 strcpy (stack_pointer, "MSP");
855 if (*p == '2') /* use interruptstackpointer ISP */
857 strcpy (stack_pointer, "ISP");
861 strcpy (stack_pointer, "USP"); /* use userstackpointer USP */
868 if (*p == '2') /* use supervisorstackpointer SSP */
870 strcpy (stack_pointer, "SSP");
874 strcpy (stack_pointer, "USP"); /* use userstackpointer USP */
877 strcpy (regtab[15], stack_pointer);
880 for (i = j; i < k; i++)
882 buf[0] = regtab[i][0];
883 buf[1] = regtab[i][1];
884 buf[2] = regtab[i][2];
887 buf[5] = tohex ((*r >> 4) & 0x0f);
888 buf[6] = tohex (*r++ & 0x0f);
889 buf[7] = tohex ((*r >> 4) & 0x0f);
890 buf[8] = tohex (*r++ & 0x0f);
891 buf[9] = tohex ((*r >> 4) & 0x0f);
892 buf[10] = tohex (*r++ & 0x0f);
893 buf[11] = tohex ((*r >> 4) & 0x0f);
894 buf[12] = tohex (*r++ & 0x0f);
897 send_with_reply (buf, buf, sizeof (buf)); /* FIXME, reply not used? */
902 /* Prepare to store registers. */
905 es1800_prepare_to_store (void)
907 /* Do nothing, since we can store individual regs */
910 /* Convert hex digit A to a number. */
915 if (a >= '0' && a <= '9')
919 else if (a >= 'a' && a <= 'f')
923 else if (a >= 'A' && a <= 'F')
929 error ("Reply contains invalid hex digit");
935 /* Convert number NIB to a hex digit. */
946 return ('A' + nib - 10);
950 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
951 to or from debugger address MYADDR. Write to inferior if WRITE is
952 nonzero. Returns length of data written or read; 0 for error.
954 memaddr - the target's address
955 myaddr - gdb's address
956 len - number of bytes
957 write - write if != 0 otherwise read
961 es1800_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
962 int write, struct target_ops *tops)
969 xfersize = len > MAXBUFBYTES ? MAXBUFBYTES : len;
972 es1800_write_bytes (memaddr, myaddr, xfersize);
976 es1800_read_bytes (memaddr, myaddr, xfersize);
982 return (origlen); /* no error possible */
986 /* Write memory data directly to the emulator.
987 This does not inform the data cache; the data cache uses this.
988 MEMADDR is the address in the remote memory space.
989 MYADDR is the address of the buffer in our space.
990 LEN is the number of bytes.
992 memaddr - the target's address
993 myaddr - gdb's address
994 len - number of bytes */
997 es1800_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
1004 for (i = 0; i < len; i++)
1006 sprintf (buf, "@.B$%x=$%x", memaddr + i, (*p++) & 0xff);
1007 send_with_reply (buf, buf, sizeof (buf)); /* FIXME send_command? */
1012 /* Read memory data directly from the emulator.
1013 This does not use the data cache; the data cache uses this.
1015 memaddr - the target's address
1016 myaddr - gdb's address
1017 len - number of bytes */
1020 es1800_read_bytes (CORE_ADDR memaddr, char *myaddr, int len)
1022 static int DB_tab[16] =
1023 {8, 11, 14, 17, 20, 23, 26, 29, 34, 37, 40, 43, 46, 49, 52, 55};
1030 if (len > PBUFSIZ / 2 - 1)
1035 if (len == 1) /* The emulator does not like expressions like: */
1037 len = 2; /* DB.B $20018 TO $20018 */
1040 /* Reply describes registers byte by byte, each byte encoded as two hex
1043 sprintf (buf, "DB.B $%x TO $%x", memaddr, memaddr + len - 1);
1044 send_with_reply (buf, buf, sizeof (buf));
1046 low_addr = memaddr & 0x0f;
1047 for (i = low_addr; i < low_addr + len; i++)
1049 if ((!(i % 16)) && i)
1050 { /* if (i = 16,32,48) */
1051 while (*p++ != '\n')
1056 p = b + DB_tab[i % 16] + (m68020 ? 2 : 0);
1057 if (p[0] == 32 || p[1] == 32)
1059 error ("Emulator reply is too short: %s", buf);
1061 myaddr[i - low_addr] = fromhex (p[0]) * 16 + fromhex (p[1]);
1065 /* Display information about the current target. TOPS is unused. */
1068 es1800_files_info (struct target_ops *tops)
1070 printf ("ES1800 Attached to %s at %d baud in %s mode\n", savename, 19200,
1075 /* We read the contents of the target location and stash it,
1076 then overwrite it with a breakpoint instruction.
1078 addr - is the target location in the target machine.
1079 contents_cache - is a pointer to memory allocated for saving the target contents.
1080 It is guaranteed by the caller to be long enough to save sizeof
1083 FIXME: This size is target_arch dependent and should be available in
1084 the target_arch transfer vector, if we ever have one... */
1087 es1800_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
1091 val = target_read_memory (addr, contents_cache, sizeof (es1800_break_insn));
1095 val = target_write_memory (addr, es1800_break_insn,
1096 sizeof (es1800_break_insn));
1103 /* Write back the stashed instruction
1105 addr - is the target location in the target machine.
1106 contents_cache - is a pointer to memory allocated for saving the target contents.
1107 It is guaranteed by the caller to be long enough to save sizeof
1108 BREAKPOINT bytes. */
1111 es1800_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
1114 return (target_write_memory (addr, contents_cache,
1115 sizeof (es1800_break_insn)));
1118 /* create_break_insn ()
1119 Primitive datastructures containing the es1800 breakpoint instruction */
1122 es1800_create_break_insn (char *ins, int vec)
1133 Seach for breakpoint routine in emulator memory.
1134 returns non-zero on failure
1135 vec - trap vector used for breakpoints */
1138 verify_break (int vec)
1140 CORE_ADDR memaddress;
1142 char *instr = "NqNqNqNs"; /* breakpoint routine */
1145 get_break_addr (vec, &memaddress);
1149 status = target_read_memory (memaddress, buf, 8);
1152 memory_error (status, memaddress);
1154 return (STRCMP (instr, buf));
1160 /* get_break_addr ()
1161 find address of breakpoint routine
1162 vec - trap vector used for breakpoints
1163 addrp - store the address here */
1166 get_break_addr (int vec, CORE_ADDR *addrp)
1168 CORE_ADDR memaddress = 0;
1177 send_with_reply ("VBR ", buf, sizeof (buf));
1179 for (k = 0; k < 4; k++)
1181 if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
1183 error ("Emulator reply is too short: %s", buf);
1185 base_addr[k] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
1187 /* base addr of exception vector table */
1188 memaddress = *((CORE_ADDR *) base_addr);
1191 memaddress += (vec + 32) * 4; /* address of trap vector */
1192 status = target_read_memory (memaddress, (char *) addrp, 4);
1195 memory_error (status, memaddress);
1200 /* Kill an inferior process */
1205 if (inferior_pid != 0)
1208 es1800_mourn_inferior ();
1213 /* Load a file to the ES1800 emulator.
1214 Converts the file from a.out format into Extended Tekhex format
1215 before the file is loaded.
1216 Also loads the trap routine, and sets the ES1800 breakpoint on it
1217 filename - the a.out to be loaded
1218 from_tty - says whether to be verbose or not
1219 FIXME Uses emulator overlay memory for trap routine */
1222 es1800_load (char *filename, int from_tty)
1228 struct cleanup *old_chain;
1229 int es1800_load_format = 5;
1231 if (es1800_desc == NULL)
1233 printf ("No emulator attached, type emulator-command first\n");
1237 filename = tilde_expand (filename);
1238 make_cleanup (xfree, filename);
1240 switch (es1800_load_format)
1242 case 2: /* Extended Tekhex */
1245 printf ("Converting \"%s\" to Extended Tekhex Format\n", filename);
1247 sprintf (buf, "tekhex %s", filename);
1249 sprintf (loadname, "out.hex");
1252 case 5: /* Motorola S-rec */
1255 printf ("Converting \"%s\" to Motorola S-record format\n",
1258 /* in the future the source code in copy (part of binutils-1.93) will
1259 be included in this file */
1261 "copy -s \"a.out-sunos-big\" -d \"srec\" %s /tmp/out.hex",
1264 sprintf (loadname, "/tmp/out.hex");
1268 error ("Downloading format not defined\n");
1271 breakpoint_init_inferior ();
1275 printf ("Downloading \"%s\" to the ES 1800\n", filename);
1277 if ((instream = fopen (loadname, "r")) == NULL)
1279 perror_with_name ("fopen:");
1282 old_chain = make_cleanup (fclose, instream);
1287 download (instream, from_tty, es1800_load_format);
1289 /* if breakpoint routine is not present anymore we have to check
1290 whether to download a new breakpoint routine or not */
1292 if ((verify_break (es1800_break_vec) != 0)
1293 && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
1296 printf ("Using break vector 0x%x\n", es1800_break_vec);
1297 sprintf (buf, "0x%x ", es1800_break_vec);
1298 printf ("Give the start address of the breakpoint routine: ");
1299 fgets (buf + strlen (buf), sizeof (buf) - strlen (buf), stdin);
1300 es1800_init_break (buf, 0);
1303 do_cleanups (old_chain);
1305 readchar (); /* FIXME I am getting a ^G = 7 after the prompt */
1308 if (fclose (instream) == EOF)
1313 if (es1800_load_format != 2)
1315 sprintf (buf, "/usr/bin/rm %s", loadname);
1319 symbol_file_command (filename, from_tty); /* reading symbol table */
1325 #define NUMCPYBYTES 20
1328 bfd_copy (bfd *from_bfd, bfd *to_bfd)
1332 char buf[NUMCPYBYTES];
1334 for (p = from_bfd->sections; p != NULL; p = p->next)
1336 printf (" Copying section %s. Size = %x.\n", p->name, p->_cooked_size);
1337 printf (" vma = %x, offset = %x, output_sec = %x\n",
1338 p->vma, p->output_offset, p->output_section);
1339 new = bfd_make_section (to_bfd, p->name);
1340 if (p->_cooked_size &&
1341 !bfd_set_section_size (to_bfd, new, p->_cooked_size))
1343 error ("Wrong BFD size!\n");
1345 if (!bfd_set_section_flags (to_bfd, new, p->flags))
1347 error ("bfd_set_section_flags");
1351 for (i = 0; (i + NUMCPYBYTES) < p->_cooked_size; i += NUMCPYBYTES)
1353 if (!bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1354 (bfd_size_type) NUMCPYBYTES))
1356 error ("bfd_get_section_contents\n");
1358 if (!bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
1359 (bfd_size_type) NUMCPYBYTES))
1361 error ("bfd_set_section_contents\n");
1364 bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1365 (bfd_size_type) (p->_cooked_size - i));
1366 bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
1367 (bfd_size_type) (p->_cooked_size - i));
1373 /* Start an process on the es1800 and set inferior_pid to the new
1375 execfile - the file to run
1376 args - arguments passed to the program
1377 env - the environment vector to pass */
1380 es1800_create_inferior (char *execfile, char *args, char **env)
1385 struct expression *expr;
1386 register struct cleanup *old_chain = 0;
1392 error ("Can't pass arguments to remote ES1800 process");
1396 if (query ("Use 'start' as entry point? "))
1398 expr = parse_c_expression ("start");
1399 old_chain = make_cleanup (free_current_contents, &expr);
1400 val = evaluate_expression (expr);
1401 entry_pt = (val->location).address;
1405 printf ("Enter the program's entry point (in hexadecimal): ");
1406 scanf ("%x", &entry_pt);
1410 if (execfile == 0 || exec_bfd == 0)
1412 error ("No executable file specified");
1415 entry_pt = (int) bfd_get_start_address (exec_bfd);
1419 /* Now that we have a child process, make it our target. */
1421 push_target (&es1800_child_ops);
1423 /* The "process" (board) is already stopped awaiting our commands, and
1424 the program is already downloaded. We just set its PC and go. */
1426 inferior_pid = pid; /* Needed for wait_for_inferior below */
1428 clear_proceed_status ();
1430 /* Tell wait_for_inferior that we've started a new process. */
1432 init_wait_for_inferior ();
1434 /* Set up the "saved terminal modes" of the inferior
1435 based on what modes we are starting it with. */
1437 target_terminal_init ();
1439 /* Install inferior's terminal modes. */
1441 target_terminal_inferior ();
1443 /* remote_start (args); */
1444 /* trap_expected = 0; */
1445 /* insert_step_breakpoint (); FIXME, do we need this? */
1447 /* Let 'er rip... */
1448 proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0);
1453 /* The process has died, clean up. */
1456 es1800_mourn_inferior (void)
1458 remove_breakpoints ();
1459 unpush_target (&es1800_child_ops);
1460 generic_mourn_inferior (); /* Do all the proper things now */
1463 /* ES1800-protocol specific routines */
1465 /* Keep discarding input from the remote system, until STRING is found.
1466 Let the user break out immediately.
1467 string - the string to expect
1468 nowait - break out if string not the emulator's first respond otherwise
1469 read until string is found (== 0) */
1472 expect (char *string, int nowait)
1485 if (c == toupper (*p))
1500 printf ("\'%s\' expected\n", string);
1501 printf ("char %d is %d", p - string, c);
1507 /* Keep discarding input until we see the prompt. */
1510 expect_prompt (void)
1516 /* Read one character */
1520 /* read from stdin */
1528 printf ("readchar, give one character\n");
1531 #if defined (LOG_FILE)
1532 putc (buf[0] & 0x7f, log_file);
1535 return (buf[0] & 0x7f);
1538 #else /* !DEBUG_STDIN */
1540 /* Read a character from the remote system, doing all the fancy
1548 ch = SERIAL_READCHAR (es1800_desc, timeout);
1550 /* FIXME: doing an error() here will probably cause trouble, at least if from
1552 if (ch == SERIAL_TIMEOUT)
1553 error ("Timeout reading from remote system.");
1554 else if (ch == SERIAL_ERROR)
1555 perror_with_name ("remote read");
1557 #if defined (LOG_FILE)
1558 putc (ch & 0x7f, log_file);
1565 #endif /* DEBUG_STDIN */
1568 /* Send a command to the emulator and save the reply.
1569 Report an error if we get an error reply.
1570 string - the es1800 command
1571 buf - containing the emulator reply on return
1572 len - size of buf */
1575 send_with_reply (char *string, char *buf, int len)
1578 SERIAL_WRITE (es1800_desc, "\r", 1);
1585 getmessage (buf, len);
1589 /* Send the command in STR to the emulator adding \r. check
1590 the echo for consistency.
1591 string - the es1800 command */
1594 send_command (char *string)
1597 SERIAL_WRITE (es1800_desc, "\r", 1);
1607 string - the es1800 command */
1614 fprintf (stderr, "Sending: %s\n", string);
1616 SERIAL_WRITE (es1800_desc, string, strlen (string));
1620 /* Read a message from the emulator and store it in BUF.
1621 buf - containing the emulator reply on return
1622 len - size of buf */
1625 getmessage (char *buf, int len)
1629 int prompt_found = 0;
1632 #if defined (LOG_FILE)
1633 /* This is a convenient place to do this. The idea is to do it often
1634 enough that we never lose much data if we terminate abnormally. */
1644 if (len-- < 2) /* char and terminaling NULL */
1646 error ("input buffer overrun\n");
1651 if ((c == '>') && (*(bp - 1) == ' '))
1656 while (!prompt_found);
1661 fprintf (stderr, "message received :%s\n", buf);
1666 download (FILE *instream, int from_tty, int format)
1672 send_command ("SET #2,$1A"); /* reset char = ^Z */
1673 send_command ("SET #3,$11,$13"); /* XON XOFF */
1676 send_command ("SET #26,#2");
1680 send_command ("SET #26,#5"); /* Format=Extended Tekhex */
1682 send_command ("DFB = $10");
1683 send_command ("PUR");
1684 send_command ("CES");
1689 printf (" 0 records loaded...\r");
1691 while (fgets (buf, 160, instream))
1696 printf ("%5d\b\b\b\b\b", ++i);
1699 if ((c = readchar ()) != 006)
1701 error ("expected ACK");
1710 /* Additional commands */
1712 #if defined (TIOCGETP) && defined (FNDELAY) && defined (EWOULDBLOCK)
1713 #define PROVIDE_TRANSPARENT
1716 #ifdef PROVIDE_TRANSPARENT
1717 /* Talk directly to the emulator
1718 FIXME, uses busy wait, and is SUNOS (or at least BSD) specific */
1722 es1800_transparent (char *args, int from_tty)
1725 struct sgttyb modebl;
1728 struct sgttyb console_mode_save;
1729 int console_fc_save;
1734 char consolebuf[80];
1736 char es1800_buf[80];
1740 if (es1800_desc == NULL)
1742 printf ("No emulator attached, type emulator-command first\n");
1747 printf ("You are now communicating directly with the ES 1800 emulator.\n");
1748 printf ("To leave this mode (transparent mode), press ^E.\n");
1753 if ((console = open ("/dev/tty", O_RDWR)) == -1)
1755 perror_with_name ("/dev/tty:");
1758 if ((fcflag = fcntl (console, F_GETFL, 0)) == -1)
1760 perror_with_name ("fcntl console");
1763 console_fc_save = fcflag;
1764 fcflag = fcflag | FNDELAY;
1766 if (fcntl (console, F_SETFL, fcflag) == -1)
1768 perror_with_name ("fcntl console");
1771 if (ioctl (console, TIOCGETP, &modebl))
1773 perror_with_name ("ioctl console");
1776 console_mode_save = modebl;
1777 modebl.sg_flags = RAW;
1779 if (ioctl (console, TIOCSETP, &modebl))
1781 perror_with_name ("ioctl console");
1784 if ((fcflag = fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_GETFL, 0)) == -1)
1786 perror_with_name ("fcntl serial");
1789 es1800_fc_save = fcflag;
1790 fcflag = fcflag | FNDELAY;
1792 if (fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_SETFL, fcflag) == -1)
1794 perror_with_name ("fcntl serial");
1799 cc = read (console, inputbuf, inputcnt);
1802 if ((*inputbuf & 0x7f) == 0x05)
1806 for (i = 0; i < cc;)
1808 es1800_buf[es1800_cnt++] = inputbuf[i++];
1810 if ((cc = SERIAL_WRITE (es1800_desc, es1800_buf, es1800_cnt)) == -1)
1812 perror_with_name ("FEL! write:");
1815 if (es1800_cnt && cc)
1817 for (i = 0; i < es1800_cnt; i++)
1819 es1800_buf[i] = es1800_buf[cc + i];
1823 else if (errno != EWOULDBLOCK)
1825 perror_with_name ("FEL! read:");
1828 cc = read (DEPRECATED_SERIAL_FD (es1800_desc), inputbuf, inputcnt);
1831 for (i = 0; i < cc;)
1833 consolebuf[consolecnt++] = inputbuf[i++];
1835 if ((cc = write (console, consolebuf, consolecnt)) == -1)
1837 perror_with_name ("FEL! write:");
1840 if (consolecnt && cc)
1842 for (i = 0; i < consolecnt; i++)
1844 consolebuf[i] = consolebuf[cc + i];
1848 else if (errno != EWOULDBLOCK)
1850 perror_with_name ("FEL! read:");
1854 console_fc_save = console_fc_save & !FNDELAY;
1855 if (fcntl (console, F_SETFL, console_fc_save) == -1)
1857 perror_with_name ("FEL! fcntl");
1860 if (ioctl (console, TIOCSETP, &console_mode_save))
1862 perror_with_name ("FEL! ioctl");
1867 if (fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_SETFL, es1800_fc_save) == -1)
1869 perror_with_name ("FEL! fcntl");
1875 #endif /* PROVIDE_TRANSPARENT */
1878 es1800_init_break (char *args, int from_tty)
1880 CORE_ADDR memaddress = 0;
1889 error_no_arg ("a trap vector");
1892 if (!(space_index = strchr (args, ' ')))
1894 error ("Two arguments needed (trap vector and address of break routine).\n");
1897 *space_index = '\0';
1899 es1800_break_vec = strtol (args, (char **) NULL, 0);
1900 es1800_break_address = parse_and_eval_address (space_index + 1);
1902 es1800_create_break_insn (es1800_break_insn, es1800_break_vec);
1906 send_with_reply ("VBR ", buf, sizeof (buf));
1908 for (k = 0; k < 4; k++)
1910 if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
1912 error ("Emulator reply is too short: %s", buf);
1914 base_addr[k] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
1916 /* base addr of exception vector table */
1917 memaddress = *((CORE_ADDR *) base_addr);
1920 memaddress += (es1800_break_vec + 32) * 4; /* address of trap vector */
1922 sprintf (buf, "@.L%lx=$%lx", memaddress, es1800_break_address);
1923 send_command (buf); /* set the address of the break routine in the */
1926 sprintf (buf, "@.L%lx=$4E714E71", es1800_break_address); /* NOP; NOP */
1928 sprintf (buf, "@.L%lx=$4E714E73", es1800_break_address + 4); /* NOP; RTE */
1931 sprintf (buf, "AC2=$%lx", es1800_break_address + 4);
1932 /* breakpoint at es1800-break_address */
1934 send_command ("WHEN AC2 THEN BRK"); /* ie in exception routine */
1938 printf ("Breakpoint (trap $%x) routine at address: %lx\n",
1939 es1800_break_vec, es1800_break_address);
1944 es1800_child_open (char *arg, int from_tty)
1946 error ("Use the \"run\" command to start a child process.");
1950 es1800_child_detach (char *args, int from_tty)
1954 error ("Argument given to \"detach\" when remotely debugging.");
1960 printf ("Ending debugging the process %d.\n", inferior_pid);
1965 /* Define the target subroutine names */
1967 struct target_ops es1800_ops;
1970 init_es1800_ops (void)
1972 es1800_ops.to_shortname = "es1800";
1973 es1800_ops.to_longname = "Remote serial target in ES1800-emulator protocol";
1974 es1800_ops.to_doc = "Remote debugging on the es1800 emulator via a serial line.\n\
1975 Specify the serial device it is connected to (e.g. /dev/ttya).";
1976 es1800_ops.to_open = es1800_open;
1977 es1800_ops.to_close = es1800_close;
1978 es1800_ops.to_attach = es1800_attach;
1979 es1800_ops.to_post_attach = NULL;
1980 es1800_ops.to_require_attach = NULL;
1981 es1800_ops.to_detach = es1800_detach;
1982 es1800_ops.to_require_detach = NULL;
1983 es1800_ops.to_resume = es1800_resume;
1984 es1800_ops.to_wait = NULL;
1985 es1800_ops.to_post_wait = NULL;
1986 es1800_ops.to_fetch_registers = NULL;
1987 es1800_ops.to_store_registers = NULL;
1988 es1800_ops.to_prepare_to_store = es1800_prepare_to_store;
1989 es1800_ops.to_xfer_memory = es1800_xfer_inferior_memory;
1990 es1800_ops.to_files_info = es1800_files_info;
1991 es1800_ops.to_insert_breakpoint = es1800_insert_breakpoint;
1992 es1800_ops.to_remove_breakpoint = es1800_remove_breakpoint;
1993 es1800_ops.to_terminal_init = NULL;
1994 es1800_ops.to_terminal_inferior = NULL;
1995 es1800_ops.to_terminal_ours_for_output = NULL;
1996 es1800_ops.to_terminal_ours = NULL;
1997 es1800_ops.to_terminal_info = NULL;
1998 es1800_ops.to_kill = NULL;
1999 es1800_ops.to_load = es1800_load;
2000 es1800_ops.to_lookup_symbol = NULL;
2001 es1800_ops.to_create_inferior = es1800_create_inferior;
2002 es1800_ops.to_post_startup_inferior = NULL;
2003 es1800_ops.to_acknowledge_created_inferior = NULL;
2004 es1800_ops.to_clone_and_follow_inferior = NULL;
2005 es1800_ops.to_post_follow_inferior_by_clone = NULL;
2006 es1800_ops.to_insert_fork_catchpoint = NULL;
2007 es1800_ops.to_remove_fork_catchpoint = NULL;
2008 es1800_ops.to_insert_vfork_catchpoint = NULL;
2009 es1800_ops.to_remove_vfork_catchpoint = NULL;
2010 es1800_ops.to_has_forked = NULL;
2011 es1800_ops.to_has_vforked = NULL;
2012 es1800_ops.to_can_follow_vfork_prior_to_exec = NULL;
2013 es1800_ops.to_post_follow_vfork = NULL;
2014 es1800_ops.to_insert_exec_catchpoint = NULL;
2015 es1800_ops.to_remove_exec_catchpoint = NULL;
2016 es1800_ops.to_has_execd = NULL;
2017 es1800_ops.to_reported_exec_events_per_exec_call = NULL;
2018 es1800_ops.to_has_exited = NULL;
2019 es1800_ops.to_mourn_inferior = NULL;
2020 es1800_ops.to_can_run = 0;
2021 es1800_ops.to_notice_signals = 0;
2022 es1800_ops.to_thread_alive = 0;
2023 es1800_ops.to_stop = 0;
2024 es1800_ops.to_pid_to_exec_file = NULL;
2025 es1800_ops.to_core_file_to_sym_file = NULL;
2026 es1800_ops.to_stratum = core_stratum;
2027 es1800_ops.DONT_USE = 0;
2028 es1800_ops.to_has_all_memory = 0;
2029 es1800_ops.to_has_memory = 1;
2030 es1800_ops.to_has_stack = 0;
2031 es1800_ops.to_has_registers = 0;
2032 es1800_ops.to_has_execution = 0;
2033 es1800_ops.to_sections = NULL;
2034 es1800_ops.to_sections_end = NULL;
2035 es1800_ops.to_magic = OPS_MAGIC;
2038 /* Define the target subroutine names */
2040 struct target_ops es1800_child_ops;
2043 init_es1800_child_ops (void)
2045 es1800_child_ops.to_shortname = "es1800_process";
2046 es1800_child_ops.to_longname = "Remote serial target in ES1800-emulator protocol";
2047 es1800_child_ops.to_doc = "Remote debugging on the es1800 emulator via a serial line.\n\
2048 Specify the serial device it is connected to (e.g. /dev/ttya).";
2049 es1800_child_ops.to_open = es1800_child_open;
2050 es1800_child_ops.to_close = NULL;
2051 es1800_child_ops.to_attach = es1800_attach;
2052 es1800_child_ops.to_post_attach = NULL;
2053 es1800_child_ops.to_require_attach = NULL;
2054 es1800_child_ops.to_detach = es1800_child_detach;
2055 es1800_child_ops.to_require_detach = NULL;
2056 es1800_child_ops.to_resume = es1800_resume;
2057 es1800_child_ops.to_wait = es1800_wait;
2058 es1800_child_ops.to_post_wait = NULL;
2059 es1800_child_ops.to_fetch_registers = es1800_fetch_register;
2060 es1800_child_ops.to_store_registers = es1800_store_register;
2061 es1800_child_ops.to_prepare_to_store = es1800_prepare_to_store;
2062 es1800_child_ops.to_xfer_memory = es1800_xfer_inferior_memory;
2063 es1800_child_ops.to_files_info = es1800_files_info;
2064 es1800_child_ops.to_insert_breakpoint = es1800_insert_breakpoint;
2065 es1800_child_ops.to_remove_breakpoint = es1800_remove_breakpoint;
2066 es1800_child_ops.to_terminal_init = NULL;
2067 es1800_child_ops.to_terminal_inferior = NULL;
2068 es1800_child_ops.to_terminal_ours_for_output = NULL;
2069 es1800_child_ops.to_terminal_ours = NULL;
2070 es1800_child_ops.to_terminal_info = NULL;
2071 es1800_child_ops.to_kill = es1800_kill;
2072 es1800_child_ops.to_load = es1800_load;
2073 es1800_child_ops.to_lookup_symbol = NULL;
2074 es1800_child_ops.to_create_inferior = es1800_create_inferior;
2075 es1800_child_ops.to_post_startup_inferior = NULL;
2076 es1800_child_ops.to_acknowledge_created_inferior = NULL;
2077 es1800_child_ops.to_clone_and_follow_inferior = NULL;
2078 es1800_child_ops.to_post_follow_inferior_by_clone = NULL;
2079 es1800_child_ops.to_insert_fork_catchpoint = NULL;
2080 es1800_child_ops.to_remove_fork_catchpoint = NULL;
2081 es1800_child_ops.to_insert_vfork_catchpoint = NULL;
2082 es1800_child_ops.to_remove_vfork_catchpoint = NULL;
2083 es1800_child_ops.to_has_forked = NULL;
2084 es1800_child_ops.to_has_vforked = NULL;
2085 es1800_child_ops.to_can_follow_vfork_prior_to_exec = NULL;
2086 es1800_child_ops.to_post_follow_vfork = NULL;
2087 es1800_child_ops.to_insert_exec_catchpoint = NULL;
2088 es1800_child_ops.to_remove_exec_catchpoint = NULL;
2089 es1800_child_ops.to_has_execd = NULL;
2090 es1800_child_ops.to_reported_exec_events_per_exec_call = NULL;
2091 es1800_child_ops.to_has_exited = NULL;
2092 es1800_child_ops.to_mourn_inferior = es1800_mourn_inferior;
2093 es1800_child_ops.to_can_run = 0;
2094 es1800_child_ops.to_notice_signals = 0;
2095 es1800_child_ops.to_thread_alive = 0;
2096 es1800_child_ops.to_stop = 0;
2097 es1800_child_ops.to_pid_to_exec_file = NULL;
2098 es1800_child_ops.to_core_file_to_sym_file = NULL;
2099 es1800_child_ops.to_stratum = process_stratum;
2100 es1800_child_ops.DONT_USE = 0;
2101 es1800_child_ops.to_has_all_memory = 1;
2102 es1800_child_ops.to_has_memory = 1;
2103 es1800_child_ops.to_has_stack = 1;
2104 es1800_child_ops.to_has_registers = 1;
2105 es1800_child_ops.to_has_execution = 1;
2106 es1800_child_ops.to_sections = NULL;
2107 es1800_child_ops.to_sections_end = NULL;
2108 es1800_child_ops.to_magic = OPS_MAGIC;
2112 _initialize_es1800 (void)
2115 init_es1800_child_ops ();
2116 add_target (&es1800_ops);
2117 add_target (&es1800_child_ops);
2118 #ifdef PROVIDE_TRANSPARENT
2119 add_com ("transparent", class_support, es1800_transparent,
2120 "Start transparent communication with the ES 1800 emulator.");
2121 #endif /* PROVIDE_TRANSPARENT */
2122 add_com ("init_break", class_support, es1800_init_break,
2123 "Download break routine and initialize break facility on ES 1800");