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