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