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