]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/remote-es.c
import gdb-1999-07-07 post reformat
[thirdparty/binutils-gdb.git] / gdb / remote-es.c
CommitLineData
c906108c
SS
1/* Memory-access and commands for remote es1800 processes, for GDB.
2 Copyright (C) 1988, 1992 Free Software Foundation, Inc.
3
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
8 Harald Johansen.
9
c5aa993b 10 This file is part of GDB.
c906108c 11
c5aa993b
JM
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)
15 any later version.
c906108c 16
c5aa993b
JM
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.
c906108c 21
c5aa993b
JM
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. */
c906108c
SS
26
27
28/* Emulator communication protocol.
29 All values are encoded in ascii hex digits.
30
c5aa993b
JM
31 Request
32 Command
33 Reply
34 read registers:
35 DR<cr>
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
40 >
41 Each byte of register data is described by two hex digits.
42
43 write regs
44 D0=XXXXXXXX<cr>
45 >D1=XXXXXXXX<cr>
46 >D2=XXXXXXXX<cr>
47 >D3=XXXXXXXX<cr>
48 >D4=XXXXXXXX<cr>
49 >D5=XXXXXXXX<cr>
50 >D6=XXXXXXXX<cr>
51 >D7=XXXXXXXX<cr>
52 >A0=XXXXXXXX<cr>
53 >A1=XXXXXXXX<cr>
54 >A2=XXXXXXXX<cr>
55 >A3=XXXXXXXX<cr>
56 >A4=XXXXXXXX<cr>
57 >A5=XXXXXXXX<cr>
58 >A6=XXXXXXXX<cr>
59 >A7=XXXXXXXX<cr>
60 >SR=XXXXXXXX<cr>
61 >PC=XXXXXX<cr>
62 >
63 Each byte of register data is described by two hex digits.
64
65 read mem
66 @.BAA..AA
67 $FFFFFFXX
68 >
69 AA..AA is address, XXXXXXX is the contents
70
71 write mem
72 @.BAA..AA=$XXXXXXXX
73 >
74 AA..AA is address, XXXXXXXX is data
75
76 cont
77 PC=$AA..AA
78 >RBK
79 R>
80 AA..AA is address to resume. If AA..AA is omitted, resume at same address.
81
82 step
83 PC=$AA..AA
84 >STP
85 R>
86 AA..AA is address to resume. If AA..AA is omitted, resume at same address.
87
88 kill req
89 STP
90 >
91 */
c906108c
SS
92
93
94#include <stdio.h>
95#include <signal.h>
96#include <sys/ioctl.h>
97#include <sys/file.h>
98#include <errno.h>
99#include <ctype.h>
100#include <setjmp.h>
101#include <fcntl.h>
102#include "defs.h"
103#include "gdb_string.h"
104#include "frame.h"
105#include "inferior.h"
106#include "target.h"
107#include "wait.h"
108#include "command.h"
109#include "remote-utils.h"
110#include "gdbcore.h"
111#include "serial.h"
112
113/* Prototypes for local functions */
114
115static void
116es1800_child_detach PARAMS ((char *, int));
117
118static void
119es1800_child_open PARAMS ((char *, int));
120
c5aa993b 121static void
c906108c
SS
122es1800_transparent PARAMS ((char *, int));
123
124static void
125es1800_create_inferior PARAMS ((char *, char *, char **));
126
127static void
128es1800_load PARAMS ((char *, int));
129
130static void
131es1800_kill PARAMS ((void));
132
133static int
134verify_break PARAMS ((int));
135
136static int
137es1800_remove_breakpoint PARAMS ((CORE_ADDR, char *));
138
139static int
140es1800_insert_breakpoint PARAMS ((CORE_ADDR, char *));
141
142static void
143es1800_files_info PARAMS ((struct target_ops *));
144
145static int
146es1800_xfer_inferior_memory PARAMS ((CORE_ADDR, char *, int, int,
147 struct target_ops *));
148
c5aa993b 149static void
c906108c
SS
150es1800_prepare_to_store PARAMS ((void));
151
152static int es1800_wait PARAMS ((int, struct target_waitstatus *));
153
154static void es1800_resume PARAMS ((int, int, enum target_signal));
155
156static void
157es1800_detach PARAMS ((char *, int));
158
159static void
160es1800_attach PARAMS ((char *, int));
161
162static int
163damn_b PARAMS ((char *));
164
165static void
166es1800_open PARAMS ((char *, int));
167
168static void
169es1800_timer PARAMS ((void));
170
171static void
172es1800_reset PARAMS ((char *));
173
174static void
175es1800_request_quit PARAMS ((void));
176
177static int
178readchar PARAMS ((void));
179
180static void
181expect PARAMS ((char *, int));
182
183static void
184expect_prompt PARAMS ((void));
185
186static void
187download PARAMS ((FILE *, int, int));
188
189#if 0
190static void
191bfd_copy PARAMS ((bfd *, bfd *));
192#endif
193
194static void
195get_break_addr PARAMS ((int, CORE_ADDR *));
196
197static int
198fromhex PARAMS ((int));
199
200static int
201tohex PARAMS ((int));
202
203static void
204es1800_close PARAMS ((int));
205
206static void
207es1800_fetch_registers PARAMS ((void));
208
209static void
210es1800_fetch_register PARAMS ((int));
211
212static void
213es1800_store_register PARAMS ((int));
214
215static void
216es1800_read_bytes PARAMS ((CORE_ADDR, char *, int));
217
218static void
219es1800_write_bytes PARAMS ((CORE_ADDR, char *, int));
220
221static void
222send_with_reply PARAMS ((char *, char *, int));
223
224static void
225send_command PARAMS ((char *));
226
227static void
228send PARAMS ((char *));
229
230static void
231getmessage PARAMS ((char *, int));
232
233static void
234es1800_mourn_inferior PARAMS ((void));
235
236static void
237es1800_create_break_insn PARAMS ((char *, int));
238
239static void
240es1800_init_break PARAMS ((char *, int));
241
242/* Local variables */
243
244/* FIXME: Convert this to use "set remotedebug" instead. */
245#define LOG_FILE "es1800.log"
246#if defined (LOG_FILE)
247static FILE *log_file;
248#endif
249
c5aa993b 250extern struct target_ops es1800_ops; /* Forward decl */
c906108c
SS
251extern struct target_ops es1800_child_ops; /* Forward decl */
252
253static int kiodebug;
c5aa993b
JM
254static int timeout = 100;
255static char *savename; /* Name of i/o device used */
c906108c 256static serial_ttystate es1800_saved_ttystate;
c5aa993b 257static int es1800_fc_save; /* Save fcntl state */
c906108c
SS
258
259/* indicates that the emulator uses 32-bit data-adress (68020-mode)
260 instead of 24-bit (68000 -mode) */
261
262static int m68020;
263
264#define MODE (m68020 ? "M68020" : "M68000" )
265#define ES1800_BREAK_VEC (0xf)
266
267/* Descriptor for I/O to remote machine. Initialize it to NULL so that
268 es1800_open knows that we don't have a file open when the program
269 starts. */
270
271static serial_t es1800_desc = NULL;
272
273#define PBUFSIZ 1000
274#define HDRLEN sizeof("@.BAAAAAAAA=$VV\r")
275
276/* Maximum number of bytes to read/write at once. The value here
277 is chosen to fill up a packet. */
278
279#define MAXBUFBYTES ((PBUFSIZ-150)*16/75 )
280
281static int es1800_break_vec = 0;
282static char es1800_break_insn[2];
283static long es1800_break_address;
c5aa993b 284static void (*old_sigint) (); /* Old signal-handler for sigint */
c906108c
SS
285static jmp_buf interrupt;
286
287/* Local signalhandler to allow breaking tranfers or program run.
288 Rely on global variables: old_sigint(), interrupt */
289
290static void
291es1800_request_quit ()
292{
293 /* restore original signalhandler */
294 signal (SIGINT, old_sigint);
295 longjmp (interrupt, 1);
296}
297
298
299/* Reset emulator.
300 Sending reset character(octal 32) to emulator.
c5aa993b 301 quit - return to '(esgdb)' prompt or continue */
c906108c
SS
302
303static void
304es1800_reset (quit)
305 char *quit;
306{
307 char buf[80];
308
309 if (quit)
310 {
311 printf ("\nResetting emulator... ");
312 }
313 strcpy (buf, "\032");
314 send (buf);
315 expect_prompt ();
316 if (quit)
317 {
318 error ("done\n");
319 }
320}
321
322
323/* Open a connection to a remote debugger and push the new target
324 onto the stack. Check if the emulator is responding and find out
325 what kind of processor the emulator is connected to.
326 Initiate the breakpoint handling in the emulator.
327
328 name - the filename used for communication (ex. '/dev/tta')
329 from_tty - says whether to be verbose or not */
330
331static void
332es1800_open (name, from_tty)
333 char *name;
334 int from_tty;
335{
336 char buf[PBUFSIZ];
337 char *p;
338 int i, fcflag;
339
340 m68020 = 0;
341
c5aa993b 342 if (!name) /* no device name given in target command */
c906108c
SS
343 {
344 error_no_arg ("serial port device name");
345 }
346
347 target_preopen (from_tty);
348 es1800_close (0);
349
350 /* open the device and configure it for communication */
351
352#ifndef DEBUG_STDIN
353
354 es1800_desc = SERIAL_OPEN (name);
355 if (es1800_desc == NULL)
356 {
357 perror_with_name (name);
358 }
359 savename = savestring (name, strlen (name));
360
361 es1800_saved_ttystate = SERIAL_GET_TTY_STATE (es1800_desc);
362
363 if ((fcflag = fcntl (es1800_desc->fd, F_GETFL, 0)) == -1)
364 {
365 perror_with_name ("fcntl serial");
366 }
367 es1800_fc_save = fcflag;
368
c5aa993b 369 fcflag = (fcflag & (FREAD | FWRITE)); /* mask out any funny stuff */
c906108c
SS
370 if (fcntl (es1800_desc->fd, F_SETFL, fcflag) == -1)
371 {
372 perror_with_name ("fcntl serial");
373 }
374
375 if (baud_rate != -1)
376 {
377 if (SERIAL_SETBAUDRATE (es1800_desc, baud_rate))
378 {
379 SERIAL_CLOSE (es1800_desc);
380 perror_with_name (name);
381 }
382 }
383
384 SERIAL_RAW (es1800_desc);
385
386 /* If there is something sitting in the buffer we might take it as a
387 response to a command, which would be bad. */
388 SERIAL_FLUSH_INPUT (es1800_desc);
389
c5aa993b 390#endif /* DEBUG_STDIN */
c906108c
SS
391
392 push_target (&es1800_ops); /* Switch to using remote target now */
393 if (from_tty)
394 {
395 printf ("Remote ES1800 debugging using %s\n", name);
396 }
397
398#if defined (LOG_FILE)
399
400 log_file = fopen (LOG_FILE, "w");
401 if (log_file == NULL)
402 {
403 perror_with_name (LOG_FILE);
404 }
405
c5aa993b 406#endif /* LOG_FILE */
c906108c
SS
407
408 /* Hello? Are you there?, also check mode */
409
410 /* send_with_reply( "DB 0 TO 1", buf, sizeof(buf)); */
c5aa993b 411 /* for (p = buf, i = 0; *p++ =='0';) *//* count the number of zeros */
c906108c
SS
412 /* i++; */
413
414 send ("\032");
c5aa993b 415 getmessage (buf, sizeof (buf)); /* send reset character */
c906108c
SS
416
417 if (from_tty)
418 {
419 printf ("Checking mode.... ");
420 }
c5aa993b 421 /* m68020 = (i==8); *//* if eight zeros then we are in m68020 mode */
c906108c 422
c5aa993b 423 /* What kind of processor am i talking to ? */
c906108c 424 p = buf;
c5aa993b
JM
425 while (*p++ != '\n')
426 {;
427 }
428 while (*p++ != '\n')
429 {;
430 }
431 while (*p++ != '\n')
432 {;
433 }
434 for (i = 0; i < 20; i++, p++)
435 {;
436 }
c906108c
SS
437 m68020 = !strncmp (p, "68020", 5);
438 if (from_tty)
439 {
440 printf ("You are in %s(%c%c%c%c%c)-mode\n", MODE, p[0], p[1], p[2],
441 p[3], p[4]);
442 }
443
444 /* if no init_break statement is present in .gdb file we have to check
445 whether to download a breakpoint routine or not */
446
447#if 0
448 if ((es1800_break_vec == 0) || (verify_break (es1800_break_vec) != 0)
449 && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
450 {
451 CORE_ADDR memaddress;
452 printf ("Give the start address of the breakpoint routine: ");
453 scanf ("%li", &memaddress);
454 es1800_init_break ((es1800_break_vec ? es1800_break_vec :
455 ES1800_BREAK_VEC), memaddress);
456 }
457#endif
458
459}
460
461/* Close out all files and local state before this target loses control.
c5aa993b 462 quitting - are we quitting gdb now? */
c906108c
SS
463
464static void
465es1800_close (quitting)
466 int quitting;
467{
468 if (es1800_desc != NULL)
469 {
470 printf ("\nClosing connection to emulator...\n");
471 if (SERIAL_SET_TTY_STATE (es1800_desc, es1800_saved_ttystate) < 0)
472 print_sys_errmsg ("warning: unable to restore tty state", errno);
473 fcntl (es1800_desc->fd, F_SETFL, es1800_fc_save);
474 SERIAL_CLOSE (es1800_desc);
475 es1800_desc = NULL;
476 }
477 if (savename != NULL)
478 {
479 free (savename);
480 }
481 savename = NULL;
482
483#if defined (LOG_FILE)
484
485 if (log_file != NULL)
486 {
487 if (ferror (log_file))
488 {
489 printf ("Error writing log file.\n");
490 }
491 if (fclose (log_file) != 0)
492 {
493 printf ("Error closing log file.\n");
494 }
495 log_file = NULL;
496 }
497
c5aa993b 498#endif /* LOG_FILE */
c906108c
SS
499
500}
501
502/* Attaches to a process on the target side
c5aa993b
JM
503 proc_id - the id of the process to be attached.
504 from_tty - says whether to be verbose or not */
c906108c
SS
505
506static void
507es1800_attach (args, from_tty)
c5aa993b
JM
508 char *args;
509 int from_tty;
c906108c
SS
510{
511 error ("Cannot attach to pid %s, this feature is not implemented yet.",
512 args);
513}
514
515
516/* Takes a program previously attached to and detaches it.
517 We better not have left any breakpoints
518 in the program or it'll die when it hits one.
519 Close the open connection to the remote debugger.
520 Use this when you want to detach and do something else
521 with your gdb.
c5aa993b 522
c906108c
SS
523 args - arguments given to the 'detach' command
524 from_tty - says whether to be verbose or not */
525
526static void
527es1800_detach (args, from_tty)
528 char *args;
529 int from_tty;
530{
531 if (args)
532 {
533 error ("Argument given to \"detach\" when remotely debugging.");
534 }
535 pop_target ();
536 if (from_tty)
537 {
538 printf ("Ending es1800 remote debugging.\n");
539 }
540}
541
542
543/* Tell the remote machine to resume.
544 step - single-step or run free
545 siggnal - the signal value to be given to the target (0 = no signal) */
546
547static void
548es1800_resume (pid, step, siggnal)
549 int pid;
550 int step;
551 enum target_signal siggnal;
552{
553 char buf[PBUFSIZ];
554
555 if (siggnal)
556 {
557 error ("Can't send signals to a remote system.");
558 }
559 if (step)
560 {
c5aa993b 561 strcpy (buf, "STP\r");
c906108c
SS
562 send (buf);
563 }
564 else
565 {
566 send_command ("RBK");
567 }
568}
569
570/* Wait until the remote machine stops, then return,
571 storing status in STATUS just as `wait' would.
572 status - */
c5aa993b 573
c906108c
SS
574static int
575es1800_wait (pid, status)
576 int pid;
577 struct target_waitstatus *status;
578{
579 unsigned char buf[PBUFSIZ];
580 int old_timeout = timeout;
581
582 status->kind = TARGET_WAITKIND_EXITED;
583 status->value.integer = 0;
584
c5aa993b 585 timeout = 0; /* Don't time out -- user program is running. */
c906108c
SS
586 if (!setjmp (interrupt))
587 {
588 old_sigint = signal (SIGINT, es1800_request_quit);
589 while (1)
c5aa993b
JM
590 {
591 getmessage (buf, sizeof (buf));
592 if (strncmp (buf, "\r\n* BREAK *", 11) == 0)
c906108c
SS
593 {
594 status->kind = TARGET_WAITKIND_STOPPED;
595 status->value.sig = TARGET_SIGNAL_TRAP;
596 send_command ("STP"); /* Restore stack and PC and such */
597 if (m68020)
598 {
599 send_command ("STP");
600 }
601 break;
602 }
603 if (strncmp (buf, "STP\r\n ", 6) == 0)
604 {
605 status->kind = TARGET_WAITKIND_STOPPED;
606 status->value.sig = TARGET_SIGNAL_TRAP;
607 break;
608 }
609 if (buf[strlen (buf) - 2] == 'R')
610 {
611 printf ("Unexpected emulator reply: \n%s\n", buf);
612 }
613 else
614 {
615 printf ("Unexpected stop: \n%s\n", buf);
616 status->kind = TARGET_WAITKIND_STOPPED;
617 status->value.sig = TARGET_SIGNAL_QUIT;
618 break;
619 }
c5aa993b 620 }
c906108c
SS
621 }
622 else
623 {
624 fflush (stdin);
625 printf ("\nStopping emulator...");
626 if (!setjmp (interrupt))
627 {
628 old_sigint = signal (SIGINT, es1800_request_quit);
629 send_command ("STP");
630 printf (" emulator stopped\n");
631 status->kind = TARGET_WAITKIND_STOPPED;
632 status->value.sig = TARGET_SIGNAL_INT;
c5aa993b 633 }
c906108c
SS
634 else
635 {
636 fflush (stdin);
c5aa993b 637 es1800_reset ((char *) 1);
c906108c
SS
638 }
639 }
640 signal (SIGINT, old_sigint);
641 timeout = old_timeout;
642 return (0);
643}
644
645
646/* Fetch register values from remote machine.
647 regno - the register to be fetched (fetch all registers if -1) */
648
649static void
650es1800_fetch_register (regno)
651 int regno;
652{
653 char buf[PBUFSIZ];
654 int k;
655 int r;
656 char *p;
c5aa993b
JM
657 static char regtab[18][4] =
658 {
659 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
660 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
661 "SR ", "PC "
662 };
c906108c
SS
663
664 if ((regno < 15) || (regno == 16) || (regno == 17))
665 {
666 r = regno * 4;
667 send_with_reply (regtab[regno], buf, sizeof (buf));
668 p = buf;
669 for (k = 0; k < 4; k++)
670 {
c5aa993b 671 if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
c906108c
SS
672 {
673 error ("Emulator reply is too short: %s", buf);
674 }
c5aa993b 675 registers[r++] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
c906108c
SS
676 }
677 }
678 else
679 {
680 es1800_fetch_registers ();
681 }
682}
683
684/* Read the remote registers into REGISTERS.
685 Always fetches all registers. */
686
687static void
688es1800_fetch_registers ()
689{
690 char buf[PBUFSIZ];
691 char SR_buf[PBUFSIZ];
692 int i;
693 int k;
694 int r;
695 char *p;
696
697 send_with_reply ("DR", buf, sizeof (buf));
698
699 /* Reply is edited to a string that describes registers byte by byte,
700 each byte encoded as two hex characters. */
701
702 p = buf;
703 r = 0;
704
705 /* parsing row one - D0-D7-registers */
706
c5aa993b
JM
707 while (*p++ != '\n')
708 {;
709 }
c906108c
SS
710 for (i = 4; i < 70; i += (i == 39 ? 3 : 1))
711 {
712 for (k = 0; k < 4; k++)
713 {
c5aa993b 714 if (p[i + 0] == 0 || p[i + 1] == 0)
c906108c
SS
715 {
716 error ("Emulator reply is too short: %s", buf);
717 }
c5aa993b 718 registers[r++] = (fromhex (p[i + 0]) * 16) + fromhex (p[i + 1]);
c906108c
SS
719 i += 2;
720 }
721 }
722 p += i;
723
724 /* parsing row two - A0-A6-registers */
725
c5aa993b
JM
726 while (*p++ != '\n')
727 {;
728 }
c906108c
SS
729 for (i = 4; i < 61; i += (i == 39 ? 3 : 1))
730 {
731 for (k = 0; k < 4; k++)
732 {
c5aa993b 733 if (p[i + 0] == 0 || p[i + 1] == 0)
c906108c
SS
734 {
735 error ("Emulator reply is too short: %s", buf);
736 }
c5aa993b 737 registers[r++] = (fromhex (p[i + 0])) * 16 + fromhex (p[i + 1]);
c906108c
SS
738 i += 2;
739 }
740 }
741 p += i;
742
c5aa993b
JM
743 while (*p++ != '\n')
744 {;
745 }
c906108c
SS
746
747 /* fetch SSP-, SR- and PC-registers */
748
749 /* first - check STATUS-word and decide which stackpointer to use */
750
751 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
752 p = SR_buf;
753 p += 5;
754
755 if (m68020)
756 {
c5aa993b 757 if (*p == '3') /* use masterstackpointer MSP */
c906108c
SS
758 {
759 send_with_reply ("MSP", buf, sizeof (buf));
760 }
761 else if (*p == '2') /* use interruptstackpointer ISP */
762 {
763 send_with_reply ("ISP", buf, sizeof (buf));
764 }
c5aa993b
JM
765 else
766 /* use userstackpointer USP */
c906108c 767 {
c5aa993b 768 send_with_reply ("USP", buf, sizeof (buf));
c906108c
SS
769 }
770 p = buf;
c5aa993b 771 for (k = 0; k < 4; k++)
c906108c 772 {
c5aa993b 773 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
c906108c
SS
774 {
775 error ("Emulator reply is too short: %s", buf);
776 }
c5aa993b 777 registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
c906108c
SS
778 }
779
780 p = SR_buf;
781 for (k = 0; k < 4; k++)
782 {
c5aa993b 783 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
c906108c
SS
784 {
785 error ("Emulator reply is too short: %s", buf);
786 }
787 registers[r++] =
c5aa993b 788 fromhex (SR_buf[k * 2 + 1]) * 16 + fromhex (SR_buf[k * 2 + 2]);
c906108c
SS
789 }
790 send_with_reply ("PC", buf, sizeof (buf));
791 p = buf;
c5aa993b 792 for (k = 0; k < 4; k++)
c906108c 793 {
c5aa993b 794 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
c906108c
SS
795 {
796 error ("Emulator reply is too short: %s", buf);
797 }
c5aa993b 798 registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
c906108c
SS
799 }
800 }
c5aa993b
JM
801 else
802 /* 68000-mode */
803 {
804 if (*p == '2') /* use supervisorstackpointer SSP */
c906108c 805 {
c5aa993b 806 send_with_reply ("SSP", buf, sizeof (buf));
c906108c 807 }
c5aa993b
JM
808 else
809 /* use userstackpointer USP */
c906108c 810 {
c5aa993b 811 send_with_reply ("USP", buf, sizeof (buf));
c906108c
SS
812 }
813
814 /* fetch STACKPOINTER */
815
816 p = buf;
817 for (k = 0; k < 4; k++)
818 {
c5aa993b 819 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
c906108c
SS
820 {
821 error ("Emulator reply is too short: %s", buf);
822 }
c5aa993b 823 registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
c906108c
SS
824 }
825
826 /* fetch STATUS */
827
828 p = SR_buf;
829 for (k = 0; k < 4; k++)
830 {
c5aa993b 831 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
c906108c
SS
832 {
833 error ("Emulator reply is too short: %s", buf);
834 }
835 registers[r++] =
c5aa993b 836 fromhex (SR_buf[k * 2 + 1]) * 16 + fromhex (SR_buf[k * 2 + 2]);
c906108c
SS
837 }
838
839 /* fetch PC */
840
c5aa993b 841 send_with_reply ("PC", buf, sizeof (buf));
c906108c
SS
842 p = buf;
843 for (k = 0; k < 4; k++)
844 {
c5aa993b 845 if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
c906108c
SS
846 {
847 error ("Emulator reply is too short: %s", buf);
848 }
c5aa993b
JM
849 registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
850 }
c906108c
SS
851 }
852}
853
854/* Store register value, located in REGISTER, on the target processor.
855 regno - the register-number of the register to store
c5aa993b 856 (-1 means store them all)
c906108c
SS
857 FIXME: Return errno value. */
858
859static void
c5aa993b 860es1800_store_register (regno)
c906108c
SS
861 int regno;
862{
863
864 static char regtab[18][4] =
c5aa993b
JM
865 {
866 "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
867 "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
868 "SR ", "PC "
869 };
c906108c
SS
870
871 char buf[PBUFSIZ];
872 char SR_buf[PBUFSIZ];
873 char stack_pointer[4];
874 char *p;
875 int i;
876 int j;
877 int k;
878 unsigned char *r;
879
880 r = (unsigned char *) registers;
881
c5aa993b 882 if (regno == -1) /* write all registers */
c906108c
SS
883 {
884 j = 0;
885 k = 18;
886 }
c5aa993b
JM
887 else
888 /* write one register */
c906108c
SS
889 {
890 j = regno;
c5aa993b
JM
891 k = regno + 1;
892 r += regno * 4;
893 }
c906108c
SS
894
895 if ((regno == -1) || (regno == 15))
896 {
897 /* fetch current status */
898 send_with_reply ("SR", SR_buf, sizeof (SR_buf));
899 p = SR_buf;
900 p += 5;
901 if (m68020)
902 {
c5aa993b 903 if (*p == '3') /* use masterstackpointer MSP */
c906108c 904 {
c5aa993b 905 strcpy (stack_pointer, "MSP");
c906108c
SS
906 }
907 else
908 {
c5aa993b 909 if (*p == '2') /* use interruptstackpointer ISP */
c906108c 910 {
c5aa993b 911 strcpy (stack_pointer, "ISP");
c906108c
SS
912 }
913 else
914 {
c5aa993b 915 strcpy (stack_pointer, "USP"); /* use userstackpointer USP */
c906108c
SS
916 }
917 }
918 }
c5aa993b
JM
919 else
920 /* 68000-mode */
c906108c 921 {
c5aa993b 922 if (*p == '2') /* use supervisorstackpointer SSP */
c906108c 923 {
c5aa993b 924 strcpy (stack_pointer, "SSP");
c906108c
SS
925 }
926 else
927 {
c5aa993b 928 strcpy (stack_pointer, "USP"); /* use userstackpointer USP */
c906108c
SS
929 }
930 }
c5aa993b 931 strcpy (regtab[15], stack_pointer);
c906108c
SS
932 }
933
c5aa993b 934 for (i = j; i < k; i++)
c906108c
SS
935 {
936 buf[0] = regtab[i][0];
937 buf[1] = regtab[i][1];
938 buf[2] = regtab[i][2];
939 buf[3] = '=';
940 buf[4] = '$';
941 buf[5] = tohex ((*r >> 4) & 0x0f);
942 buf[6] = tohex (*r++ & 0x0f);
943 buf[7] = tohex ((*r >> 4) & 0x0f);
944 buf[8] = tohex (*r++ & 0x0f);
945 buf[9] = tohex ((*r >> 4) & 0x0f);
946 buf[10] = tohex (*r++ & 0x0f);
947 buf[11] = tohex ((*r >> 4) & 0x0f);
948 buf[12] = tohex (*r++ & 0x0f);
949 buf[13] = 0;
950
c5aa993b 951 send_with_reply (buf, buf, sizeof (buf)); /* FIXME, reply not used? */
c906108c
SS
952 }
953}
954
955
956/* Prepare to store registers. */
957
c5aa993b 958static void
c906108c
SS
959es1800_prepare_to_store ()
960{
961 /* Do nothing, since we can store individual regs */
962}
963
964/* Convert hex digit A to a number. */
965
966static int
967fromhex (a)
968 int a;
969{
970 if (a >= '0' && a <= '9')
971 {
972 return a - '0';
973 }
974 else if (a >= 'a' && a <= 'f')
975 {
976 return a - 'a' + 10;
977 }
978 else if (a >= 'A' && a <= 'F')
979 {
980 return a - 'A' + 10;
981 }
982 else
983 {
984 error ("Reply contains invalid hex digit");
985 }
986 return (-1);
987}
988
989
990/* Convert number NIB to a hex digit. */
991
992static int
993tohex (nib)
994 int nib;
995{
996 if (nib < 10)
997 {
998 return ('0' + nib);
999 }
1000 else
1001 {
1002 return ('A' + nib - 10);
1003 }
1004}
1005
1006/* Read or write LEN bytes from inferior memory at MEMADDR, transferring
1007 to or from debugger address MYADDR. Write to inferior if WRITE is
1008 nonzero. Returns length of data written or read; 0 for error.
c5aa993b 1009
c906108c
SS
1010 memaddr - the target's address
1011 myaddr - gdb's address
1012 len - number of bytes
c5aa993b 1013 write - write if != 0 otherwise read */
c906108c
SS
1014
1015static int
1016es1800_xfer_inferior_memory (memaddr, myaddr, len, write, tops)
1017 CORE_ADDR memaddr;
1018 char *myaddr;
1019 int len;
1020 int write;
1021 struct target_ops *tops; /* Unused */
1022{
1023 int origlen = len;
1024 int xfersize;
1025
1026 while (len > 0)
1027 {
1028 xfersize = len > MAXBUFBYTES ? MAXBUFBYTES : len;
1029 if (write)
1030 {
1031 es1800_write_bytes (memaddr, myaddr, xfersize);
1032 }
1033 else
1034 {
1035 es1800_read_bytes (memaddr, myaddr, xfersize);
1036 }
1037 memaddr += xfersize;
1038 myaddr += xfersize;
1039 len -= xfersize;
1040 }
c5aa993b 1041 return (origlen); /* no error possible */
c906108c
SS
1042}
1043
1044
1045/* Write memory data directly to the emulator.
1046 This does not inform the data cache; the data cache uses this.
1047 MEMADDR is the address in the remote memory space.
1048 MYADDR is the address of the buffer in our space.
1049 LEN is the number of bytes.
c5aa993b 1050
c906108c
SS
1051 memaddr - the target's address
1052 myaddr - gdb's address
1053 len - number of bytes */
1054
1055static void
1056es1800_write_bytes (memaddr, myaddr, len)
1057 CORE_ADDR memaddr;
1058 char *myaddr;
1059 int len;
1060{
1061 char buf[PBUFSIZ];
1062 int i;
1063 char *p;
1064
1065 p = myaddr;
1066 for (i = 0; i < len; i++)
1067 {
c5aa993b
JM
1068 sprintf (buf, "@.B$%x=$%x", memaddr + i, (*p++) & 0xff);
1069 send_with_reply (buf, buf, sizeof (buf)); /* FIXME send_command? */
c906108c
SS
1070 }
1071}
1072
1073
1074/* Read memory data directly from the emulator.
1075 This does not use the data cache; the data cache uses this.
c5aa993b 1076
c906108c
SS
1077 memaddr - the target's address
1078 myaddr - gdb's address
1079 len - number of bytes */
1080
1081static void
1082es1800_read_bytes (memaddr, myaddr, len)
1083 CORE_ADDR memaddr;
1084 char *myaddr;
1085 int len;
1086{
c5aa993b
JM
1087 static int DB_tab[16] =
1088 {8, 11, 14, 17, 20, 23, 26, 29, 34, 37, 40, 43, 46, 49, 52, 55};
c906108c
SS
1089 char buf[PBUFSIZ];
1090 int i;
1091 int low_addr;
1092 char *p;
1093 char *b;
1094
1095 if (len > PBUFSIZ / 2 - 1)
1096 {
1097 abort ();
1098 }
1099
c5aa993b 1100 if (len == 1) /* The emulator does not like expressions like: */
c906108c 1101 {
c5aa993b 1102 len = 2; /* DB.B $20018 TO $20018 */
c906108c
SS
1103 }
1104
1105 /* Reply describes registers byte by byte, each byte encoded as two hex
1106 characters. */
1107
c5aa993b 1108 sprintf (buf, "DB.B $%x TO $%x", memaddr, memaddr + len - 1);
c906108c
SS
1109 send_with_reply (buf, buf, sizeof (buf));
1110 b = buf;
c5aa993b 1111 low_addr = memaddr & 0x0f;
c906108c
SS
1112 for (i = low_addr; i < low_addr + len; i++)
1113 {
1114 if ((!(i % 16)) && i)
c5aa993b
JM
1115 { /* if (i = 16,32,48) */
1116 while (*p++ != '\n')
1117 {;
1118 }
c906108c
SS
1119 b = p;
1120 }
c5aa993b 1121 p = b + DB_tab[i % 16] + (m68020 ? 2 : 0);
c906108c
SS
1122 if (p[0] == 32 || p[1] == 32)
1123 {
1124 error ("Emulator reply is too short: %s", buf);
1125 }
c5aa993b 1126 myaddr[i - low_addr] = fromhex (p[0]) * 16 + fromhex (p[1]);
c906108c
SS
1127 }
1128}
1129
1130/* Information about the current target */
1131
1132static void
1133es1800_files_info (tops)
1134 struct target_ops *tops; /* Unused */
1135{
1136 printf ("ES1800 Attached to %s at %d baud in %s mode\n", savename, 19200,
1137 MODE);
1138}
1139
1140
1141/* We read the contents of the target location and stash it,
1142 then overwrite it with a breakpoint instruction.
c5aa993b 1143
c906108c
SS
1144 addr - is the target location in the target machine.
1145 contents_cache - is a pointer to memory allocated for saving the target contents.
c5aa993b
JM
1146 It is guaranteed by the caller to be long enough to save sizeof
1147 BREAKPOINT bytes.
1148
c906108c
SS
1149 FIXME: This size is target_arch dependent and should be available in
1150 the target_arch transfer vector, if we ever have one... */
1151
1152static int
1153es1800_insert_breakpoint (addr, contents_cache)
1154 CORE_ADDR addr;
1155 char *contents_cache;
1156{
c5aa993b 1157 int val;
c906108c
SS
1158
1159 val = target_read_memory (addr, contents_cache, sizeof (es1800_break_insn));
1160
1161 if (val == 0)
1162 {
1163 val = target_write_memory (addr, es1800_break_insn,
1164 sizeof (es1800_break_insn));
1165 }
1166
1167 return (val);
1168}
1169
1170
1171/* Write back the stashed instruction
c5aa993b 1172
c906108c
SS
1173 addr - is the target location in the target machine.
1174 contents_cache - is a pointer to memory allocated for saving the target contents.
c5aa993b
JM
1175 It is guaranteed by the caller to be long enough to save sizeof
1176 BREAKPOINT bytes. */
1177
c906108c
SS
1178static int
1179es1800_remove_breakpoint (addr, contents_cache)
1180 CORE_ADDR addr;
1181 char *contents_cache;
1182{
1183
1184 return (target_write_memory (addr, contents_cache,
1185 sizeof (es1800_break_insn)));
1186}
1187
1188/* create_break_insn ()
1189 Primitive datastructures containing the es1800 breakpoint instruction */
1190
1191static void
1192es1800_create_break_insn (ins, vec)
1193 char *ins;
1194 int vec;
1195{
1196 if (vec == 15)
1197 {
1198 ins[0] = 0x4e;
1199 ins[1] = 0x4f;
1200 }
1201}
1202
1203
1204/* verify_break ()
1205 Seach for breakpoint routine in emulator memory.
1206 returns non-zero on failure
1207 vec - trap vector used for breakpoints */
1208
1209static int
1210verify_break (vec)
1211 int vec;
1212{
1213 CORE_ADDR memaddress;
1214 char buf[8];
c5aa993b 1215 char *instr = "NqNqNqNs"; /* breakpoint routine */
c906108c
SS
1216 int status;
1217
1218 get_break_addr (vec, &memaddress);
1219
1220 if (memaddress)
1221 {
c5aa993b 1222 status = target_read_memory (memaddress, buf, 8);
c906108c
SS
1223 if (status != 0)
1224 {
1225 memory_error (status, memaddress);
1226 }
1227 return (STRCMP (instr, buf));
1228 }
c5aa993b 1229 return (-1);
c906108c
SS
1230}
1231
1232
1233/* get_break_addr ()
1234 find address of breakpint routine
1235 vec - trap vector used for breakpoints
c5aa993b 1236 addrp - store the address here */
c906108c
SS
1237
1238static void
1239get_break_addr (vec, addrp)
1240 int vec;
1241 CORE_ADDR *addrp;
1242{
1243 CORE_ADDR memaddress = 0;
1244 int status;
1245 int k;
1246 char buf[PBUFSIZ];
1247 char base_addr[4];
1248 char *p;
1249
1250 if (m68020)
1251 {
1252 send_with_reply ("VBR ", buf, sizeof (buf));
1253 p = buf;
1254 for (k = 0; k < 4; k++)
1255 {
c5aa993b 1256 if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
c906108c
SS
1257 {
1258 error ("Emulator reply is too short: %s", buf);
1259 }
c5aa993b 1260 base_addr[k] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
c906108c
SS
1261 }
1262 /* base addr of exception vector table */
1263 memaddress = *((CORE_ADDR *) base_addr);
1264 }
1265
c5aa993b
JM
1266 memaddress += (vec + 32) * 4; /* address of trap vector */
1267 status = target_read_memory (memaddress, (char *) addrp, 4);
1268 if (status != 0)
1269 {
1270 memory_error (status, memaddress);
1271 }
c906108c
SS
1272}
1273
1274
1275/* Kill an inferior process */
1276
1277static void
1278es1800_kill ()
1279{
1280 if (inferior_pid != 0)
1281 {
1282 inferior_pid = 0;
1283 es1800_mourn_inferior ();
1284 }
1285}
1286
1287
1288/* Load a file to the ES1800 emulator.
1289 Converts the file from a.out format into Extended Tekhex format
1290 before the file is loaded.
1291 Also loads the trap routine, and sets the ES1800 breakpoint on it
1292 filename - the a.out to be loaded
1293 from_tty - says whether to be verbose or not
c5aa993b
JM
1294 FIXME Uses emulator overlay memory for trap routine */
1295
c906108c
SS
1296static void
1297es1800_load (filename, from_tty)
1298 char *filename;
1299 int from_tty;
1300{
1301
1302 FILE *instream;
1303 char loadname[15];
1304 char buf[160];
1305 struct cleanup *old_chain;
1306 int es1800_load_format = 5;
1307
c5aa993b 1308 if (es1800_desc == NULL)
c906108c
SS
1309 {
1310 printf ("No emulator attached, type emulator-command first\n");
1311 return;
1312 }
1313
1314 filename = tilde_expand (filename);
1315 make_cleanup (free, filename);
1316
1317 switch (es1800_load_format)
1318 {
c5aa993b
JM
1319 case 2: /* Extended Tekhex */
1320 if (from_tty)
1321 {
1322 printf ("Converting \"%s\" to Extended Tekhex Format\n", filename);
1323 }
1324 sprintf (buf, "tekhex %s", filename);
1325 system (buf);
1326 sprintf (loadname, "out.hex");
1327 break;
1328
1329 case 5: /* Motorola S-rec */
1330 if (from_tty)
1331 {
1332 printf ("Converting \"%s\" to Motorola S-record format\n",
1333 filename);
1334 }
1335 /* in the future the source code in copy (part of binutils-1.93) will
1336 be included in this file */
1337 sprintf (buf,
1338 "copy -s \"a.out-sunos-big\" -d \"srec\" %s /tmp/out.hex",
1339 filename);
1340 system (buf);
1341 sprintf (loadname, "/tmp/out.hex");
1342 break;
1343
1344 default:
1345 error ("Downloading format not defined\n");
1346 }
1347
c906108c
SS
1348 breakpoint_init_inferior ();
1349 inferior_pid = 0;
1350 if (from_tty)
1351 {
c5aa993b 1352 printf ("Downloading \"%s\" to the ES 1800\n", filename);
c906108c
SS
1353 }
1354 if ((instream = fopen (loadname, "r")) == NULL)
1355 {
1356 perror_with_name ("fopen:");
1357 }
1358
1359 old_chain = make_cleanup (fclose, instream);
1360 immediate_quit++;
1361
1362 es1800_reset (0);
1363
1364 download (instream, from_tty, es1800_load_format);
1365
1366 /* if breakpoint routine is not present anymore we have to check
1367 whether to download a new breakpoint routine or not */
1368
1369 if ((verify_break (es1800_break_vec) != 0)
1370 && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
1371 {
1372 char buf[128];
1373 printf ("Using break vector 0x%x\n", es1800_break_vec);
1374 sprintf (buf, "0x%x ", es1800_break_vec);
1375 printf ("Give the start address of the breakpoint routine: ");
1376 fgets (buf + strlen (buf), sizeof (buf) - strlen (buf), stdin);
1377 es1800_init_break (buf, 0);
1378 }
1379
1380 do_cleanups (old_chain);
1381 expect_prompt ();
c5aa993b 1382 readchar (); /* FIXME I am getting a ^G = 7 after the prompt */
c906108c
SS
1383 printf ("\n");
1384
1385 if (fclose (instream) == EOF)
1386 {
1387 ;
1388 }
1389
1390 if (es1800_load_format != 2)
1391 {
1392 sprintf (buf, "/usr/bin/rm %s", loadname);
1393 system (buf);
1394 }
1395
c5aa993b 1396 symbol_file_command (filename, from_tty); /* reading symbol table */
c906108c
SS
1397 immediate_quit--;
1398}
1399
1400#if 0
1401
1402#define NUMCPYBYTES 20
1403
1404static void
1405bfd_copy (from_bfd, to_bfd)
1406 bfd *from_bfd;
1407 bfd *to_bfd;
1408{
1409 asection *p, *new;
1410 int i;
1411 char buf[NUMCPYBYTES];
1412
1413 for (p = from_bfd->sections; p != NULL; p = p->next)
1414 {
1415 printf (" Copying section %s. Size = %x.\n", p->name, p->_cooked_size);
1416 printf (" vma = %x, offset = %x, output_sec = %x\n",
1417 p->vma, p->output_offset, p->output_section);
1418 new = bfd_make_section (to_bfd, p->name);
1419 if (p->_cooked_size &&
1420 !bfd_set_section_size (to_bfd, new, p->_cooked_size))
1421 {
1422 error ("Wrong BFD size!\n");
1423 }
1424 if (!bfd_set_section_flags (to_bfd, new, p->flags))
1425 {
1426 error ("bfd_set_section_flags");
1427 }
1428 new->vma = p->vma;
c5aa993b
JM
1429
1430 for (i = 0; (i + NUMCPYBYTES) < p->_cooked_size; i += NUMCPYBYTES)
c906108c
SS
1431 {
1432 if (!bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
c5aa993b 1433 (bfd_size_type) NUMCPYBYTES))
c906108c
SS
1434 {
1435 error ("bfd_get_section_contents\n");
1436 }
c5aa993b
JM
1437 if (!bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
1438 (bfd_size_type) NUMCPYBYTES))
1439 {
1440 error ("bfd_set_section_contents\n");
1441 }
1442 }
c906108c
SS
1443 bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1444 (bfd_size_type) (p->_cooked_size - i));
c5aa993b 1445 bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
c906108c
SS
1446 (bfd_size_type) (p->_cooked_size - i));
1447 }
1448}
1449
1450#endif
1451
1452/* Start an process on the es1800 and set inferior_pid to the new
1453 process' pid.
1454 execfile - the file to run
1455 args - arguments passed to the program
c5aa993b 1456 env - the environment vector to pass */
c906108c
SS
1457
1458static void
1459es1800_create_inferior (execfile, args, env)
1460 char *execfile;
1461 char *args;
1462 char **env;
1463{
1464 int entry_pt;
1465 int pid;
1466#if 0
1467 struct expression *expr;
1468 register struct cleanup *old_chain = 0;
1469 register value val;
1470#endif
1471
1472 if (args && *args)
1473 {
1474 error ("Can't pass arguments to remote ES1800 process");
1475 }
1476
1477#if 0
1478 if (query ("Use 'start' as entry point? "))
1479 {
1480 expr = parse_c_expression ("start");
1481 old_chain = make_cleanup (free_current_contents, &expr);
1482 val = evaluate_expression (expr);
1483 entry_pt = (val->location).address;
1484 }
1485 else
1486 {
1487 printf ("Enter the program's entry point (in hexadecimal): ");
1488 scanf ("%x", &entry_pt);
1489 }
1490#endif
1491
1492 if (execfile == 0 || exec_bfd == 0)
1493 {
1494 error ("No executable file specified");
1495 }
1496
1497 entry_pt = (int) bfd_get_start_address (exec_bfd);
1498
1499 pid = 42;
1500
1501 /* Now that we have a child process, make it our target. */
1502
1503 push_target (&es1800_child_ops);
1504
1505 /* The "process" (board) is already stopped awaiting our commands, and
1506 the program is already downloaded. We just set its PC and go. */
1507
1508 inferior_pid = pid; /* Needed for wait_for_inferior below */
1509
1510 clear_proceed_status ();
1511
1512 /* Tell wait_for_inferior that we've started a new process. */
1513
1514 init_wait_for_inferior ();
1515
1516 /* Set up the "saved terminal modes" of the inferior
1517 based on what modes we are starting it with. */
1518
1519 target_terminal_init ();
1520
1521 /* Install inferior's terminal modes. */
1522
1523 target_terminal_inferior ();
1524
1525 /* remote_start (args); */
1526 /* trap_expected = 0; */
1527 /* insert_step_breakpoint (); FIXME, do we need this? */
1528
1529 /* Let 'er rip... */
1530 proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0);
1531
1532}
1533
1534
1535/* The process has died, clean up. */
1536
1537static void
1538es1800_mourn_inferior ()
1539{
1540 remove_breakpoints ();
1541 unpush_target (&es1800_child_ops);
1542 generic_mourn_inferior (); /* Do all the proper things now */
1543}
1544
1545/* ES1800-protocol specific routines */
1546
1547/* Keep discarding input from the remote system, until STRING is found.
1548 Let the user break out immediately.
1549 string - the string to expect
1550 nowait - break out if string not the emulator's first respond otherwise
c5aa993b
JM
1551 read until string is found (== 0) */
1552
c906108c
SS
1553static void
1554expect (string, nowait)
1555 char *string;
c5aa993b 1556 int nowait;
c906108c
SS
1557{
1558 char c;
1559 char *p = string;
1560
1561 immediate_quit++;
1562 while (1)
1563 {
1564 c = readchar ();
1565 if (isalpha (c))
1566 {
1567 c = toupper (c);
1568 }
1569 if (c == toupper (*p))
1570 {
1571 p++;
1572 if (*p == '\0')
1573 {
1574 immediate_quit--;
1575 return;
1576 }
1577 }
1578 else if (!nowait)
1579 {
1580 p = string;
1581 }
1582 else
1583 {
c5aa993b 1584 printf ("\'%s\' expected\n", string);
c906108c 1585 printf ("char %d is %d", p - string, c);
c5aa993b 1586 error ("\n");
c906108c
SS
1587 }
1588 }
1589}
1590
1591/* Keep discarding input until we see the prompt. */
1592
1593static void
1594expect_prompt ()
1595{
1596 expect (">", 0);
1597}
1598
1599
1600/* Read one character */
1601
1602#ifdef DEBUG_STDIN
1603
1604/* read from stdin */
1605
1606static int
1607readchar ()
1608{
1609 char buf[1];
1610
1611 buf[0] = '\0';
1612 printf ("readchar, give one character\n");
1613 read (0, buf, 1);
1614
1615#if defined (LOG_FILE)
1616 putc (buf[0] & 0x7f, log_file);
1617#endif
1618
1619 return (buf[0] & 0x7f);
1620}
1621
c5aa993b 1622#else /* !DEBUG_STDIN */
c906108c
SS
1623
1624/* Read a character from the remote system, doing all the fancy
1625 timeout stuff. */
1626
1627static int
1628readchar ()
1629{
1630 int ch;
1631
1632 ch = SERIAL_READCHAR (es1800_desc, timeout);
1633
1634 /* FIXME: doing an error() here will probably cause trouble, at least if from
1635 es1800_wait. */
1636 if (ch == SERIAL_TIMEOUT)
1637 error ("Timeout reading from remote system.");
1638 else if (ch == SERIAL_ERROR)
1639 perror_with_name ("remote read");
1640
1641#if defined (LOG_FILE)
1642 putc (ch & 0x7f, log_file);
1643 fflush (log_file);
1644#endif
1645
1646 return (ch);
1647}
1648
c5aa993b 1649#endif /* DEBUG_STDIN */
c906108c
SS
1650
1651
1652/* Send a command to the emulator and save the reply.
1653 Report an error if we get an error reply.
1654 string - the es1800 command
1655 buf - containing the emulator reply on return
1656 len - size of buf */
1657
1658static void
1659send_with_reply (string, buf, len)
c5aa993b
JM
1660 char *string, *buf;
1661 int len;
c906108c
SS
1662{
1663 send (string);
1664 SERIAL_WRITE (es1800_desc, "\r", 1);
1665
1666#ifndef DEBUG_STDIN
1667 expect (string, 1);
1668 expect ("\r\n", 0);
1669#endif
1670
1671 getmessage (buf, len);
1672}
1673
1674
1675/* Send the command in STR to the emulator adding \r. check
1676 the echo for consistency.
1677 string - the es1800 command */
c5aa993b 1678
c906108c
SS
1679static void
1680send_command (string)
1681 char *string;
1682{
1683 send (string);
1684 SERIAL_WRITE (es1800_desc, "\r", 1);
1685
1686#ifndef DEBUG_STDIN
1687 expect (string, 0);
1688 expect_prompt ();
1689#endif
1690
1691}
1692
1693/* Send a string
1694 string - the es1800 command */
1695
1696static void
1697send (string)
1698 char *string;
1699{
c5aa993b 1700 if (kiodebug)
c906108c
SS
1701 {
1702 fprintf (stderr, "Sending: %s\n", string);
1703 }
1704 SERIAL_WRITE (es1800_desc, string, strlen (string));
1705}
1706
1707
1708/* Read a message from the emulator and store it in BUF.
1709 buf - containing the emulator reply on return
1710 len - size of buf */
c5aa993b 1711
c906108c
SS
1712static void
1713getmessage (buf, len)
1714 char *buf;
1715 int len;
1716{
1717 char *bp;
1718 int c;
1719 int prompt_found = 0;
1720 extern kiodebug;
1721
1722#if defined (LOG_FILE)
1723 /* This is a convenient place to do this. The idea is to do it often
1724 enough that we never lose much data if we terminate abnormally. */
1725 fflush (log_file);
1726#endif
1727
1728 bp = buf;
1729 c = readchar ();
1730 do
1731 {
c5aa993b 1732 if (c)
c906108c 1733 {
c5aa993b 1734 if (len-- < 2) /* char and terminaling NULL */
c906108c
SS
1735 {
1736 error ("input buffer overrun\n");
1737 }
1738 *bp++ = c;
1739 }
1740 c = readchar ();
1741 if ((c == '>') && (*(bp - 1) == ' '))
1742 {
1743 prompt_found = 1;
1744 }
1745 }
1746 while (!prompt_found);
1747 *bp = 0;
c5aa993b 1748
c906108c
SS
1749 if (kiodebug)
1750 {
c5aa993b 1751 fprintf (stderr, "message received :%s\n", buf);
c906108c
SS
1752 }
1753}
1754
1755static void
1756download (instream, from_tty, format)
c5aa993b 1757 FILE *instream;
c906108c
SS
1758 int from_tty;
1759 int format;
1760{
1761 char c;
1762 char buf[160];
1763 int i = 0;
1764
c5aa993b
JM
1765 send_command ("SET #2,$1A"); /* reset char = ^Z */
1766 send_command ("SET #3,$11,$13"); /* XON XOFF */
c906108c
SS
1767 if (format == 2)
1768 {
1769 send_command ("SET #26,#2");
1770 }
1771 else
1772 {
c5aa993b 1773 send_command ("SET #26,#5"); /* Format=Extended Tekhex */
c906108c
SS
1774 }
1775 send_command ("DFB = $10");
1776 send_command ("PUR");
1777 send_command ("CES");
1778 send ("DNL\r");
1779 expect ("DNL", 1);
1780 if (from_tty)
1781 {
1782 printf (" 0 records loaded...\r");
1783 }
1784 while (fgets (buf, 160, instream))
c5aa993b
JM
1785 {
1786 send (buf);
1787 if (from_tty)
1788 {
1789 printf ("%5d\b\b\b\b\b", ++i);
1790 fflush (stdout);
1791 }
1792 if ((c = readchar ()) != 006)
1793 {
1794 error ("expected ACK");
1795 }
1796 }
c906108c
SS
1797 if (from_tty)
1798 {
1799 printf ("- All");
1800 }
1801}
1802
1803/* Additional commands */
1804
1805#if defined (TIOCGETP) && defined (FNDELAY) && defined (EWOULDBLOCK)
1806#define PROVIDE_TRANSPARENT
1807#endif
1808
1809#ifdef PROVIDE_TRANSPARENT
1810/* Talk directly to the emulator
1811 FIXME, uses busy wait, and is SUNOS (or at least BSD) specific */
1812
c5aa993b
JM
1813/*ARGSUSED */
1814static void
c906108c
SS
1815es1800_transparent (args, from_tty)
1816 char *args;
1817 int from_tty;
1818{
1819 int console;
1820 struct sgttyb modebl;
1821 int fcflag;
1822 int cc;
1823 struct sgttyb console_mode_save;
1824 int console_fc_save;
1825 int es1800_fc_save;
1826 int inputcnt = 80;
1827 char inputbuf[80];
1828 int consolecnt = 0;
1829 char consolebuf[80];
1830 int es1800_cnt = 0;
1831 char es1800_buf[80];
1832 int i;
1833
1834 dont_repeat ();
c5aa993b 1835 if (es1800_desc == NULL)
c906108c
SS
1836 {
1837 printf ("No emulator attached, type emulator-command first\n");
1838 return;
1839 }
1840
1841 printf ("\n");
1842 printf ("You are now communicating directly with the ES 1800 emulator.\n");
1843 printf ("To leave this mode (transparent mode), press ^E.\n");
1844 printf ("\n");
1845 printf (" >");
1846 fflush (stdout);
1847
c5aa993b 1848 if ((console = open ("/dev/tty", O_RDWR)) == -1)
c906108c
SS
1849 {
1850 perror_with_name ("/dev/tty:");
1851 }
1852
1853 if ((fcflag = fcntl (console, F_GETFL, 0)) == -1)
1854 {
1855 perror_with_name ("fcntl console");
1856 }
1857
1858 console_fc_save = fcflag;
1859 fcflag = fcflag | FNDELAY;
1860
1861 if (fcntl (console, F_SETFL, fcflag) == -1)
1862 {
1863 perror_with_name ("fcntl console");
1864 }
1865
1866 if (ioctl (console, TIOCGETP, &modebl))
1867 {
1868 perror_with_name ("ioctl console");
1869 }
1870
1871 console_mode_save = modebl;
c5aa993b 1872 modebl.sg_flags = RAW;
c906108c
SS
1873
1874 if (ioctl (console, TIOCSETP, &modebl))
1875 {
1876 perror_with_name ("ioctl console");
1877 }
1878
1879 if ((fcflag = fcntl (es1800_desc->fd, F_GETFL, 0)) == -1)
1880 {
1881 perror_with_name ("fcntl serial");
1882 }
1883
1884 es1800_fc_save = fcflag;
1885 fcflag = fcflag | FNDELAY;
1886
1887 if (fcntl (es1800_desc->fd, F_SETFL, fcflag) == -1)
1888 {
1889 perror_with_name ("fcntl serial");
1890 }
1891
1892 while (1)
c5aa993b 1893 {
c906108c
SS
1894 cc = read (console, inputbuf, inputcnt);
1895 if (cc != -1)
1896 {
1897 if ((*inputbuf & 0x7f) == 0x05)
1898 {
1899 break;
1900 }
c5aa993b 1901 for (i = 0; i < cc;)
c906108c
SS
1902 {
1903 es1800_buf[es1800_cnt++] = inputbuf[i++];
1904 }
1905 if ((cc = SERIAL_WRITE (es1800_desc, es1800_buf, es1800_cnt)) == -1)
1906 {
1907 perror_with_name ("FEL! write:");
1908 }
1909 es1800_cnt -= cc;
c5aa993b 1910 if (es1800_cnt && cc)
c906108c
SS
1911 {
1912 for (i = 0; i < es1800_cnt; i++)
1913 {
c5aa993b 1914 es1800_buf[i] = es1800_buf[cc + i];
c906108c
SS
1915 }
1916 }
1917 }
1918 else if (errno != EWOULDBLOCK)
1919 {
1920 perror_with_name ("FEL! read:");
1921 }
c5aa993b
JM
1922
1923 cc = read (es1800_desc->fd, inputbuf, inputcnt);
c906108c
SS
1924 if (cc != -1)
1925 {
c5aa993b 1926 for (i = 0; i < cc;)
c906108c
SS
1927 {
1928 consolebuf[consolecnt++] = inputbuf[i++];
1929 }
c5aa993b 1930 if ((cc = write (console, consolebuf, consolecnt)) == -1)
c906108c
SS
1931 {
1932 perror_with_name ("FEL! write:");
1933 }
1934 consolecnt -= cc;
c5aa993b 1935 if (consolecnt && cc)
c906108c
SS
1936 {
1937 for (i = 0; i < consolecnt; i++)
1938 {
c5aa993b 1939 consolebuf[i] = consolebuf[cc + i];
c906108c
SS
1940 }
1941 }
1942 }
1943 else if (errno != EWOULDBLOCK)
1944 {
1945 perror_with_name ("FEL! read:");
1946 }
1947 }
1948
1949 console_fc_save = console_fc_save & !FNDELAY;
1950 if (fcntl (console, F_SETFL, console_fc_save) == -1)
1951 {
1952 perror_with_name ("FEL! fcntl");
1953 }
1954
1955 if (ioctl (console, TIOCSETP, &console_mode_save))
1956 {
1957 perror_with_name ("FEL! ioctl");
1958 }
1959
1960 close (console);
1961
1962 if (fcntl (es1800_desc->fd, F_SETFL, es1800_fc_save) == -1)
1963 {
1964 perror_with_name ("FEL! fcntl");
1965 }
1966
1967 printf ("\n");
1968
1969}
1970#endif /* PROVIDE_TRANSPARENT */
1971
1972static void
1973es1800_init_break (args, from_tty)
1974 char *args;
1975 int from_tty;
1976{
1977 CORE_ADDR memaddress = 0;
1978 char buf[PBUFSIZ];
1979 char base_addr[4];
1980 char *space_index;
1981 char *p;
1982 int k;
1983
1984 if (args == NULL)
1985 {
1986 error_no_arg ("a trap vector");
1987 }
1988
1989 if (!(space_index = strchr (args, ' ')))
1990 {
1991 error ("Two arguments needed (trap vector and address of break routine).\n");
1992 }
1993
1994 *space_index = '\0';
1995
1996 es1800_break_vec = strtol (args, (char **) NULL, 0);
1997 es1800_break_address = parse_and_eval_address (space_index + 1);
1998
1999 es1800_create_break_insn (es1800_break_insn, es1800_break_vec);
2000
2001 if (m68020)
2002 {
2003 send_with_reply ("VBR ", buf, sizeof (buf));
2004 p = buf;
2005 for (k = 0; k < 4; k++)
2006 {
c5aa993b 2007 if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
c906108c
SS
2008 {
2009 error ("Emulator reply is too short: %s", buf);
2010 }
c5aa993b 2011 base_addr[k] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
c906108c
SS
2012 }
2013 /* base addr of exception vector table */
c5aa993b 2014 memaddress = *((CORE_ADDR *) base_addr);
c906108c
SS
2015 }
2016
c5aa993b 2017 memaddress += (es1800_break_vec + 32) * 4; /* address of trap vector */
c906108c
SS
2018
2019 sprintf (buf, "@.L%lx=$%lx", memaddress, es1800_break_address);
c5aa993b
JM
2020 send_command (buf); /* set the address of the break routine in the */
2021 /* trap vector */
2022
2023 sprintf (buf, "@.L%lx=$4E714E71", es1800_break_address); /* NOP; NOP */
c906108c 2024 send_command (buf);
c5aa993b 2025 sprintf (buf, "@.L%lx=$4E714E73", es1800_break_address + 4); /* NOP; RTE */
c906108c 2026 send_command (buf);
c5aa993b 2027
c906108c
SS
2028 sprintf (buf, "AC2=$%lx", es1800_break_address + 4);
2029 /* breakpoint at es1800-break_address */
2030 send_command (buf);
c5aa993b 2031 send_command ("WHEN AC2 THEN BRK"); /* ie in exception routine */
c906108c
SS
2032
2033 if (from_tty)
2034 {
2035 printf ("Breakpoint (trap $%x) routine at address: %lx\n",
2036 es1800_break_vec, es1800_break_address);
2037 }
c5aa993b 2038}
c906108c
SS
2039
2040static void
2041es1800_child_open (arg, from_tty)
2042 char *arg;
2043 int from_tty;
2044{
2045 error ("Use the \"run\" command to start a child process.");
2046}
2047
2048static void
2049es1800_child_detach (args, from_tty)
2050 char *args;
2051 int from_tty;
2052{
2053 if (args)
2054 {
2055 error ("Argument given to \"detach\" when remotely debugging.");
2056 }
c5aa993b 2057
c906108c
SS
2058 pop_target ();
2059 if (from_tty)
2060 {
2061 printf ("Ending debugging the process %d.\n", inferior_pid);
2062 }
2063}
2064
2065
2066/* Define the target subroutine names */
2067
c5aa993b 2068struct target_ops es1800_ops;
c906108c 2069
c5aa993b
JM
2070static void
2071init_es1800_ops (void)
c906108c 2072{
c5aa993b
JM
2073 es1800_ops.to_shortname = "es1800";
2074 es1800_ops.to_longname = "Remote serial target in ES1800-emulator protocol";
2075 es1800_ops.to_doc = "Remote debugging on the es1800 emulator via a serial line.\n\
2076Specify the serial device it is connected to (e.g. /dev/ttya).";
2077 es1800_ops.to_open = es1800_open;
2078 es1800_ops.to_close = es1800_close;
2079 es1800_ops.to_attach = es1800_attach;
2080 es1800_ops.to_post_attach = NULL;
c906108c 2081 es1800_ops.to_require_attach = NULL;
c5aa993b 2082 es1800_ops.to_detach = es1800_detach;
c906108c 2083 es1800_ops.to_require_detach = NULL;
c5aa993b
JM
2084 es1800_ops.to_resume = es1800_resume;
2085 es1800_ops.to_wait = NULL;
2086 es1800_ops.to_post_wait = NULL;
2087 es1800_ops.to_fetch_registers = NULL;
2088 es1800_ops.to_store_registers = NULL;
2089 es1800_ops.to_prepare_to_store = es1800_prepare_to_store;
2090 es1800_ops.to_xfer_memory = es1800_xfer_inferior_memory;
2091 es1800_ops.to_files_info = es1800_files_info;
2092 es1800_ops.to_insert_breakpoint = es1800_insert_breakpoint;
2093 es1800_ops.to_remove_breakpoint = es1800_remove_breakpoint;
2094 es1800_ops.to_terminal_init = NULL;
2095 es1800_ops.to_terminal_inferior = NULL;
2096 es1800_ops.to_terminal_ours_for_output = NULL;
2097 es1800_ops.to_terminal_ours = NULL;
2098 es1800_ops.to_terminal_info = NULL;
2099 es1800_ops.to_kill = NULL;
2100 es1800_ops.to_load = es1800_load;
2101 es1800_ops.to_lookup_symbol = NULL;
2102 es1800_ops.to_create_inferior = es1800_create_inferior;
c906108c
SS
2103 es1800_ops.to_post_startup_inferior = NULL;
2104 es1800_ops.to_acknowledge_created_inferior = NULL;
c5aa993b 2105 es1800_ops.to_clone_and_follow_inferior = NULL;
c906108c
SS
2106 es1800_ops.to_post_follow_inferior_by_clone = NULL;
2107 es1800_ops.to_insert_fork_catchpoint = NULL;
2108 es1800_ops.to_remove_fork_catchpoint = NULL;
2109 es1800_ops.to_insert_vfork_catchpoint = NULL;
c5aa993b 2110 es1800_ops.to_remove_vfork_catchpoint = NULL;
c906108c 2111 es1800_ops.to_has_forked = NULL;
c5aa993b
JM
2112 es1800_ops.to_has_vforked = NULL;
2113 es1800_ops.to_can_follow_vfork_prior_to_exec = NULL;
c906108c
SS
2114 es1800_ops.to_post_follow_vfork = NULL;
2115 es1800_ops.to_insert_exec_catchpoint = NULL;
2116 es1800_ops.to_remove_exec_catchpoint = NULL;
2117 es1800_ops.to_has_execd = NULL;
2118 es1800_ops.to_reported_exec_events_per_exec_call = NULL;
2119 es1800_ops.to_has_exited = NULL;
c5aa993b
JM
2120 es1800_ops.to_mourn_inferior = NULL;
2121 es1800_ops.to_can_run = 0;
2122 es1800_ops.to_notice_signals = 0;
2123 es1800_ops.to_thread_alive = 0;
2124 es1800_ops.to_stop = 0;
c906108c 2125 es1800_ops.to_pid_to_exec_file = NULL;
c5aa993b
JM
2126 es1800_ops.to_core_file_to_sym_file = NULL;
2127 es1800_ops.to_stratum = core_stratum;
2128 es1800_ops.DONT_USE = 0;
2129 es1800_ops.to_has_all_memory = 0;
2130 es1800_ops.to_has_memory = 1;
2131 es1800_ops.to_has_stack = 0;
2132 es1800_ops.to_has_registers = 0;
2133 es1800_ops.to_has_execution = 0;
2134 es1800_ops.to_sections = NULL;
2135 es1800_ops.to_sections_end = NULL;
2136 es1800_ops.to_magic = OPS_MAGIC;
c906108c
SS
2137}
2138
2139/* Define the target subroutine names */
2140
c5aa993b 2141struct target_ops es1800_child_ops;
c906108c 2142
c5aa993b
JM
2143static void
2144init_es1800_child_ops (void)
c906108c 2145{
c5aa993b
JM
2146 es1800_child_ops.to_shortname = "es1800_process";
2147 es1800_child_ops.to_longname = "Remote serial target in ES1800-emulator protocol";
2148 es1800_child_ops.to_doc = "Remote debugging on the es1800 emulator via a serial line.\n\
c906108c 2149Specify the serial device it is connected to (e.g. /dev/ttya).";
c5aa993b
JM
2150 es1800_child_ops.to_open = es1800_child_open;
2151 es1800_child_ops.to_close = NULL;
2152 es1800_child_ops.to_attach = es1800_attach;
c906108c 2153 es1800_child_ops.to_post_attach = NULL;
c5aa993b
JM
2154 es1800_child_ops.to_require_attach = NULL;
2155 es1800_child_ops.to_detach = es1800_child_detach;
2156 es1800_child_ops.to_require_detach = NULL;
2157 es1800_child_ops.to_resume = es1800_resume;
2158 es1800_child_ops.to_wait = es1800_wait;
2159 es1800_child_ops.to_post_wait = NULL;
2160 es1800_child_ops.to_fetch_registers = es1800_fetch_register;
2161 es1800_child_ops.to_store_registers = es1800_store_register;
2162 es1800_child_ops.to_prepare_to_store = es1800_prepare_to_store;
2163 es1800_child_ops.to_xfer_memory = es1800_xfer_inferior_memory;
2164 es1800_child_ops.to_files_info = es1800_files_info;
2165 es1800_child_ops.to_insert_breakpoint = es1800_insert_breakpoint;
2166 es1800_child_ops.to_remove_breakpoint = es1800_remove_breakpoint;
2167 es1800_child_ops.to_terminal_init = NULL;
2168 es1800_child_ops.to_terminal_inferior = NULL;
2169 es1800_child_ops.to_terminal_ours_for_output = NULL;
2170 es1800_child_ops.to_terminal_ours = NULL;
2171 es1800_child_ops.to_terminal_info = NULL;
2172 es1800_child_ops.to_kill = es1800_kill;
2173 es1800_child_ops.to_load = es1800_load;
2174 es1800_child_ops.to_lookup_symbol = NULL;
2175 es1800_child_ops.to_create_inferior = es1800_create_inferior;
c906108c
SS
2176 es1800_child_ops.to_post_startup_inferior = NULL;
2177 es1800_child_ops.to_acknowledge_created_inferior = NULL;
2178 es1800_child_ops.to_clone_and_follow_inferior = NULL;
2179 es1800_child_ops.to_post_follow_inferior_by_clone = NULL;
2180 es1800_child_ops.to_insert_fork_catchpoint = NULL;
2181 es1800_child_ops.to_remove_fork_catchpoint = NULL;
2182 es1800_child_ops.to_insert_vfork_catchpoint = NULL;
c5aa993b 2183 es1800_child_ops.to_remove_vfork_catchpoint = NULL;
c906108c 2184 es1800_child_ops.to_has_forked = NULL;
c5aa993b 2185 es1800_child_ops.to_has_vforked = NULL;
c906108c
SS
2186 es1800_child_ops.to_can_follow_vfork_prior_to_exec = NULL;
2187 es1800_child_ops.to_post_follow_vfork = NULL;
2188 es1800_child_ops.to_insert_exec_catchpoint = NULL;
2189 es1800_child_ops.to_remove_exec_catchpoint = NULL;
2190 es1800_child_ops.to_has_execd = NULL;
2191 es1800_child_ops.to_reported_exec_events_per_exec_call = NULL;
2192 es1800_child_ops.to_has_exited = NULL;
c5aa993b
JM
2193 es1800_child_ops.to_mourn_inferior = es1800_mourn_inferior;
2194 es1800_child_ops.to_can_run = 0;
2195 es1800_child_ops.to_notice_signals = 0;
2196 es1800_child_ops.to_thread_alive = 0;
2197 es1800_child_ops.to_stop = 0;
c906108c
SS
2198 es1800_child_ops.to_pid_to_exec_file = NULL;
2199 es1800_child_ops.to_core_file_to_sym_file = NULL;
c5aa993b
JM
2200 es1800_child_ops.to_stratum = process_stratum;
2201 es1800_child_ops.DONT_USE = 0;
2202 es1800_child_ops.to_has_all_memory = 1;
2203 es1800_child_ops.to_has_memory = 1;
2204 es1800_child_ops.to_has_stack = 1;
2205 es1800_child_ops.to_has_registers = 1;
2206 es1800_child_ops.to_has_execution = 1;
2207 es1800_child_ops.to_sections = NULL;
2208 es1800_child_ops.to_sections_end = NULL;
2209 es1800_child_ops.to_magic = OPS_MAGIC;
c906108c
SS
2210}
2211
2212void
2213_initialize_es1800 ()
2214{
c5aa993b
JM
2215 init_es1800_ops ();
2216 init_es1800_child_ops ();
c906108c
SS
2217 add_target (&es1800_ops);
2218 add_target (&es1800_child_ops);
2219#ifdef PROVIDE_TRANSPARENT
2220 add_com ("transparent", class_support, es1800_transparent,
2221 "Start transparent communication with the ES 1800 emulator.");
2222#endif /* PROVIDE_TRANSPARENT */
2223 add_com ("init_break", class_support, es1800_init_break,
c5aa993b 2224 "Download break routine and initialize break facility on ES 1800");
c906108c 2225}