Update/correct copyright notices.
[binutils-gdb.git] / gdb / remote-mm.c
1 /* Remote debugging interface for Am290*0 running MiniMON monitor, for GDB.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
3 2001 Free Software Foundation, Inc.
4 Originally written by Daniel Mann at AMD.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 /* This is like remote.c but ecpects MiniMON to be running on the Am29000
24 target hardware.
25 - David Wood (wood@lab.ultra.nyu.edu) at New York University adapted this
26 file to gdb 3.95. I was unable to get this working on sun3os4
27 with termio, only with sgtty. Because we are only attempting to
28 use this module to debug our kernel, which is already loaded when
29 gdb is started up, I did not code up the file downloading facilities.
30 As a result this module has only the stubs to download files.
31 You should get tagged at compile time if you need to make any
32 changes/additions. */
33
34 #include "defs.h"
35 #include "inferior.h"
36 #include "value.h"
37 #include <ctype.h>
38 #include <fcntl.h>
39 #include <signal.h>
40 #include <errno.h>
41 #include "gdb_string.h"
42 #include "terminal.h"
43 #include "minimon.h"
44 #include "target.h"
45 #include "regcache.h"
46
47 /* Offset of member MEMBER in a struct of type TYPE. */
48 #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
49
50 #define DRAIN_INPUT() (msg_recv_serial((union msg_t*)0))
51
52 extern int stop_soon_quietly; /* for wait_for_inferior */
53
54 static void mm_resume ();
55 static void mm_fetch_registers ();
56 static int fetch_register ();
57 static void mm_store_registers ();
58 static int store_register ();
59 static int regnum_to_srnum ();
60 static void mm_close ();
61 static char *msg_str ();
62 static char *error_msg_str ();
63 static int expect_msg ();
64 static void init_target_mm ();
65 static int mm_memory_space ();
66
67 #define FREEZE_MODE (read_register(CPS_REGNUM) && 0x400)
68 #define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
69
70 /* FIXME: Replace with `set remotedebug'. */
71 #define LLOG_FILE "minimon.log"
72 #if defined (LOG_FILE)
73 FILE *log_file;
74 #endif
75
76 /*
77 * Size of message buffers. I couldn't get memory reads to work when
78 * the byte_count was larger than 512 (it may be a baud rate problem).
79 */
80 #define BUFER_SIZE 512
81 /*
82 * Size of data area in message buffer on the TARGET (remote system).
83 */
84 #define MAXDATA_T (target_config.max_msg_size - \
85 offsetof(struct write_r_msg_t,data[0]))
86 /*
87 * Size of data area in message buffer on the HOST (gdb).
88 */
89 #define MAXDATA_H (BUFER_SIZE - offsetof(struct write_r_msg_t,data[0]))
90 /*
91 * Defined as the minimum size of data areas of the two message buffers
92 */
93 #define MAXDATA (MAXDATA_H < MAXDATA_T ? MAXDATA_H : MAXDATA_T)
94
95 static char out_buf[BUFER_SIZE];
96 static char in_buf[BUFER_SIZE];
97
98 int msg_recv_serial ();
99 int msg_send_serial ();
100
101 #define MAX_RETRIES 5000
102 extern struct target_ops mm_ops; /* Forward declaration */
103 struct config_msg_t target_config; /* HIF needs this */
104 union msg_t *out_msg_buf = (union msg_t *) out_buf;
105 union msg_t *in_msg_buf = (union msg_t *) in_buf;
106
107 static int timeout = 5;
108
109 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
110 mm_open knows that we don't have a file open when the program
111 starts. */
112 int mm_desc = -1;
113
114 /* stream which is fdopen'd from mm_desc. Only valid when
115 mm_desc != -1. */
116 FILE *mm_stream;
117
118 /* Called when SIGALRM signal sent due to alarm() timeout. */
119 #ifndef HAVE_TERMIO
120
121 #ifndef __STDC__
122 #ifndef volatile
123 #define volatile
124 /**/
125 # endif
126 #endif
127 volatile int n_alarms;
128
129 static void
130 mm_timer (void)
131 {
132 #if 0
133 if (kiodebug)
134 printf ("mm_timer called\n");
135 #endif
136 n_alarms++;
137 }
138 #endif /* HAVE_TERMIO */
139
140 /* malloc'd name of the program on the remote system. */
141 static char *prog_name = NULL;
142
143
144 /* Number of SIGTRAPs we need to simulate. That is, the next
145 NEED_ARTIFICIAL_TRAP calls to mm_wait should just return
146 SIGTRAP without actually waiting for anything. */
147
148 /**************************************************** REMOTE_CREATE_INFERIOR */
149 /* This is called not only when we first attach, but also when the
150 user types "run" after having attached. */
151 static void
152 mm_create_inferior (char *execfile, char *args, char **env)
153 {
154 #define MAX_TOKENS 25
155 #define BUFFER_SIZE 256
156 int token_count;
157 int result;
158 char *token[MAX_TOKENS];
159 char cmd_line[BUFFER_SIZE];
160
161 if (args && *args)
162 error ("Can't pass arguments to remote mm process (yet).");
163
164 if (execfile == 0 /* || exec_bfd == 0 */ )
165 error ("No executable file specified");
166
167 if (!mm_stream)
168 {
169 printf ("Minimon not open yet.\n");
170 return;
171 }
172
173 /* On ultra3 (NYU) we assume the kernel is already running so there is
174 no file to download.
175 FIXME: Fixed required here -> load your program, possibly with mm_load().
176 */
177 printf_filtered ("\n\
178 Assuming you are at NYU debuging a kernel, i.e., no need to download.\n\n");
179
180 /* We will get a task spawn event immediately. */
181 init_wait_for_inferior ();
182 clear_proceed_status ();
183 stop_soon_quietly = 1;
184 proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
185 normal_stop ();
186 }
187 /**************************************************** REMOTE_MOURN_INFERIOR */
188 static void
189 mm_mourn (void)
190 {
191 pop_target (); /* Pop back to no-child state */
192 generic_mourn_inferior ();
193 }
194
195 /********************************************************************** damn_b
196 */
197 /* Translate baud rates from integers to damn B_codes. Unix should
198 have outgrown this crap years ago, but even POSIX wouldn't buck it. */
199
200 #ifndef B19200
201 #define B19200 EXTA
202 #endif
203 #ifndef B38400
204 #define B38400 EXTB
205 #endif
206
207 static struct
208 {
209 int rate, damn_b;
210 }
211 baudtab[] =
212 {
213 {
214 0, B0
215 }
216 ,
217 {
218 50, B50
219 }
220 ,
221 {
222 75, B75
223 }
224 ,
225 {
226 110, B110
227 }
228 ,
229 {
230 134, B134
231 }
232 ,
233 {
234 150, B150
235 }
236 ,
237 {
238 200, B200
239 }
240 ,
241 {
242 300, B300
243 }
244 ,
245 {
246 600, B600
247 }
248 ,
249 {
250 1200, B1200
251 }
252 ,
253 {
254 1800, B1800
255 }
256 ,
257 {
258 2400, B2400
259 }
260 ,
261 {
262 4800, B4800
263 }
264 ,
265 {
266 9600, B9600
267 }
268 ,
269 {
270 19200, B19200
271 }
272 ,
273 {
274 38400, B38400
275 }
276 ,
277 {
278 -1, -1
279 }
280 ,
281 };
282
283 static int
284 damn_b (int rate)
285 {
286 int i;
287
288 for (i = 0; baudtab[i].rate != -1; i++)
289 if (rate == baudtab[i].rate)
290 return baudtab[i].damn_b;
291 return B38400; /* Random */
292 }
293
294
295 /***************************************************************** REMOTE_OPEN
296 ** Open a connection to remote minimon.
297 NAME is the filename used for communication, then a space,
298 then the baud rate.
299 'target adapt /dev/ttya 9600 [prognam]' for example.
300 */
301
302 static char *dev_name;
303 int baudrate = 9600;
304 static void
305 mm_open (char *name, int from_tty)
306 {
307 TERMINAL sg;
308 unsigned int prl;
309 char *p;
310
311 /* Find the first whitespace character, it separates dev_name from
312 prog_name. */
313 for (p = name;
314 p && *p && !isspace (*p); p++)
315 ;
316 if (p == 0 || *p == '\0')
317 erroid:
318 error ("Usage : <command> <serial-device> <baud-rate> [progname]");
319 dev_name = (char *) xmalloc (p - name + 1);
320 strncpy (dev_name, name, p - name);
321 dev_name[p - name] = '\0';
322
323 /* Skip over the whitespace after dev_name */
324 for (; isspace (*p); p++)
325 /*EMPTY */ ;
326
327 if (1 != sscanf (p, "%d ", &baudrate))
328 goto erroid;
329
330 /* Skip the number and then the spaces */
331 for (; isdigit (*p); p++)
332 /*EMPTY */ ;
333 for (; isspace (*p); p++)
334 /*EMPTY */ ;
335
336 if (prog_name != NULL)
337 xfree (prog_name);
338 prog_name = savestring (p, strlen (p));
339
340
341 if (mm_desc >= 0)
342 close (mm_desc);
343
344 mm_desc = open (dev_name, O_RDWR);
345 if (mm_desc < 0)
346 perror_with_name (dev_name);
347 ioctl (mm_desc, TIOCGETP, &sg);
348 #ifdef HAVE_TERMIO
349 sg.c_cc[VMIN] = 0; /* read with timeout. */
350 sg.c_cc[VTIME] = timeout * 10;
351 sg.c_lflag &= ~(ICANON | ECHO);
352 sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
353 #else
354 sg.sg_ispeed = damn_b (baudrate);
355 sg.sg_ospeed = damn_b (baudrate);
356 sg.sg_flags |= RAW;
357 sg.sg_flags |= ANYP;
358 sg.sg_flags &= ~ECHO;
359 #endif
360
361
362 ioctl (mm_desc, TIOCSETP, &sg);
363 mm_stream = fdopen (mm_desc, "r+");
364
365 push_target (&mm_ops);
366
367 #ifndef HAVE_TERMIO
368 #ifndef NO_SIGINTERRUPT
369 /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
370 the read. */
371 if (siginterrupt (SIGALRM, 1) != 0)
372 perror ("mm_open: error in siginterrupt");
373 #endif
374
375 /* Set up read timeout timer. */
376 if ((void (*)) signal (SIGALRM, mm_timer) == (void (*)) -1)
377 perror ("mm_open: error in signal");
378 #endif
379
380 #if defined (LOG_FILE)
381 log_file = fopen (LOG_FILE, "w");
382 if (log_file == NULL)
383 perror_with_name (LOG_FILE);
384 #endif
385 /*
386 ** Initialize target configuration structure (global)
387 */
388 DRAIN_INPUT ();
389 out_msg_buf->config_req_msg.code = CONFIG_REQ;
390 out_msg_buf->config_req_msg.length = 4 * 0;
391 msg_send_serial (out_msg_buf); /* send config request message */
392
393 expect_msg (CONFIG, in_msg_buf, 1);
394
395 a29k_get_processor_type ();
396
397 /* Print out some stuff, letting the user now what's going on */
398 printf_filtered ("Connected to MiniMon via %s.\n", dev_name);
399 /* FIXME: can this restriction be removed? */
400 printf_filtered ("Remote debugging using virtual addresses works only\n");
401 printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n")
402 ;
403 if (processor_type != a29k_freeze_mode)
404 {
405 fprintf_filtered (gdb_stderr,
406 "Freeze-mode debugging not available, and can only be done on an A29050.\n");
407 }
408
409 target_config.code = CONFIG;
410 target_config.length = 0;
411 target_config.processor_id = in_msg_buf->config_msg.processor_id;
412 target_config.version = in_msg_buf->config_msg.version;
413 target_config.I_mem_start = in_msg_buf->config_msg.I_mem_start;
414 target_config.I_mem_size = in_msg_buf->config_msg.I_mem_size;
415 target_config.D_mem_start = in_msg_buf->config_msg.D_mem_start;
416 target_config.D_mem_size = in_msg_buf->config_msg.D_mem_size;
417 target_config.ROM_start = in_msg_buf->config_msg.ROM_start;
418 target_config.ROM_size = in_msg_buf->config_msg.ROM_size;
419 target_config.max_msg_size = in_msg_buf->config_msg.max_msg_size;
420 target_config.max_bkpts = in_msg_buf->config_msg.max_bkpts;
421 target_config.coprocessor = in_msg_buf->config_msg.coprocessor;
422 target_config.reserved = in_msg_buf->config_msg.reserved;
423 if (from_tty)
424 {
425 printf ("Connected to MiniMON :\n");
426 printf (" Debugcore version %d.%d\n",
427 0x0f & (target_config.version >> 4),
428 0x0f & (target_config.version));
429 printf (" Configuration version %d.%d\n",
430 0x0f & (target_config.version >> 12),
431 0x0f & (target_config.version >> 8));
432 printf (" Message system version %d.%d\n",
433 0x0f & (target_config.version >> 20),
434 0x0f & (target_config.version >> 16));
435 printf (" Communication driver version %d.%d\n",
436 0x0f & (target_config.version >> 28),
437 0x0f & (target_config.version >> 24));
438 }
439
440 /* Leave the target running...
441 * The above message stopped the target in the dbg core (MiniMon),
442 * so restart the target out of MiniMon,
443 */
444 out_msg_buf->go_msg.code = GO;
445 out_msg_buf->go_msg.length = 0;
446 msg_send_serial (out_msg_buf);
447 /* No message to expect after a GO */
448 }
449
450 /**************************************************************** REMOTE_CLOSE
451 ** Close the open connection to the minimon debugger.
452 Use this when you want to detach and do something else
453 with your gdb. */
454 static void
455 mm_close ( /*FIXME: how is quitting used */
456 int quitting)
457 {
458 if (mm_desc < 0)
459 error ("Can't close remote connection: not debugging remotely.");
460
461 /* We should never get here if there isn't something valid in
462 mm_desc and mm_stream.
463
464 Due to a bug in Unix, fclose closes not only the stdio stream,
465 but also the file descriptor. So we don't actually close
466 mm_desc. */
467 DRAIN_INPUT ();
468 fclose (mm_stream);
469 /* close (mm_desc); */
470
471 /* Do not try to close mm_desc again, later in the program. */
472 mm_stream = NULL;
473 mm_desc = -1;
474
475 #if defined (LOG_FILE)
476 if (ferror (log_file))
477 printf ("Error writing log file.\n");
478 if (fclose (log_file) != 0)
479 printf ("Error closing log file.\n");
480 #endif
481
482 printf ("Ending remote debugging\n");
483 }
484
485 /************************************************************* REMOTE_ATACH */
486 /* Attach to a program that is already loaded and running
487 * Upon exiting the process's execution is stopped.
488 */
489 static void
490 mm_attach (char *args, int from_tty)
491 {
492
493 if (!mm_stream)
494 error ("MiniMon not opened yet, use the 'target minimon' command.\n");
495
496 if (from_tty)
497 printf ("Attaching to remote program %s...\n", prog_name);
498
499 /* Make sure the target is currently running, it is supposed to be. */
500 /* FIXME: is it ok to send MiniMon a BREAK if it is already stopped in
501 * the dbg core. If so, we don't need to send this GO.
502 */
503 out_msg_buf->go_msg.code = GO;
504 out_msg_buf->go_msg.length = 0;
505 msg_send_serial (out_msg_buf);
506 sleep (2); /* At the worst it will stop, receive a message, continue */
507
508 /* Send the mm a break. */
509 out_msg_buf->break_msg.code = BREAK;
510 out_msg_buf->break_msg.length = 0;
511 msg_send_serial (out_msg_buf);
512 }
513 /********************************************************** REMOTE_DETACH */
514 /* Terminate the open connection to the remote debugger.
515 Use this when you want to detach and do something else
516 with your gdb. Leave remote process running (with no breakpoints set). */
517 static void
518 mm_detach (char *args, int from_tty)
519 {
520 remove_breakpoints (); /* Just in case there were any left in */
521 out_msg_buf->go_msg.code = GO;
522 out_msg_buf->go_msg.length = 0;
523 msg_send_serial (out_msg_buf);
524 pop_target (); /* calls mm_close to do the real work */
525 }
526
527
528 /*************************************************************** REMOTE_RESUME
529 ** Tell the remote machine to resume. */
530
531 static void
532 mm_resume (int pid, int step, enum target_signal sig)
533 {
534 if (sig != TARGET_SIGNAL_0)
535 warning ("Can't send signals to a remote MiniMon system.");
536
537 if (step)
538 {
539 out_msg_buf->step_msg.code = STEP;
540 out_msg_buf->step_msg.length = 1 * 4;
541 out_msg_buf->step_msg.count = 1; /* step 1 instruction */
542 msg_send_serial (out_msg_buf);
543 }
544 else
545 {
546 out_msg_buf->go_msg.code = GO;
547 out_msg_buf->go_msg.length = 0;
548 msg_send_serial (out_msg_buf);
549 }
550 }
551
552 /***************************************************************** REMOTE_WAIT
553 ** Wait until the remote machine stops, then return,
554 storing status in STATUS just as `wait' would. */
555
556 static int
557 mm_wait (struct target_waitstatus *status)
558 {
559 int i, result;
560 int old_timeout = timeout;
561 int old_immediate_quit = immediate_quit;
562
563 status->kind = TARGET_WAITKIND_EXITED;
564 status->value.integer = 0;
565
566 /* wait for message to arrive. It should be:
567 - A HIF service request.
568 - A HIF exit service request.
569 - A CHANNEL0_ACK.
570 - A CHANNEL1 request.
571 - a debugcore HALT message.
572 HIF services must be responded too, and while-looping continued.
573 If the target stops executing, mm_wait() should return.
574 */
575 timeout = 0; /* Wait indefinetly for a message */
576 immediate_quit = 1; /* Helps ability to QUIT */
577 while (1)
578 {
579 while (msg_recv_serial (in_msg_buf))
580 {
581 QUIT; /* Let user quit if they want */
582 }
583 switch (in_msg_buf->halt_msg.code)
584 {
585 case HIF_CALL:
586 i = in_msg_buf->hif_call_rtn_msg.service_number;
587 result = service_HIF (in_msg_buf);
588 if (i == 1) /* EXIT */
589 goto exit;
590 if (result)
591 printf ("Warning: failure during HIF service %d\n", i);
592 break;
593 case CHANNEL0_ACK:
594 service_HIF (in_msg_buf);
595 break;
596 case CHANNEL1:
597 i = in_msg_buf->channel1_msg.length;
598 in_msg_buf->channel1_msg.data[i] = '\0';
599 printf ("%s", in_msg_buf->channel1_msg.data);
600 gdb_flush (gdb_stdout);
601 /* Send CHANNEL1_ACK message */
602 out_msg_buf->channel1_ack_msg.code = CHANNEL1_ACK;
603 out_msg_buf->channel1_ack_msg.length = 0;
604 result = msg_send_serial (out_msg_buf);
605 break;
606 case HALT:
607 goto halted;
608 default:
609 goto halted;
610 }
611 }
612 halted:
613 /* FIXME, these printfs should not be here. This is a source level
614 debugger, guys! */
615 if (in_msg_buf->halt_msg.trap_number == 0)
616 {
617 printf ("Am290*0 received vector number %d (break point)\n",
618 in_msg_buf->halt_msg.trap_number);
619 status->kind = TARGET_WAITKIND_STOPPED;
620 status->value.sig = TARGET_SIGNAL_TRAP;
621 }
622 else if (in_msg_buf->halt_msg.trap_number == 1)
623 {
624 printf ("Am290*0 received vector number %d\n",
625 in_msg_buf->halt_msg.trap_number);
626 status->kind = TARGET_WAITKIND_STOPPED;
627 status->value.sig = TARGET_SIGNAL_BUS;
628 }
629 else if (in_msg_buf->halt_msg.trap_number == 3
630 || in_msg_buf->halt_msg.trap_number == 4)
631 {
632 printf ("Am290*0 received vector number %d\n",
633 in_msg_buf->halt_msg.trap_number);
634 status->kind = TARGET_WAITKIND_STOPPED;
635 status->value.sig = TARGET_SIGNAL_FPE;
636 }
637 else if (in_msg_buf->halt_msg.trap_number == 5)
638 {
639 printf ("Am290*0 received vector number %d\n",
640 in_msg_buf->halt_msg.trap_number);
641 status->kind = TARGET_WAITKIND_STOPPED;
642 status->value.sig = TARGET_SIGNAL_ILL;
643 }
644 else if (in_msg_buf->halt_msg.trap_number >= 6
645 && in_msg_buf->halt_msg.trap_number <= 11)
646 {
647 printf ("Am290*0 received vector number %d\n",
648 in_msg_buf->halt_msg.trap_number);
649 status->kind = TARGET_WAITKIND_STOPPED;
650 status->value.sig = TARGET_SIGNAL_SEGV;
651 }
652 else if (in_msg_buf->halt_msg.trap_number == 12
653 || in_msg_buf->halt_msg.trap_number == 13)
654 {
655 printf ("Am290*0 received vector number %d\n",
656 in_msg_buf->halt_msg.trap_number);
657 status->kind = TARGET_WAITKIND_STOPPED;
658 status->value.sig = TARGET_SIGNAL_ILL;
659 }
660 else if (in_msg_buf->halt_msg.trap_number == 14)
661 {
662 printf ("Am290*0 received vector number %d\n",
663 in_msg_buf->halt_msg.trap_number);
664 status->kind = TARGET_WAITKIND_STOPPED;
665 status->value.sig = TARGET_SIGNAL_ALRM;
666 }
667 else if (in_msg_buf->halt_msg.trap_number == 15)
668 {
669 status->kind = TARGET_WAITKIND_STOPPED;
670 status->value.sig = TARGET_SIGNAL_TRAP;
671 }
672 else if (in_msg_buf->halt_msg.trap_number >= 16
673 && in_msg_buf->halt_msg.trap_number <= 21)
674 {
675 printf ("Am290*0 received vector number %d\n",
676 in_msg_buf->halt_msg.trap_number);
677 status->kind = TARGET_WAITKIND_STOPPED;
678 status->value.sig = TARGET_SIGNAL_INT;
679 }
680 else if (in_msg_buf->halt_msg.trap_number == 22)
681 {
682 printf ("Am290*0 received vector number %d\n",
683 in_msg_buf->halt_msg.trap_number);
684 status->kind = TARGET_WAITKIND_STOPPED;
685 status->value.sig = TARGET_SIGNAL_ILL;
686 } /* BREAK message was sent */
687 else if (in_msg_buf->halt_msg.trap_number == 75)
688 {
689 status->kind = TARGET_WAITKIND_STOPPED;
690 status->value.sig = TARGET_SIGNAL_TRAP;
691 }
692 else
693 exit:
694 {
695 status->kind = TARGET_WAITKIND_EXITED;
696 status->value.integer = 0;
697 }
698
699 timeout = old_timeout; /* Restore original timeout value */
700 immediate_quit = old_immediate_quit;
701 return 0;
702 }
703
704 /******************************************************* REMOTE_FETCH_REGISTERS
705 * Read a remote register 'regno'.
706 * If regno==-1 then read all the registers.
707 */
708 static void
709 mm_fetch_registers (int regno)
710 {
711 INT32 *data_p;
712
713 if (regno >= 0)
714 {
715 fetch_register (regno);
716 return;
717 }
718
719 /* Gr1/rsp */
720 out_msg_buf->read_req_msg.byte_count = 4 * 1;
721 out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
722 out_msg_buf->read_req_msg.address = 1;
723 msg_send_serial (out_msg_buf);
724 expect_msg (READ_ACK, in_msg_buf, 1);
725 data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
726 supply_register (GR1_REGNUM, data_p);
727
728 #if defined(GR64_REGNUM) /* Read gr64-127 */
729 /* Global Registers gr64-gr95 */
730 out_msg_buf->read_req_msg.code = READ_REQ;
731 out_msg_buf->read_req_msg.length = 4 * 3;
732 out_msg_buf->read_req_msg.byte_count = 4 * 32;
733 out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
734 out_msg_buf->read_req_msg.address = 64;
735 msg_send_serial (out_msg_buf);
736 expect_msg (READ_ACK, in_msg_buf, 1);
737 data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
738
739 for (regno = GR64_REGNUM; regno < GR64_REGNUM + 32; regno++)
740 {
741 supply_register (regno, data_p++);
742 }
743 #endif /* GR64_REGNUM */
744
745 /* Global Registers gr96-gr127 */
746 out_msg_buf->read_req_msg.code = READ_REQ;
747 out_msg_buf->read_req_msg.length = 4 * 3;
748 out_msg_buf->read_req_msg.byte_count = 4 * 32;
749 out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
750 out_msg_buf->read_req_msg.address = 96;
751 msg_send_serial (out_msg_buf);
752 expect_msg (READ_ACK, in_msg_buf, 1);
753 data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
754
755 for (regno = GR96_REGNUM; regno < GR96_REGNUM + 32; regno++)
756 {
757 supply_register (regno, data_p++);
758 }
759
760 /* Local Registers */
761 out_msg_buf->read_req_msg.byte_count = 4 * (128);
762 out_msg_buf->read_req_msg.memory_space = LOCAL_REG;
763 out_msg_buf->read_req_msg.address = 0;
764 msg_send_serial (out_msg_buf);
765 expect_msg (READ_ACK, in_msg_buf, 1);
766 data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
767
768 for (regno = LR0_REGNUM; regno < LR0_REGNUM + 128; regno++)
769 {
770 supply_register (regno, data_p++);
771 }
772
773 /* Protected Special Registers */
774 out_msg_buf->read_req_msg.byte_count = 4 * 15;
775 out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
776 out_msg_buf->read_req_msg.address = 0;
777 msg_send_serial (out_msg_buf);
778 expect_msg (READ_ACK, in_msg_buf, 1);
779 data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
780
781 for (regno = 0; regno <= 14; regno++)
782 {
783 supply_register (SR_REGNUM (regno), data_p++);
784 }
785 if (USE_SHADOW_PC)
786 { /* Let regno_to_srnum() handle the register number */
787 fetch_register (NPC_REGNUM);
788 fetch_register (PC_REGNUM);
789 fetch_register (PC2_REGNUM);
790 }
791
792 /* Unprotected Special Registers */
793 out_msg_buf->read_req_msg.byte_count = 4 * 8;
794 out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
795 out_msg_buf->read_req_msg.address = 128;
796 msg_send_serial (out_msg_buf);
797 expect_msg (READ_ACK, in_msg_buf, 1);
798 data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
799
800 for (regno = 128; regno <= 135; regno++)
801 {
802 supply_register (SR_REGNUM (regno), data_p++);
803 }
804
805 /* There doesn't seem to be any way to get these. */
806 {
807 int val = -1;
808 supply_register (FPE_REGNUM, &val);
809 supply_register (INTE_REGNUM, &val);
810 supply_register (FPS_REGNUM, &val);
811 supply_register (EXO_REGNUM, &val);
812 }
813 }
814
815
816 /****************************************************** REMOTE_STORE_REGISTERS
817 * Store register regno into the target.
818 * If regno==-1 then store all the registers.
819 * Result is 0 for success, -1 for failure.
820 */
821
822 static void
823 mm_store_registers (int regno)
824 {
825 int result;
826
827 if (regno >= 0)
828 {
829 store_register (regno);
830 return;
831 }
832
833 result = 0;
834
835 out_msg_buf->write_r_msg.code = WRITE_REQ;
836
837 /* Gr1/rsp */
838 out_msg_buf->write_r_msg.byte_count = 4 * 1;
839 out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
840 out_msg_buf->write_r_msg.memory_space = GLOBAL_REG;
841 out_msg_buf->write_r_msg.address = 1;
842 out_msg_buf->write_r_msg.data[0] = read_register (GR1_REGNUM);
843
844 msg_send_serial (out_msg_buf);
845 if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
846 {
847 result = -1;
848 }
849
850 #if defined(GR64_REGNUM)
851 /* Global registers gr64-gr95 */
852 out_msg_buf->write_r_msg.byte_count = 4 * (32);
853 out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
854 out_msg_buf->write_r_msg.address = 64;
855
856 for (regno = GR64_REGNUM; regno < GR64_REGNUM + 32; regno++)
857 {
858 out_msg_buf->write_r_msg.data[regno - GR64_REGNUM] = read_register (regno);
859 }
860 msg_send_serial (out_msg_buf);
861 if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
862 {
863 result = -1;
864 }
865 #endif /* GR64_REGNUM */
866
867 /* Global registers gr96-gr127 */
868 out_msg_buf->write_r_msg.byte_count = 4 * (32);
869 out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
870 out_msg_buf->write_r_msg.address = 96;
871 for (regno = GR96_REGNUM; regno < GR96_REGNUM + 32; regno++)
872 {
873 out_msg_buf->write_r_msg.data[regno - GR96_REGNUM] = read_register (regno);
874 }
875 msg_send_serial (out_msg_buf);
876 if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
877 {
878 result = -1;
879 }
880
881 /* Local Registers */
882 out_msg_buf->write_r_msg.memory_space = LOCAL_REG;
883 out_msg_buf->write_r_msg.byte_count = 4 * 128;
884 out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
885 out_msg_buf->write_r_msg.address = 0;
886
887 for (regno = LR0_REGNUM; regno < LR0_REGNUM + 128; regno++)
888 {
889 out_msg_buf->write_r_msg.data[regno - LR0_REGNUM] = read_register (regno);
890 }
891 msg_send_serial (out_msg_buf);
892 if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
893 {
894 result = -1;
895 }
896
897 /* Protected Special Registers */
898 /* VAB through TMR */
899 out_msg_buf->write_r_msg.memory_space = SPECIAL_REG;
900 out_msg_buf->write_r_msg.byte_count = 4 * 10;
901 out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
902 out_msg_buf->write_r_msg.address = 0;
903 for (regno = 0; regno <= 9; regno++) /* VAB through TMR */
904 out_msg_buf->write_r_msg.data[regno] = read_register (SR_REGNUM (regno));
905 msg_send_serial (out_msg_buf);
906 if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
907 {
908 result = -1;
909 }
910
911 /* PC0, PC1, PC2 possibly as shadow registers */
912 out_msg_buf->write_r_msg.byte_count = 4 * 3;
913 out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
914 for (regno = 10; regno <= 12; regno++) /* LRU and MMU */
915 out_msg_buf->write_r_msg.data[regno - 10] = read_register (SR_REGNUM (regno));
916 if (USE_SHADOW_PC)
917 out_msg_buf->write_r_msg.address = 20; /* SPC0 */
918 else
919 out_msg_buf->write_r_msg.address = 10; /* PC0 */
920 msg_send_serial (out_msg_buf);
921 if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
922 {
923 result = -1;
924 }
925
926 /* LRU and MMU */
927 out_msg_buf->write_r_msg.byte_count = 4 * 2;
928 out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
929 out_msg_buf->write_r_msg.address = 13;
930 for (regno = 13; regno <= 14; regno++) /* LRU and MMU */
931 out_msg_buf->write_r_msg.data[regno - 13] = read_register (SR_REGNUM (regno));
932 msg_send_serial (out_msg_buf);
933 if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
934 {
935 result = -1;
936 }
937
938 /* Unprotected Special Registers */
939 out_msg_buf->write_r_msg.byte_count = 4 * 8;
940 out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
941 out_msg_buf->write_r_msg.address = 128;
942 for (regno = 128; regno <= 135; regno++)
943 out_msg_buf->write_r_msg.data[regno - 128] = read_register (SR_REGNUM (regno));
944 msg_send_serial (out_msg_buf);
945 if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
946 {
947 result = -1;
948 }
949
950 registers_changed ();
951 }
952
953 /*************************************************** REMOTE_PREPARE_TO_STORE */
954 /* Get ready to modify the registers array. On machines which store
955 individual registers, this doesn't need to do anything. On machines
956 which store all the registers in one fell swoop, this makes sure
957 that registers contains all the registers from the program being
958 debugged. */
959
960 static void
961 mm_prepare_to_store (void)
962 {
963 /* Do nothing, since we can store individual regs */
964 }
965
966 /******************************************************* REMOTE_XFER_MEMORY */
967 static CORE_ADDR
968 translate_addr (CORE_ADDR addr)
969 {
970 #if defined(KERNEL_DEBUGGING)
971 /* Check for a virtual address in the kernel */
972 /* Assume physical address of ublock is in paddr_u register */
973 /* FIXME: doesn't work for user virtual addresses */
974 if (addr >= UVADDR)
975 {
976 /* PADDR_U register holds the physical address of the ublock */
977 CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
978 return (i + addr - (CORE_ADDR) UVADDR);
979 }
980 else
981 {
982 return (addr);
983 }
984 #else
985 return (addr);
986 #endif
987 }
988
989 /******************************************************* REMOTE_FILES_INFO */
990 static void
991 mm_files_info (void)
992 {
993 printf ("\tAttached to %s at %d baud and running program %s.\n",
994 dev_name, baudrate, prog_name);
995 }
996
997 /************************************************* REMOTE_INSERT_BREAKPOINT */
998 static int
999 mm_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
1000 {
1001 out_msg_buf->bkpt_set_msg.code = BKPT_SET;
1002 out_msg_buf->bkpt_set_msg.length = 4 * 4;
1003 out_msg_buf->bkpt_set_msg.memory_space = I_MEM;
1004 out_msg_buf->bkpt_set_msg.bkpt_addr = (ADDR32) addr;
1005 out_msg_buf->bkpt_set_msg.pass_count = 1;
1006 out_msg_buf->bkpt_set_msg.bkpt_type = -1; /* use illop for 29000 */
1007 msg_send_serial (out_msg_buf);
1008 if (expect_msg (BKPT_SET_ACK, in_msg_buf, 1))
1009 {
1010 return 0; /* Success */
1011 }
1012 else
1013 {
1014 return 1; /* Failure */
1015 }
1016 }
1017
1018 /************************************************* REMOTE_DELETE_BREAKPOINT */
1019 static int
1020 mm_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
1021 {
1022 out_msg_buf->bkpt_rm_msg.code = BKPT_RM;
1023 out_msg_buf->bkpt_rm_msg.length = 4 * 3;
1024 out_msg_buf->bkpt_rm_msg.memory_space = I_MEM;
1025 out_msg_buf->bkpt_rm_msg.bkpt_addr = (ADDR32) addr;
1026 msg_send_serial (out_msg_buf);
1027 if (expect_msg (BKPT_RM_ACK, in_msg_buf, 1))
1028 {
1029 return 0; /* Success */
1030 }
1031 else
1032 {
1033 return 1; /* Failure */
1034 }
1035 }
1036
1037
1038 /******************************************************* REMOTE_KILL */
1039 static void
1040 mm_kill (char *arg, int from_tty)
1041 {
1042 char buf[4];
1043
1044 #if defined(KERNEL_DEBUGGING)
1045 /* We don't ever kill the kernel */
1046 if (from_tty)
1047 {
1048 printf ("Kernel not killed, but left in current state.\n");
1049 printf ("Use detach to leave kernel running.\n");
1050 }
1051 #else
1052 out_msg_buf->break_msg.code = BREAK;
1053 out_msg_buf->bkpt_set_msg.length = 4 * 0;
1054 expect_msg (HALT, in_msg_buf, from_tty);
1055 if (from_tty)
1056 {
1057 printf ("Target has been stopped.");
1058 printf ("Would you like to do a hardware reset (y/n) [n] ");
1059 fgets (buf, 3, stdin);
1060 if (buf[0] == 'y')
1061 {
1062 out_msg_buf->reset_msg.code = RESET;
1063 out_msg_buf->bkpt_set_msg.length = 4 * 0;
1064 expect_msg (RESET_ACK, in_msg_buf, from_tty);
1065 printf ("Target has been reset.");
1066 }
1067 }
1068 pop_target ();
1069 #endif
1070 }
1071
1072
1073
1074 /***************************************************************************/
1075 /*
1076 * Load a program into the target.
1077 */
1078 static void
1079 mm_load (char *arg_string, int from_tty)
1080 {
1081 dont_repeat ();
1082
1083 #if defined(KERNEL_DEBUGGING)
1084 printf ("The kernel had better be loaded already! Loading not done.\n");
1085 #else
1086 if (arg_string == 0)
1087 error ("The load command takes a file name");
1088
1089 arg_string = tilde_expand (arg_string);
1090 make_cleanup (xfree, arg_string);
1091 QUIT;
1092 immediate_quit++;
1093 error ("File loading is not yet supported for MiniMon.");
1094 /* FIXME, code to load your file here... */
1095 /* You may need to do an init_target_mm() */
1096 /* init_target_mm(?,?,?,?,?,?,?,?); */
1097 immediate_quit--;
1098 /* symbol_file_add (arg_string, from_tty, text_addr, 0, 0); */
1099 #endif
1100
1101 }
1102
1103 /************************************************ REMOTE_WRITE_INFERIOR_MEMORY
1104 ** Copy LEN bytes of data from debugger memory at MYADDR
1105 to inferior's memory at MEMADDR. Returns number of bytes written. */
1106 static int
1107 mm_write_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
1108 {
1109 int i, nwritten;
1110
1111 out_msg_buf->write_req_msg.code = WRITE_REQ;
1112 out_msg_buf->write_req_msg.memory_space = mm_memory_space (memaddr);
1113
1114 nwritten = 0;
1115 while (nwritten < len)
1116 {
1117 int num_to_write = len - nwritten;
1118 if (num_to_write > MAXDATA)
1119 num_to_write = MAXDATA;
1120 for (i = 0; i < num_to_write; i++)
1121 out_msg_buf->write_req_msg.data[i] = myaddr[i + nwritten];
1122 out_msg_buf->write_req_msg.byte_count = num_to_write;
1123 out_msg_buf->write_req_msg.length = 3 * 4 + num_to_write;
1124 out_msg_buf->write_req_msg.address = memaddr + nwritten;
1125 msg_send_serial (out_msg_buf);
1126
1127 if (expect_msg (WRITE_ACK, in_msg_buf, 1))
1128 {
1129 nwritten += in_msg_buf->write_ack_msg.byte_count;
1130 }
1131 else
1132 {
1133 break;
1134 }
1135 }
1136 return (nwritten);
1137 }
1138
1139 /************************************************* REMOTE_READ_INFERIOR_MEMORY
1140 ** Read LEN bytes from inferior memory at MEMADDR. Put the result
1141 at debugger address MYADDR. Returns number of bytes read. */
1142 static int
1143 mm_read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
1144 {
1145 int i, nread;
1146
1147 out_msg_buf->read_req_msg.code = READ_REQ;
1148 out_msg_buf->read_req_msg.memory_space = mm_memory_space (memaddr);
1149
1150 nread = 0;
1151 while (nread < len)
1152 {
1153 int num_to_read = (len - nread);
1154 if (num_to_read > MAXDATA)
1155 num_to_read = MAXDATA;
1156 out_msg_buf->read_req_msg.byte_count = num_to_read;
1157 out_msg_buf->read_req_msg.length = 3 * 4 + num_to_read;
1158 out_msg_buf->read_req_msg.address = memaddr + nread;
1159 msg_send_serial (out_msg_buf);
1160
1161 if (expect_msg (READ_ACK, in_msg_buf, 1))
1162 {
1163 for (i = 0; i < in_msg_buf->read_ack_msg.byte_count; i++)
1164 myaddr[i + nread] = in_msg_buf->read_ack_msg.data[i];
1165 nread += in_msg_buf->read_ack_msg.byte_count;
1166 }
1167 else
1168 {
1169 break;
1170 }
1171 }
1172 return (nread);
1173 }
1174
1175 /* FIXME! Merge these two. */
1176 static int
1177 mm_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
1178 struct mem_attrib *attrib ATTRIBUTE_UNUSED,
1179 struct target_ops *target ATTRIBUTE_UNUSED)
1180 {
1181
1182 memaddr = translate_addr (memaddr);
1183
1184 if (write)
1185 return mm_write_inferior_memory (memaddr, myaddr, len);
1186 else
1187 return mm_read_inferior_memory (memaddr, myaddr, len);
1188 }
1189
1190
1191 /********************************************************** MSG_SEND_SERIAL
1192 ** This function is used to send a message over the
1193 ** serial line.
1194 **
1195 ** If the message is successfully sent, a zero is
1196 ** returned. If the message was not sendable, a -1
1197 ** is returned. This function blocks. That is, it
1198 ** does not return until the message is completely
1199 ** sent, or until an error is encountered.
1200 **
1201 */
1202
1203 int
1204 msg_send_serial (union msg_t *msg_ptr)
1205 {
1206 INT32 message_size;
1207 int byte_count;
1208 int result;
1209 char c;
1210
1211 /* Send message header */
1212 byte_count = 0;
1213 message_size = msg_ptr->generic_msg.length + (2 * sizeof (INT32));
1214 do
1215 {
1216 c = *((char *) msg_ptr + byte_count);
1217 result = write (mm_desc, &c, 1);
1218 if (result == 1)
1219 {
1220 byte_count = byte_count + 1;
1221 }
1222 }
1223 while ((byte_count < message_size));
1224
1225 return (0);
1226 } /* end msg_send_serial() */
1227
1228 /********************************************************** MSG_RECV_SERIAL
1229 ** This function is used to receive a message over a
1230 ** serial line.
1231 **
1232 ** If the message is waiting in the buffer, a zero is
1233 ** returned and the buffer pointed to by msg_ptr is filled
1234 ** in. If no message was available, a -1 is returned.
1235 ** If timeout==0, wait indefinetly for a character.
1236 **
1237 */
1238
1239 int
1240 msg_recv_serial (union msg_t *msg_ptr)
1241 {
1242 static INT32 length = 0;
1243 static INT32 byte_count = 0;
1244 int result;
1245 char c;
1246 if (msg_ptr == 0) /* re-sync request */
1247 {
1248 length = 0;
1249 byte_count = 0;
1250 #ifdef HAVE_TERMIO
1251 /* The timeout here is the prevailing timeout set with VTIME */
1252 ->"timeout==0 semantics not supported"
1253 read (mm_desc, in_buf, BUFER_SIZE);
1254 #else
1255 alarm (1);
1256 read (mm_desc, in_buf, BUFER_SIZE);
1257 alarm (0);
1258 #endif
1259 return (0);
1260 }
1261 /* Receive message */
1262 #ifdef HAVE_TERMIO
1263 /* Timeout==0, help support the mm_wait() routine */
1264 ->"timeout==0 semantics not supported (and its nice if they are)"
1265 result = read (mm_desc, &c, 1);
1266 #else
1267 alarm (timeout);
1268 result = read (mm_desc, &c, 1);
1269 alarm (0);
1270 #endif
1271 if (result < 0)
1272 {
1273 if (errno == EINTR)
1274 {
1275 error ("Timeout reading from remote system.");
1276 }
1277 else
1278 perror_with_name ("remote");
1279 }
1280 else if (result == 1)
1281 {
1282 *((char *) msg_ptr + byte_count) = c;
1283 byte_count = byte_count + 1;
1284 }
1285
1286 /* Message header received. Save message length. */
1287 if (byte_count == (2 * sizeof (INT32)))
1288 length = msg_ptr->generic_msg.length;
1289
1290 if (byte_count >= (length + (2 * sizeof (INT32))))
1291 {
1292 /* Message received */
1293 byte_count = 0;
1294 return (0);
1295 }
1296 else
1297 return (-1);
1298
1299 } /* end msg_recv_serial() */
1300
1301 /********************************************************************* KBD_RAW
1302 ** This function is used to put the keyboard in "raw"
1303 ** mode for BSD Unix. The original status is saved
1304 ** so that it may be restored later.
1305 */
1306 TERMINAL kbd_tbuf;
1307
1308 int
1309 kbd_raw (void)
1310 {
1311 int result;
1312 TERMINAL tbuf;
1313
1314 /* Get keyboard termio (to save to restore original modes) */
1315 #ifdef HAVE_TERMIO
1316 result = ioctl (0, TCGETA, &kbd_tbuf);
1317 #else
1318 result = ioctl (0, TIOCGETP, &kbd_tbuf);
1319 #endif
1320 if (result == -1)
1321 return (errno);
1322
1323 /* Get keyboard TERMINAL (for modification) */
1324 #ifdef HAVE_TERMIO
1325 result = ioctl (0, TCGETA, &tbuf);
1326 #else
1327 result = ioctl (0, TIOCGETP, &tbuf);
1328 #endif
1329 if (result == -1)
1330 return (errno);
1331
1332 /* Set up new parameters */
1333 #ifdef HAVE_TERMIO
1334 tbuf.c_iflag = tbuf.c_iflag &
1335 ~(INLCR | ICRNL | IUCLC | ISTRIP | IXON | BRKINT);
1336 tbuf.c_lflag = tbuf.c_lflag & ~(ICANON | ISIG | ECHO);
1337 tbuf.c_cc[4] = 0; /* MIN */
1338 tbuf.c_cc[5] = 0; /* TIME */
1339 #else
1340 /* FIXME: not sure if this is correct (matches HAVE_TERMIO). */
1341 tbuf.sg_flags |= RAW;
1342 tbuf.sg_flags |= ANYP;
1343 tbuf.sg_flags &= ~ECHO;
1344 #endif
1345
1346 /* Set keyboard termio to new mode (RAW) */
1347 #ifdef HAVE_TERMIO
1348 result = ioctl (0, TCSETAF, &tbuf);
1349 #else
1350 result = ioctl (0, TIOCSETP, &tbuf);
1351 #endif
1352 if (result == -1)
1353 return (errno);
1354
1355 return (0);
1356 } /* end kbd_raw() */
1357
1358
1359
1360 /***************************************************************** KBD_RESTORE
1361 ** This function is used to put the keyboard back in the
1362 ** mode it was in before kbk_raw was called. Note that
1363 ** kbk_raw() must have been called at least once before
1364 ** kbd_restore() is called.
1365 */
1366
1367 int
1368 kbd_restore (void)
1369 {
1370 int result;
1371
1372 /* Set keyboard termio to original mode */
1373 #ifdef HAVE_TERMIO
1374 result = ioctl (0, TCSETAF, &kbd_tbuf);
1375 #else
1376 result = ioctl (0, TIOCGETP, &kbd_tbuf);
1377 #endif
1378
1379 if (result == -1)
1380 return (errno);
1381
1382 return (0);
1383 } /* end kbd_cooked() */
1384
1385
1386 /*****************************************************************************/
1387 /* Fetch a single register indicatated by 'regno'.
1388 * Returns 0/-1 on success/failure.
1389 */
1390 static int
1391 fetch_register (int regno)
1392 {
1393 int result;
1394 out_msg_buf->read_req_msg.code = READ_REQ;
1395 out_msg_buf->read_req_msg.length = 4 * 3;
1396 out_msg_buf->read_req_msg.byte_count = 4;
1397
1398 if (regno == GR1_REGNUM)
1399 {
1400 out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
1401 out_msg_buf->read_req_msg.address = 1;
1402 }
1403 else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
1404 {
1405 out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
1406 out_msg_buf->read_req_msg.address = (regno - GR96_REGNUM) + 96;
1407 }
1408 #if defined(GR64_REGNUM)
1409 else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
1410 {
1411 out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
1412 out_msg_buf->read_req_msg.address = (regno - GR64_REGNUM) + 64;
1413 }
1414 #endif /* GR64_REGNUM */
1415 else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
1416 {
1417 out_msg_buf->read_req_msg.memory_space = LOCAL_REG;
1418 out_msg_buf->read_req_msg.address = (regno - LR0_REGNUM);
1419 }
1420 else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
1421 {
1422 int val = -1;
1423 supply_register (160 + (regno - FPE_REGNUM), &val);
1424 return 0; /* Pretend Success */
1425 }
1426 else
1427 {
1428 out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
1429 out_msg_buf->read_req_msg.address = regnum_to_srnum (regno);
1430 }
1431
1432 msg_send_serial (out_msg_buf);
1433
1434 if (expect_msg (READ_ACK, in_msg_buf, 1))
1435 {
1436 supply_register (regno, &(in_msg_buf->read_r_ack_msg.data[0]));
1437 result = 0;
1438 }
1439 else
1440 {
1441 result = -1;
1442 }
1443 return result;
1444 }
1445 /*****************************************************************************/
1446 /* Store a single register indicated by 'regno'.
1447 * Returns 0/-1 on success/failure.
1448 */
1449 static int
1450 store_register (int regno)
1451 {
1452 int result;
1453
1454 out_msg_buf->write_req_msg.code = WRITE_REQ;
1455 out_msg_buf->write_req_msg.length = 4 * 4;
1456 out_msg_buf->write_req_msg.byte_count = 4;
1457 out_msg_buf->write_r_msg.data[0] = read_register (regno);
1458
1459 if (regno == GR1_REGNUM)
1460 {
1461 out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
1462 out_msg_buf->write_req_msg.address = 1;
1463 /* Setting GR1 changes the numbers of all the locals, so invalidate the
1464 * register cache. Do this *after* calling read_register, because we want
1465 * read_register to return the value that write_register has just stuffed
1466 * into the registers array, not the value of the register fetched from
1467 * the inferior.
1468 */
1469 registers_changed ();
1470 }
1471 #if defined(GR64_REGNUM)
1472 else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
1473 {
1474 out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
1475 out_msg_buf->write_req_msg.address = (regno - GR64_REGNUM) + 64;
1476 }
1477 #endif /* GR64_REGNUM */
1478 else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
1479 {
1480 out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
1481 out_msg_buf->write_req_msg.address = (regno - GR96_REGNUM) + 96;
1482 }
1483 else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
1484 {
1485 out_msg_buf->write_req_msg.memory_space = LOCAL_REG;
1486 out_msg_buf->write_req_msg.address = (regno - LR0_REGNUM);
1487 }
1488 else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
1489 {
1490 return 0; /* Pretend Success */
1491 }
1492 else
1493 /* An unprotected or protected special register */
1494 {
1495 out_msg_buf->write_req_msg.memory_space = SPECIAL_REG;
1496 out_msg_buf->write_req_msg.address = regnum_to_srnum (regno);
1497 }
1498
1499 msg_send_serial (out_msg_buf);
1500
1501 if (expect_msg (WRITE_ACK, in_msg_buf, 1))
1502 {
1503 result = 0;
1504 }
1505 else
1506 {
1507 result = -1;
1508 }
1509 return result;
1510 }
1511 /****************************************************************************/
1512 /*
1513 * Convert a gdb special register number to a 29000 special register number.
1514 */
1515 static int
1516 regnum_to_srnum (int regno)
1517 {
1518 switch (regno)
1519 {
1520 case VAB_REGNUM:
1521 return (0);
1522 case OPS_REGNUM:
1523 return (1);
1524 case CPS_REGNUM:
1525 return (2);
1526 case CFG_REGNUM:
1527 return (3);
1528 case CHA_REGNUM:
1529 return (4);
1530 case CHD_REGNUM:
1531 return (5);
1532 case CHC_REGNUM:
1533 return (6);
1534 case RBP_REGNUM:
1535 return (7);
1536 case TMC_REGNUM:
1537 return (8);
1538 case TMR_REGNUM:
1539 return (9);
1540 case NPC_REGNUM:
1541 return (USE_SHADOW_PC ? (20) : (10));
1542 case PC_REGNUM:
1543 return (USE_SHADOW_PC ? (21) : (11));
1544 case PC2_REGNUM:
1545 return (USE_SHADOW_PC ? (22) : (12));
1546 case MMU_REGNUM:
1547 return (13);
1548 case LRU_REGNUM:
1549 return (14);
1550 case IPC_REGNUM:
1551 return (128);
1552 case IPA_REGNUM:
1553 return (129);
1554 case IPB_REGNUM:
1555 return (130);
1556 case Q_REGNUM:
1557 return (131);
1558 case ALU_REGNUM:
1559 return (132);
1560 case BP_REGNUM:
1561 return (133);
1562 case FC_REGNUM:
1563 return (134);
1564 case CR_REGNUM:
1565 return (135);
1566 case FPE_REGNUM:
1567 return (160);
1568 case INTE_REGNUM:
1569 return (161);
1570 case FPS_REGNUM:
1571 return (162);
1572 case EXO_REGNUM:
1573 return (164);
1574 default:
1575 return (255); /* Failure ? */
1576 }
1577 }
1578 /****************************************************************************/
1579 /*
1580 * Initialize the target debugger (minimon only).
1581 */
1582 static void
1583 init_target_mm (ADDR32 tstart, ADDR32 tend, ADDR32 dstart, ADDR32 dend,
1584 ADDR32 entry, INT32 ms_size, INT32 rs_size, ADDR32 arg_start)
1585 {
1586 out_msg_buf->init_msg.code = INIT;
1587 out_msg_buf->init_msg.length = sizeof (struct init_msg_t) - 2 * sizeof (INT32);
1588 out_msg_buf->init_msg.text_start = tstart;
1589 out_msg_buf->init_msg.text_end = tend;
1590 out_msg_buf->init_msg.data_start = dstart;
1591 out_msg_buf->init_msg.data_end = dend;
1592 out_msg_buf->init_msg.entry_point = entry;
1593 out_msg_buf->init_msg.mem_stack_size = ms_size;
1594 out_msg_buf->init_msg.reg_stack_size = rs_size;
1595 out_msg_buf->init_msg.arg_start = arg_start;
1596 msg_send_serial (out_msg_buf);
1597 expect_msg (INIT_ACK, in_msg_buf, 1);
1598 }
1599 /****************************************************************************/
1600 /*
1601 * Return a pointer to a string representing the given message code.
1602 * Not all messages are represented here, only the ones that we expect
1603 * to be called with.
1604 */
1605 static char *
1606 msg_str (INT32 code)
1607 {
1608 static char cbuf[32];
1609
1610 switch (code)
1611 {
1612 case BKPT_SET_ACK:
1613 sprintf (cbuf, "%s (%d)", "BKPT_SET_ACK", code);
1614 break;
1615 case BKPT_RM_ACK:
1616 sprintf (cbuf, "%s (%d)", "BKPT_RM_ACK", code);
1617 break;
1618 case INIT_ACK:
1619 sprintf (cbuf, "%s (%d)", "INIT_ACK", code);
1620 break;
1621 case READ_ACK:
1622 sprintf (cbuf, "%s (%d)", "READ_ACK", code);
1623 break;
1624 case WRITE_ACK:
1625 sprintf (cbuf, "%s (%d)", "WRITE_ACK", code);
1626 break;
1627 case ERROR:
1628 sprintf (cbuf, "%s (%d)", "ERROR", code);
1629 break;
1630 case HALT:
1631 sprintf (cbuf, "%s (%d)", "HALT", code);
1632 break;
1633 default:
1634 sprintf (cbuf, "UNKNOWN (%d)", code);
1635 break;
1636 }
1637 return (cbuf);
1638 }
1639 /****************************************************************************/
1640 /*
1641 * Selected (not all of them) error codes that we might get.
1642 */
1643 static char *
1644 error_msg_str (INT32 code)
1645 {
1646 static char cbuf[50];
1647
1648 switch (code)
1649 {
1650 case EMFAIL:
1651 return ("EMFAIL: unrecoverable error");
1652 case EMBADADDR:
1653 return ("EMBADADDR: Illegal address");
1654 case EMBADREG:
1655 return ("EMBADREG: Illegal register ");
1656 case EMACCESS:
1657 return ("EMACCESS: Could not access memory");
1658 case EMBADMSG:
1659 return ("EMBADMSG: Unknown message type");
1660 case EMMSG2BIG:
1661 return ("EMMSG2BIG: Message to large");
1662 case EMNOSEND:
1663 return ("EMNOSEND: Could not send message");
1664 case EMNORECV:
1665 return ("EMNORECV: Could not recv message");
1666 case EMRESET:
1667 return ("EMRESET: Could not RESET target");
1668 case EMCONFIG:
1669 return ("EMCONFIG: Could not get target CONFIG");
1670 case EMSTATUS:
1671 return ("EMSTATUS: Could not get target STATUS");
1672 case EMREAD:
1673 return ("EMREAD: Could not READ target memory");
1674 case EMWRITE:
1675 return ("EMWRITE: Could not WRITE target memory");
1676 case EMBKPTSET:
1677 return ("EMBKPTSET: Could not set breakpoint");
1678 case EMBKPTRM:
1679 return ("EMBKPTRM: Could not remove breakpoint");
1680 case EMBKPTSTAT:
1681 return ("EMBKPTSTAT: Could not get breakpoint status");
1682 case EMBKPTNONE:
1683 return ("EMBKPTNONE: All breakpoints in use");
1684 case EMBKPTUSED:
1685 return ("EMBKPTUSED: Breakpoints already in use");
1686 case EMINIT:
1687 return ("EMINIT: Could not init target memory");
1688 case EMGO:
1689 return ("EMGO: Could not start execution");
1690 case EMSTEP:
1691 return ("EMSTEP: Could not single step");
1692 case EMBREAK:
1693 return ("EMBREAK: Could not BREAK");
1694 case EMCOMMERR:
1695 return ("EMCOMMERR: Communication error");
1696 default:
1697 sprintf (cbuf, "error number %d", code);
1698 break;
1699 } /* end switch */
1700
1701 return (cbuf);
1702 }
1703 /****************************************************************************/
1704
1705 /* Receive a message, placing it in MSG_BUF, and expect it to be of
1706 type MSGCODE. If an error occurs, a non-zero FROM_TTY indicates
1707 that the message should be printed.
1708
1709 Return 0 for failure, 1 for success. */
1710
1711 static int
1712 expect_msg (INT32 msgcode, union msg_t *msg_buf, int from_tty)
1713 {
1714 int retries = 0;
1715 while (msg_recv_serial (msg_buf) && (retries++ < MAX_RETRIES));
1716 if (retries >= MAX_RETRIES)
1717 {
1718 printf ("Expected msg %s, ", msg_str (msgcode));
1719 printf ("no message received!\n");
1720 return (0); /* Failure */
1721 }
1722
1723 if (msg_buf->generic_msg.code != msgcode)
1724 {
1725 if (from_tty)
1726 {
1727 printf ("Expected msg %s, ", msg_str (msgcode));
1728 printf ("got msg %s\n", msg_str (msg_buf->generic_msg.code));
1729 if (msg_buf->generic_msg.code == ERROR)
1730 printf ("%s\n", error_msg_str (msg_buf->error_msg.error_code));
1731 }
1732 return (0); /* Failure */
1733 }
1734 return (1); /* Success */
1735 }
1736 /****************************************************************************/
1737 /*
1738 * Determine the MiniMon memory space qualifier based on the addr.
1739 * FIXME: Can't distinguis I_ROM/D_ROM.
1740 * FIXME: Doesn't know anything about I_CACHE/D_CACHE.
1741 */
1742 static int
1743 mm_memory_space (CORE_ADDR *addr)
1744 {
1745 ADDR32 tstart = target_config.I_mem_start;
1746 ADDR32 tend = tstart + target_config.I_mem_size;
1747 ADDR32 dstart = target_config.D_mem_start;
1748 ADDR32 dend = tstart + target_config.D_mem_size;
1749 ADDR32 rstart = target_config.ROM_start;
1750 ADDR32 rend = tstart + target_config.ROM_size;
1751
1752 if (((ADDR32) addr >= tstart) && ((ADDR32) addr < tend))
1753 {
1754 return I_MEM;
1755 }
1756 else if (((ADDR32) addr >= dstart) && ((ADDR32) addr < dend))
1757 {
1758 return D_MEM;
1759 }
1760 else if (((ADDR32) addr >= rstart) && ((ADDR32) addr < rend))
1761 {
1762 /* FIXME: how do we determine between D_ROM and I_ROM */
1763 return D_ROM;
1764 }
1765 else /* FIXME: what do me do now? */
1766 return D_MEM; /* Hmmm! */
1767 }
1768
1769 /****************************************************************************/
1770 /*
1771 * Define the target subroutine names
1772 */
1773 struct target_ops mm_ops;
1774
1775 static void
1776 init_mm_ops (void)
1777 {
1778 mm_ops.to_shortname = "minimon";
1779 mm_ops.to_longname = "Remote AMD/Minimon target";
1780 mm_ops.to_doc = "Remote debug an AMD 290*0 using the MiniMon dbg core on the target";
1781 mm_ops.to_open = mm_open;
1782 mm_ops.to_close = mm_close;
1783 mm_ops.to_attach = mm_attach;
1784 mm_ops.to_post_attach = NULL;
1785 mm_ops.to_require_attach = NULL;
1786 mm_ops.to_detach = mm_detach;
1787 mm_ops.to_require_detach = NULL;
1788 mm_ops.to_resume = mm_resume;
1789 mm_ops.to_wait = mm_wait;
1790 mm_ops.to_post_wait = NULL;
1791 mm_ops.to_fetch_registers = mm_fetch_registers;
1792 mm_ops.to_store_registers = mm_store_registers;
1793 mm_ops.to_prepare_to_store = mm_prepare_to_store;
1794 mm_ops.to_xfer_memory = mm_xfer_inferior_memory;
1795 mm_ops.to_files_info = mm_files_info;
1796 mm_ops.to_insert_breakpoint = mm_insert_breakpoint;
1797 mm_ops.to_remove_breakpoint = mm_remove_breakpoint;
1798 mm_ops.to_terminal_init = 0;
1799 mm_ops.to_terminal_inferior = 0;
1800 mm_ops.to_terminal_ours_for_output = 0;
1801 mm_ops.to_terminal_ours = 0;
1802 mm_ops.to_terminal_info = 0;
1803 mm_ops.to_kill = mm_kill;
1804 mm_ops.to_load = mm_load;
1805 mm_ops.to_lookup_symbol = 0;
1806 mm_ops.to_create_inferior = mm_create_inferior;
1807 mm_ops.to_post_startup_inferior = NULL;
1808 mm_ops.to_acknowledge_created_inferior = NULL;
1809 mm_ops.to_clone_and_follow_inferior = NULL;
1810 mm_ops.to_post_follow_inferior_by_clone = NULL;
1811 mm_ops.to_insert_fork_catchpoint = NULL;
1812 mm_ops.to_remove_fork_catchpoint = NULL;
1813 mm_ops.to_insert_vfork_catchpoint = NULL;
1814 mm_ops.to_remove_vfork_catchpoint = NULL;
1815 mm_ops.to_has_forked = NULL;
1816 mm_ops.to_has_vforked = NULL;
1817 mm_ops.to_can_follow_vfork_prior_to_exec = NULL;
1818 mm_ops.to_post_follow_vfork = NULL;
1819 mm_ops.to_insert_exec_catchpoint = NULL;
1820 mm_ops.to_remove_exec_catchpoint = NULL;
1821 mm_ops.to_has_execd = NULL;
1822 mm_ops.to_reported_exec_events_per_exec_call = NULL;
1823 mm_ops.to_has_exited = NULL;
1824 mm_ops.to_mourn_inferior = mm_mourn;
1825 mm_ops.to_can_run = 0;
1826 mm_ops.to_notice_signals = 0;
1827 mm_ops.to_thread_alive = 0;
1828 mm_ops.to_stop = 0;
1829 mm_ops.to_pid_to_exec_file = NULL;
1830 mm_ops.to_core_file_to_sym_file = NULL;
1831 mm_ops.to_stratum = process_stratum;
1832 mm_ops.DONT_USE = 0;
1833 mm_ops.to_has_all_memory = 1;
1834 mm_ops.to_has_memory = 1;
1835 mm_ops.to_has_stack = 1;
1836 mm_ops.to_has_registers = 1;
1837 mm_ops.to_has_execution = 1;
1838 mm_ops.to_sections = 0;
1839 mm_ops.to_sections_end = 0;
1840 mm_ops.to_magic = OPS_MAGIC;
1841 };
1842
1843 void
1844 _initialize_remote_mm (void)
1845 {
1846 init_mm_ops ();
1847 add_target (&mm_ops);
1848 }
1849
1850 #ifdef NO_HIF_SUPPORT
1851 service_HIF (union msg_t *msg)
1852 {
1853 return (0); /* Emulate a failure */
1854 }
1855 #endif