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