1 /* Remote debugging interface for Am290*0 running MiniMON monitor, for GDB.
2 Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
3 Originally written by Daniel Mann at AMD.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* This is like remote.c but ecpects MiniMON to be running on the Am29000
24 - David Wood (wood@lab.ultra.nyu.edu) at New York University adapted this
25 file to gdb 3.95. I was unable to get this working on sun3os4
26 with termio, only with sgtty. Because we are only attempting to
27 use this module to debug our kernel, which is already loaded when
28 gdb is started up, I did not code up the file downloading facilities.
29 As a result this module has only the stubs to download files.
30 You should get tagged at compile time if you need to make any
41 #include "gdb_string.h"
46 /* Offset of member MEMBER in a struct of type TYPE. */
47 #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
49 #define DRAIN_INPUT() (msg_recv_serial((union msg_t*)0))
51 extern int stop_soon_quietly
; /* for wait_for_inferior */
53 static void mm_resume ();
54 static void mm_fetch_registers ();
55 static int fetch_register ();
56 static void mm_store_registers ();
57 static int store_register ();
58 static int regnum_to_srnum ();
59 static void mm_close ();
60 static char *msg_str ();
61 static char *error_msg_str ();
62 static int expect_msg ();
63 static void init_target_mm ();
64 static int mm_memory_space ();
66 #define FREEZE_MODE (read_register(CPS_REGNUM) && 0x400)
67 #define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
69 /* FIXME: Replace with `set remotedebug'. */
70 #define LLOG_FILE "minimon.log"
71 #if defined (LOG_FILE)
76 * Size of message buffers. I couldn't get memory reads to work when
77 * the byte_count was larger than 512 (it may be a baud rate problem).
79 #define BUFER_SIZE 512
81 * Size of data area in message buffer on the TARGET (remote system).
83 #define MAXDATA_T (target_config.max_msg_size - \
84 offsetof(struct write_r_msg_t,data[0]))
86 * Size of data area in message buffer on the HOST (gdb).
88 #define MAXDATA_H (BUFER_SIZE - offsetof(struct write_r_msg_t,data[0]))
90 * Defined as the minimum size of data areas of the two message buffers
92 #define MAXDATA (MAXDATA_H < MAXDATA_T ? MAXDATA_H : MAXDATA_T)
94 static char out_buf
[BUFER_SIZE
];
95 static char in_buf
[BUFER_SIZE
];
97 int msg_recv_serial ();
98 int msg_send_serial ();
100 #define MAX_RETRIES 5000
101 extern struct target_ops mm_ops
; /* Forward declaration */
102 struct config_msg_t target_config
; /* HIF needs this */
103 union msg_t
*out_msg_buf
= (union msg_t
*) out_buf
;
104 union msg_t
*in_msg_buf
= (union msg_t
*) in_buf
;
106 static int timeout
= 5;
108 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
109 mm_open knows that we don't have a file open when the program
113 /* stream which is fdopen'd from mm_desc. Only valid when
117 /* Called when SIGALRM signal sent due to alarm() timeout. */
126 volatile int n_alarms
;
133 printf ("mm_timer called\n");
137 #endif /* HAVE_TERMIO */
139 /* malloc'd name of the program on the remote system. */
140 static char *prog_name
= NULL
;
143 /* Number of SIGTRAPs we need to simulate. That is, the next
144 NEED_ARTIFICIAL_TRAP calls to mm_wait should just return
145 SIGTRAP without actually waiting for anything. */
147 /**************************************************** REMOTE_CREATE_INFERIOR */
148 /* This is called not only when we first attach, but also when the
149 user types "run" after having attached. */
151 mm_create_inferior (char *execfile
, char *args
, char **env
)
153 #define MAX_TOKENS 25
154 #define BUFFER_SIZE 256
157 char *token
[MAX_TOKENS
];
158 char cmd_line
[BUFFER_SIZE
];
161 error ("Can't pass arguments to remote mm process (yet).");
163 if (execfile
== 0 /* || exec_bfd == 0 */ )
164 error ("No executable file specified");
168 printf ("Minimon not open yet.\n");
172 /* On ultra3 (NYU) we assume the kernel is already running so there is
174 FIXME: Fixed required here -> load your program, possibly with mm_load().
176 printf_filtered ("\n\
177 Assuming you are at NYU debuging a kernel, i.e., no need to download.\n\n");
179 /* We will get a task spawn event immediately. */
180 init_wait_for_inferior ();
181 clear_proceed_status ();
182 stop_soon_quietly
= 1;
183 proceed (-1, TARGET_SIGNAL_DEFAULT
, 0);
186 /**************************************************** REMOTE_MOURN_INFERIOR */
190 pop_target (); /* Pop back to no-child state */
191 generic_mourn_inferior ();
194 /********************************************************************** damn_b
196 /* Translate baud rates from integers to damn B_codes. Unix should
197 have outgrown this crap years ago, but even POSIX wouldn't buck it. */
287 for (i
= 0; baudtab
[i
].rate
!= -1; i
++)
288 if (rate
== baudtab
[i
].rate
)
289 return baudtab
[i
].damn_b
;
290 return B38400
; /* Random */
294 /***************************************************************** REMOTE_OPEN
295 ** Open a connection to remote minimon.
296 NAME is the filename used for communication, then a space,
298 'target adapt /dev/ttya 9600 [prognam]' for example.
301 static char *dev_name
;
304 mm_open (char *name
, int from_tty
)
310 /* Find the first whitespace character, it separates dev_name from
313 p
&& *p
&& !isspace (*p
); p
++)
315 if (p
== 0 || *p
== '\0')
317 error ("Usage : <command> <serial-device> <baud-rate> [progname]");
318 dev_name
= (char *) xmalloc (p
- name
+ 1);
319 strncpy (dev_name
, name
, p
- name
);
320 dev_name
[p
- name
] = '\0';
322 /* Skip over the whitespace after dev_name */
323 for (; isspace (*p
); p
++)
326 if (1 != sscanf (p
, "%d ", &baudrate
))
329 /* Skip the number and then the spaces */
330 for (; isdigit (*p
); p
++)
332 for (; isspace (*p
); p
++)
335 if (prog_name
!= NULL
)
337 prog_name
= savestring (p
, strlen (p
));
343 mm_desc
= open (dev_name
, O_RDWR
);
345 perror_with_name (dev_name
);
346 ioctl (mm_desc
, TIOCGETP
, &sg
);
348 sg
.c_cc
[VMIN
] = 0; /* read with timeout. */
349 sg
.c_cc
[VTIME
] = timeout
* 10;
350 sg
.c_lflag
&= ~(ICANON
| ECHO
);
351 sg
.c_cflag
= (sg
.c_cflag
& ~CBAUD
) | damn_b (baudrate
);
353 sg
.sg_ispeed
= damn_b (baudrate
);
354 sg
.sg_ospeed
= damn_b (baudrate
);
357 sg
.sg_flags
&= ~ECHO
;
361 ioctl (mm_desc
, TIOCSETP
, &sg
);
362 mm_stream
= fdopen (mm_desc
, "r+");
364 push_target (&mm_ops
);
367 #ifndef NO_SIGINTERRUPT
368 /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
370 if (siginterrupt (SIGALRM
, 1) != 0)
371 perror ("mm_open: error in siginterrupt");
374 /* Set up read timeout timer. */
375 if ((void (*)) signal (SIGALRM
, mm_timer
) == (void (*)) -1)
376 perror ("mm_open: error in signal");
379 #if defined (LOG_FILE)
380 log_file
= fopen (LOG_FILE
, "w");
381 if (log_file
== NULL
)
382 perror_with_name (LOG_FILE
);
385 ** Initialize target configuration structure (global)
388 out_msg_buf
->config_req_msg
.code
= CONFIG_REQ
;
389 out_msg_buf
->config_req_msg
.length
= 4 * 0;
390 msg_send_serial (out_msg_buf
); /* send config request message */
392 expect_msg (CONFIG
, in_msg_buf
, 1);
394 a29k_get_processor_type ();
396 /* Print out some stuff, letting the user now what's going on */
397 printf_filtered ("Connected to MiniMon via %s.\n", dev_name
);
398 /* FIXME: can this restriction be removed? */
399 printf_filtered ("Remote debugging using virtual addresses works only\n");
400 printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n")
402 if (processor_type
!= a29k_freeze_mode
)
404 fprintf_filtered (gdb_stderr
,
405 "Freeze-mode debugging not available, and can only be done on an A29050.\n");
408 target_config
.code
= CONFIG
;
409 target_config
.length
= 0;
410 target_config
.processor_id
= in_msg_buf
->config_msg
.processor_id
;
411 target_config
.version
= in_msg_buf
->config_msg
.version
;
412 target_config
.I_mem_start
= in_msg_buf
->config_msg
.I_mem_start
;
413 target_config
.I_mem_size
= in_msg_buf
->config_msg
.I_mem_size
;
414 target_config
.D_mem_start
= in_msg_buf
->config_msg
.D_mem_start
;
415 target_config
.D_mem_size
= in_msg_buf
->config_msg
.D_mem_size
;
416 target_config
.ROM_start
= in_msg_buf
->config_msg
.ROM_start
;
417 target_config
.ROM_size
= in_msg_buf
->config_msg
.ROM_size
;
418 target_config
.max_msg_size
= in_msg_buf
->config_msg
.max_msg_size
;
419 target_config
.max_bkpts
= in_msg_buf
->config_msg
.max_bkpts
;
420 target_config
.coprocessor
= in_msg_buf
->config_msg
.coprocessor
;
421 target_config
.reserved
= in_msg_buf
->config_msg
.reserved
;
424 printf ("Connected to MiniMON :\n");
425 printf (" Debugcore version %d.%d\n",
426 0x0f & (target_config
.version
>> 4),
427 0x0f & (target_config
.version
));
428 printf (" Configuration version %d.%d\n",
429 0x0f & (target_config
.version
>> 12),
430 0x0f & (target_config
.version
>> 8));
431 printf (" Message system version %d.%d\n",
432 0x0f & (target_config
.version
>> 20),
433 0x0f & (target_config
.version
>> 16));
434 printf (" Communication driver version %d.%d\n",
435 0x0f & (target_config
.version
>> 28),
436 0x0f & (target_config
.version
>> 24));
439 /* Leave the target running...
440 * The above message stopped the target in the dbg core (MiniMon),
441 * so restart the target out of MiniMon,
443 out_msg_buf
->go_msg
.code
= GO
;
444 out_msg_buf
->go_msg
.length
= 0;
445 msg_send_serial (out_msg_buf
);
446 /* No message to expect after a GO */
449 /**************************************************************** REMOTE_CLOSE
450 ** Close the open connection to the minimon debugger.
451 Use this when you want to detach and do something else
454 mm_close ( /*FIXME: how is quitting used */
458 error ("Can't close remote connection: not debugging remotely.");
460 /* We should never get here if there isn't something valid in
461 mm_desc and mm_stream.
463 Due to a bug in Unix, fclose closes not only the stdio stream,
464 but also the file descriptor. So we don't actually close
468 /* close (mm_desc); */
470 /* Do not try to close mm_desc again, later in the program. */
474 #if defined (LOG_FILE)
475 if (ferror (log_file
))
476 printf ("Error writing log file.\n");
477 if (fclose (log_file
) != 0)
478 printf ("Error closing log file.\n");
481 printf ("Ending remote debugging\n");
484 /************************************************************* REMOTE_ATACH */
485 /* Attach to a program that is already loaded and running
486 * Upon exiting the process's execution is stopped.
489 mm_attach (char *args
, int from_tty
)
493 error ("MiniMon not opened yet, use the 'target minimon' command.\n");
496 printf ("Attaching to remote program %s...\n", prog_name
);
498 /* Make sure the target is currently running, it is supposed to be. */
499 /* FIXME: is it ok to send MiniMon a BREAK if it is already stopped in
500 * the dbg core. If so, we don't need to send this GO.
502 out_msg_buf
->go_msg
.code
= GO
;
503 out_msg_buf
->go_msg
.length
= 0;
504 msg_send_serial (out_msg_buf
);
505 sleep (2); /* At the worst it will stop, receive a message, continue */
507 /* Send the mm a break. */
508 out_msg_buf
->break_msg
.code
= BREAK
;
509 out_msg_buf
->break_msg
.length
= 0;
510 msg_send_serial (out_msg_buf
);
512 /********************************************************** REMOTE_DETACH */
513 /* Terminate the open connection to the remote debugger.
514 Use this when you want to detach and do something else
515 with your gdb. Leave remote process running (with no breakpoints set). */
517 mm_detach (char *args
, int from_tty
)
519 remove_breakpoints (); /* Just in case there were any left in */
520 out_msg_buf
->go_msg
.code
= GO
;
521 out_msg_buf
->go_msg
.length
= 0;
522 msg_send_serial (out_msg_buf
);
523 pop_target (); /* calls mm_close to do the real work */
527 /*************************************************************** REMOTE_RESUME
528 ** Tell the remote machine to resume. */
531 mm_resume (int pid
, int step
, enum target_signal sig
)
533 if (sig
!= TARGET_SIGNAL_0
)
534 warning ("Can't send signals to a remote MiniMon system.");
538 out_msg_buf
->step_msg
.code
= STEP
;
539 out_msg_buf
->step_msg
.length
= 1 * 4;
540 out_msg_buf
->step_msg
.count
= 1; /* step 1 instruction */
541 msg_send_serial (out_msg_buf
);
545 out_msg_buf
->go_msg
.code
= GO
;
546 out_msg_buf
->go_msg
.length
= 0;
547 msg_send_serial (out_msg_buf
);
551 /***************************************************************** REMOTE_WAIT
552 ** Wait until the remote machine stops, then return,
553 storing status in STATUS just as `wait' would. */
556 mm_wait (struct target_waitstatus
*status
)
559 int old_timeout
= timeout
;
560 int old_immediate_quit
= immediate_quit
;
562 status
->kind
= TARGET_WAITKIND_EXITED
;
563 status
->value
.integer
= 0;
565 /* wait for message to arrive. It should be:
566 - A HIF service request.
567 - A HIF exit service request.
569 - A CHANNEL1 request.
570 - a debugcore HALT message.
571 HIF services must be responded too, and while-looping continued.
572 If the target stops executing, mm_wait() should return.
574 timeout
= 0; /* Wait indefinetly for a message */
575 immediate_quit
= 1; /* Helps ability to QUIT */
578 while (msg_recv_serial (in_msg_buf
))
580 QUIT
; /* Let user quit if they want */
582 switch (in_msg_buf
->halt_msg
.code
)
585 i
= in_msg_buf
->hif_call_rtn_msg
.service_number
;
586 result
= service_HIF (in_msg_buf
);
587 if (i
== 1) /* EXIT */
590 printf ("Warning: failure during HIF service %d\n", i
);
593 service_HIF (in_msg_buf
);
596 i
= in_msg_buf
->channel1_msg
.length
;
597 in_msg_buf
->channel1_msg
.data
[i
] = '\0';
598 printf ("%s", in_msg_buf
->channel1_msg
.data
);
599 gdb_flush (gdb_stdout
);
600 /* Send CHANNEL1_ACK message */
601 out_msg_buf
->channel1_ack_msg
.code
= CHANNEL1_ACK
;
602 out_msg_buf
->channel1_ack_msg
.length
= 0;
603 result
= msg_send_serial (out_msg_buf
);
612 /* FIXME, these printfs should not be here. This is a source level
614 if (in_msg_buf
->halt_msg
.trap_number
== 0)
616 printf ("Am290*0 received vector number %d (break point)\n",
617 in_msg_buf
->halt_msg
.trap_number
);
618 status
->kind
= TARGET_WAITKIND_STOPPED
;
619 status
->value
.sig
= TARGET_SIGNAL_TRAP
;
621 else if (in_msg_buf
->halt_msg
.trap_number
== 1)
623 printf ("Am290*0 received vector number %d\n",
624 in_msg_buf
->halt_msg
.trap_number
);
625 status
->kind
= TARGET_WAITKIND_STOPPED
;
626 status
->value
.sig
= TARGET_SIGNAL_BUS
;
628 else if (in_msg_buf
->halt_msg
.trap_number
== 3
629 || in_msg_buf
->halt_msg
.trap_number
== 4)
631 printf ("Am290*0 received vector number %d\n",
632 in_msg_buf
->halt_msg
.trap_number
);
633 status
->kind
= TARGET_WAITKIND_STOPPED
;
634 status
->value
.sig
= TARGET_SIGNAL_FPE
;
636 else if (in_msg_buf
->halt_msg
.trap_number
== 5)
638 printf ("Am290*0 received vector number %d\n",
639 in_msg_buf
->halt_msg
.trap_number
);
640 status
->kind
= TARGET_WAITKIND_STOPPED
;
641 status
->value
.sig
= TARGET_SIGNAL_ILL
;
643 else if (in_msg_buf
->halt_msg
.trap_number
>= 6
644 && in_msg_buf
->halt_msg
.trap_number
<= 11)
646 printf ("Am290*0 received vector number %d\n",
647 in_msg_buf
->halt_msg
.trap_number
);
648 status
->kind
= TARGET_WAITKIND_STOPPED
;
649 status
->value
.sig
= TARGET_SIGNAL_SEGV
;
651 else if (in_msg_buf
->halt_msg
.trap_number
== 12
652 || in_msg_buf
->halt_msg
.trap_number
== 13)
654 printf ("Am290*0 received vector number %d\n",
655 in_msg_buf
->halt_msg
.trap_number
);
656 status
->kind
= TARGET_WAITKIND_STOPPED
;
657 status
->value
.sig
= TARGET_SIGNAL_ILL
;
659 else if (in_msg_buf
->halt_msg
.trap_number
== 14)
661 printf ("Am290*0 received vector number %d\n",
662 in_msg_buf
->halt_msg
.trap_number
);
663 status
->kind
= TARGET_WAITKIND_STOPPED
;
664 status
->value
.sig
= TARGET_SIGNAL_ALRM
;
666 else if (in_msg_buf
->halt_msg
.trap_number
== 15)
668 status
->kind
= TARGET_WAITKIND_STOPPED
;
669 status
->value
.sig
= TARGET_SIGNAL_TRAP
;
671 else if (in_msg_buf
->halt_msg
.trap_number
>= 16
672 && in_msg_buf
->halt_msg
.trap_number
<= 21)
674 printf ("Am290*0 received vector number %d\n",
675 in_msg_buf
->halt_msg
.trap_number
);
676 status
->kind
= TARGET_WAITKIND_STOPPED
;
677 status
->value
.sig
= TARGET_SIGNAL_INT
;
679 else if (in_msg_buf
->halt_msg
.trap_number
== 22)
681 printf ("Am290*0 received vector number %d\n",
682 in_msg_buf
->halt_msg
.trap_number
);
683 status
->kind
= TARGET_WAITKIND_STOPPED
;
684 status
->value
.sig
= TARGET_SIGNAL_ILL
;
685 } /* BREAK message was sent */
686 else if (in_msg_buf
->halt_msg
.trap_number
== 75)
688 status
->kind
= TARGET_WAITKIND_STOPPED
;
689 status
->value
.sig
= TARGET_SIGNAL_TRAP
;
694 status
->kind
= TARGET_WAITKIND_EXITED
;
695 status
->value
.integer
= 0;
698 timeout
= old_timeout
; /* Restore original timeout value */
699 immediate_quit
= old_immediate_quit
;
703 /******************************************************* REMOTE_FETCH_REGISTERS
704 * Read a remote register 'regno'.
705 * If regno==-1 then read all the registers.
708 mm_fetch_registers (int regno
)
714 fetch_register (regno
);
719 out_msg_buf
->read_req_msg
.byte_count
= 4 * 1;
720 out_msg_buf
->read_req_msg
.memory_space
= GLOBAL_REG
;
721 out_msg_buf
->read_req_msg
.address
= 1;
722 msg_send_serial (out_msg_buf
);
723 expect_msg (READ_ACK
, in_msg_buf
, 1);
724 data_p
= &(in_msg_buf
->read_r_ack_msg
.data
[0]);
725 supply_register (GR1_REGNUM
, data_p
);
727 #if defined(GR64_REGNUM) /* Read gr64-127 */
728 /* Global Registers gr64-gr95 */
729 out_msg_buf
->read_req_msg
.code
= READ_REQ
;
730 out_msg_buf
->read_req_msg
.length
= 4 * 3;
731 out_msg_buf
->read_req_msg
.byte_count
= 4 * 32;
732 out_msg_buf
->read_req_msg
.memory_space
= GLOBAL_REG
;
733 out_msg_buf
->read_req_msg
.address
= 64;
734 msg_send_serial (out_msg_buf
);
735 expect_msg (READ_ACK
, in_msg_buf
, 1);
736 data_p
= &(in_msg_buf
->read_r_ack_msg
.data
[0]);
738 for (regno
= GR64_REGNUM
; regno
< GR64_REGNUM
+ 32; regno
++)
740 supply_register (regno
, data_p
++);
742 #endif /* GR64_REGNUM */
744 /* Global Registers gr96-gr127 */
745 out_msg_buf
->read_req_msg
.code
= READ_REQ
;
746 out_msg_buf
->read_req_msg
.length
= 4 * 3;
747 out_msg_buf
->read_req_msg
.byte_count
= 4 * 32;
748 out_msg_buf
->read_req_msg
.memory_space
= GLOBAL_REG
;
749 out_msg_buf
->read_req_msg
.address
= 96;
750 msg_send_serial (out_msg_buf
);
751 expect_msg (READ_ACK
, in_msg_buf
, 1);
752 data_p
= &(in_msg_buf
->read_r_ack_msg
.data
[0]);
754 for (regno
= GR96_REGNUM
; regno
< GR96_REGNUM
+ 32; regno
++)
756 supply_register (regno
, data_p
++);
759 /* Local Registers */
760 out_msg_buf
->read_req_msg
.byte_count
= 4 * (128);
761 out_msg_buf
->read_req_msg
.memory_space
= LOCAL_REG
;
762 out_msg_buf
->read_req_msg
.address
= 0;
763 msg_send_serial (out_msg_buf
);
764 expect_msg (READ_ACK
, in_msg_buf
, 1);
765 data_p
= &(in_msg_buf
->read_r_ack_msg
.data
[0]);
767 for (regno
= LR0_REGNUM
; regno
< LR0_REGNUM
+ 128; regno
++)
769 supply_register (regno
, data_p
++);
772 /* Protected Special Registers */
773 out_msg_buf
->read_req_msg
.byte_count
= 4 * 15;
774 out_msg_buf
->read_req_msg
.memory_space
= SPECIAL_REG
;
775 out_msg_buf
->read_req_msg
.address
= 0;
776 msg_send_serial (out_msg_buf
);
777 expect_msg (READ_ACK
, in_msg_buf
, 1);
778 data_p
= &(in_msg_buf
->read_r_ack_msg
.data
[0]);
780 for (regno
= 0; regno
<= 14; regno
++)
782 supply_register (SR_REGNUM (regno
), data_p
++);
785 { /* Let regno_to_srnum() handle the register number */
786 fetch_register (NPC_REGNUM
);
787 fetch_register (PC_REGNUM
);
788 fetch_register (PC2_REGNUM
);
791 /* Unprotected Special Registers */
792 out_msg_buf
->read_req_msg
.byte_count
= 4 * 8;
793 out_msg_buf
->read_req_msg
.memory_space
= SPECIAL_REG
;
794 out_msg_buf
->read_req_msg
.address
= 128;
795 msg_send_serial (out_msg_buf
);
796 expect_msg (READ_ACK
, in_msg_buf
, 1);
797 data_p
= &(in_msg_buf
->read_r_ack_msg
.data
[0]);
799 for (regno
= 128; regno
<= 135; regno
++)
801 supply_register (SR_REGNUM (regno
), data_p
++);
804 /* There doesn't seem to be any way to get these. */
807 supply_register (FPE_REGNUM
, &val
);
808 supply_register (INTE_REGNUM
, &val
);
809 supply_register (FPS_REGNUM
, &val
);
810 supply_register (EXO_REGNUM
, &val
);
815 /****************************************************** REMOTE_STORE_REGISTERS
816 * Store register regno into the target.
817 * If regno==-1 then store all the registers.
818 * Result is 0 for success, -1 for failure.
822 mm_store_registers (int regno
)
828 store_register (regno
);
834 out_msg_buf
->write_r_msg
.code
= WRITE_REQ
;
837 out_msg_buf
->write_r_msg
.byte_count
= 4 * 1;
838 out_msg_buf
->write_r_msg
.length
= 3 * 4 + out_msg_buf
->write_r_msg
.byte_count
;
839 out_msg_buf
->write_r_msg
.memory_space
= GLOBAL_REG
;
840 out_msg_buf
->write_r_msg
.address
= 1;
841 out_msg_buf
->write_r_msg
.data
[0] = read_register (GR1_REGNUM
);
843 msg_send_serial (out_msg_buf
);
844 if (!expect_msg (WRITE_ACK
, in_msg_buf
, 1))
849 #if defined(GR64_REGNUM)
850 /* Global registers gr64-gr95 */
851 out_msg_buf
->write_r_msg
.byte_count
= 4 * (32);
852 out_msg_buf
->write_r_msg
.length
= 3 * 4 + out_msg_buf
->write_r_msg
.byte_count
;
853 out_msg_buf
->write_r_msg
.address
= 64;
855 for (regno
= GR64_REGNUM
; regno
< GR64_REGNUM
+ 32; regno
++)
857 out_msg_buf
->write_r_msg
.data
[regno
- GR64_REGNUM
] = read_register (regno
);
859 msg_send_serial (out_msg_buf
);
860 if (!expect_msg (WRITE_ACK
, in_msg_buf
, 1))
864 #endif /* GR64_REGNUM */
866 /* Global registers gr96-gr127 */
867 out_msg_buf
->write_r_msg
.byte_count
= 4 * (32);
868 out_msg_buf
->write_r_msg
.length
= 3 * 4 + out_msg_buf
->write_r_msg
.byte_count
;
869 out_msg_buf
->write_r_msg
.address
= 96;
870 for (regno
= GR96_REGNUM
; regno
< GR96_REGNUM
+ 32; regno
++)
872 out_msg_buf
->write_r_msg
.data
[regno
- GR96_REGNUM
] = read_register (regno
);
874 msg_send_serial (out_msg_buf
);
875 if (!expect_msg (WRITE_ACK
, in_msg_buf
, 1))
880 /* Local Registers */
881 out_msg_buf
->write_r_msg
.memory_space
= LOCAL_REG
;
882 out_msg_buf
->write_r_msg
.byte_count
= 4 * 128;
883 out_msg_buf
->write_r_msg
.length
= 3 * 4 + out_msg_buf
->write_r_msg
.byte_count
;
884 out_msg_buf
->write_r_msg
.address
= 0;
886 for (regno
= LR0_REGNUM
; regno
< LR0_REGNUM
+ 128; regno
++)
888 out_msg_buf
->write_r_msg
.data
[regno
- LR0_REGNUM
] = read_register (regno
);
890 msg_send_serial (out_msg_buf
);
891 if (!expect_msg (WRITE_ACK
, in_msg_buf
, 1))
896 /* Protected Special Registers */
897 /* VAB through TMR */
898 out_msg_buf
->write_r_msg
.memory_space
= SPECIAL_REG
;
899 out_msg_buf
->write_r_msg
.byte_count
= 4 * 10;
900 out_msg_buf
->write_r_msg
.length
= 3 * 4 + out_msg_buf
->write_r_msg
.byte_count
;
901 out_msg_buf
->write_r_msg
.address
= 0;
902 for (regno
= 0; regno
<= 9; regno
++) /* VAB through TMR */
903 out_msg_buf
->write_r_msg
.data
[regno
] = read_register (SR_REGNUM (regno
));
904 msg_send_serial (out_msg_buf
);
905 if (!expect_msg (WRITE_ACK
, in_msg_buf
, 1))
910 /* PC0, PC1, PC2 possibly as shadow registers */
911 out_msg_buf
->write_r_msg
.byte_count
= 4 * 3;
912 out_msg_buf
->write_r_msg
.length
= 3 * 4 + out_msg_buf
->write_r_msg
.byte_count
;
913 for (regno
= 10; regno
<= 12; regno
++) /* LRU and MMU */
914 out_msg_buf
->write_r_msg
.data
[regno
- 10] = read_register (SR_REGNUM (regno
));
916 out_msg_buf
->write_r_msg
.address
= 20; /* SPC0 */
918 out_msg_buf
->write_r_msg
.address
= 10; /* PC0 */
919 msg_send_serial (out_msg_buf
);
920 if (!expect_msg (WRITE_ACK
, in_msg_buf
, 1))
926 out_msg_buf
->write_r_msg
.byte_count
= 4 * 2;
927 out_msg_buf
->write_r_msg
.length
= 3 * 4 + out_msg_buf
->write_r_msg
.byte_count
;
928 out_msg_buf
->write_r_msg
.address
= 13;
929 for (regno
= 13; regno
<= 14; regno
++) /* LRU and MMU */
930 out_msg_buf
->write_r_msg
.data
[regno
- 13] = read_register (SR_REGNUM (regno
));
931 msg_send_serial (out_msg_buf
);
932 if (!expect_msg (WRITE_ACK
, in_msg_buf
, 1))
937 /* Unprotected Special Registers */
938 out_msg_buf
->write_r_msg
.byte_count
= 4 * 8;
939 out_msg_buf
->write_r_msg
.length
= 3 * 4 + out_msg_buf
->write_r_msg
.byte_count
;
940 out_msg_buf
->write_r_msg
.address
= 128;
941 for (regno
= 128; regno
<= 135; regno
++)
942 out_msg_buf
->write_r_msg
.data
[regno
- 128] = read_register (SR_REGNUM (regno
));
943 msg_send_serial (out_msg_buf
);
944 if (!expect_msg (WRITE_ACK
, in_msg_buf
, 1))
949 registers_changed ();
952 /*************************************************** REMOTE_PREPARE_TO_STORE */
953 /* Get ready to modify the registers array. On machines which store
954 individual registers, this doesn't need to do anything. On machines
955 which store all the registers in one fell swoop, this makes sure
956 that registers contains all the registers from the program being
960 mm_prepare_to_store (void)
962 /* Do nothing, since we can store individual regs */
965 /******************************************************* REMOTE_XFER_MEMORY */
967 translate_addr (CORE_ADDR addr
)
969 #if defined(KERNEL_DEBUGGING)
970 /* Check for a virtual address in the kernel */
971 /* Assume physical address of ublock is in paddr_u register */
972 /* FIXME: doesn't work for user virtual addresses */
975 /* PADDR_U register holds the physical address of the ublock */
976 CORE_ADDR i
= (CORE_ADDR
) read_register (PADDR_U_REGNUM
);
977 return (i
+ addr
- (CORE_ADDR
) UVADDR
);
988 /******************************************************* REMOTE_FILES_INFO */
992 printf ("\tAttached to %s at %d baud and running program %s.\n",
993 dev_name
, baudrate
, prog_name
);
996 /************************************************* REMOTE_INSERT_BREAKPOINT */
998 mm_insert_breakpoint (CORE_ADDR addr
, char *contents_cache
)
1000 out_msg_buf
->bkpt_set_msg
.code
= BKPT_SET
;
1001 out_msg_buf
->bkpt_set_msg
.length
= 4 * 4;
1002 out_msg_buf
->bkpt_set_msg
.memory_space
= I_MEM
;
1003 out_msg_buf
->bkpt_set_msg
.bkpt_addr
= (ADDR32
) addr
;
1004 out_msg_buf
->bkpt_set_msg
.pass_count
= 1;
1005 out_msg_buf
->bkpt_set_msg
.bkpt_type
= -1; /* use illop for 29000 */
1006 msg_send_serial (out_msg_buf
);
1007 if (expect_msg (BKPT_SET_ACK
, in_msg_buf
, 1))
1009 return 0; /* Success */
1013 return 1; /* Failure */
1017 /************************************************* REMOTE_DELETE_BREAKPOINT */
1019 mm_remove_breakpoint (CORE_ADDR addr
, char *contents_cache
)
1021 out_msg_buf
->bkpt_rm_msg
.code
= BKPT_RM
;
1022 out_msg_buf
->bkpt_rm_msg
.length
= 4 * 3;
1023 out_msg_buf
->bkpt_rm_msg
.memory_space
= I_MEM
;
1024 out_msg_buf
->bkpt_rm_msg
.bkpt_addr
= (ADDR32
) addr
;
1025 msg_send_serial (out_msg_buf
);
1026 if (expect_msg (BKPT_RM_ACK
, in_msg_buf
, 1))
1028 return 0; /* Success */
1032 return 1; /* Failure */
1037 /******************************************************* REMOTE_KILL */
1039 mm_kill (char *arg
, int from_tty
)
1043 #if defined(KERNEL_DEBUGGING)
1044 /* We don't ever kill the kernel */
1047 printf ("Kernel not killed, but left in current state.\n");
1048 printf ("Use detach to leave kernel running.\n");
1051 out_msg_buf
->break_msg
.code
= BREAK
;
1052 out_msg_buf
->bkpt_set_msg
.length
= 4 * 0;
1053 expect_msg (HALT
, in_msg_buf
, from_tty
);
1056 printf ("Target has been stopped.");
1057 printf ("Would you like to do a hardware reset (y/n) [n] ");
1058 fgets (buf
, 3, stdin
);
1061 out_msg_buf
->reset_msg
.code
= RESET
;
1062 out_msg_buf
->bkpt_set_msg
.length
= 4 * 0;
1063 expect_msg (RESET_ACK
, in_msg_buf
, from_tty
);
1064 printf ("Target has been reset.");
1073 /***************************************************************************/
1075 * Load a program into the target.
1078 mm_load (char *arg_string
, int from_tty
)
1082 #if defined(KERNEL_DEBUGGING)
1083 printf ("The kernel had better be loaded already! Loading not done.\n");
1085 if (arg_string
== 0)
1086 error ("The load command takes a file name");
1088 arg_string
= tilde_expand (arg_string
);
1089 make_cleanup (free
, arg_string
);
1092 error ("File loading is not yet supported for MiniMon.");
1093 /* FIXME, code to load your file here... */
1094 /* You may need to do an init_target_mm() */
1095 /* init_target_mm(?,?,?,?,?,?,?,?); */
1097 /* symbol_file_add (arg_string, from_tty, text_addr, 0, 0); */
1102 /************************************************ REMOTE_WRITE_INFERIOR_MEMORY
1103 ** Copy LEN bytes of data from debugger memory at MYADDR
1104 to inferior's memory at MEMADDR. Returns number of bytes written. */
1106 mm_write_inferior_memory (CORE_ADDR memaddr
, char *myaddr
, int len
)
1110 out_msg_buf
->write_req_msg
.code
= WRITE_REQ
;
1111 out_msg_buf
->write_req_msg
.memory_space
= mm_memory_space (memaddr
);
1114 while (nwritten
< len
)
1116 int num_to_write
= len
- nwritten
;
1117 if (num_to_write
> MAXDATA
)
1118 num_to_write
= MAXDATA
;
1119 for (i
= 0; i
< num_to_write
; i
++)
1120 out_msg_buf
->write_req_msg
.data
[i
] = myaddr
[i
+ nwritten
];
1121 out_msg_buf
->write_req_msg
.byte_count
= num_to_write
;
1122 out_msg_buf
->write_req_msg
.length
= 3 * 4 + num_to_write
;
1123 out_msg_buf
->write_req_msg
.address
= memaddr
+ nwritten
;
1124 msg_send_serial (out_msg_buf
);
1126 if (expect_msg (WRITE_ACK
, in_msg_buf
, 1))
1128 nwritten
+= in_msg_buf
->write_ack_msg
.byte_count
;
1138 /************************************************* REMOTE_READ_INFERIOR_MEMORY
1139 ** Read LEN bytes from inferior memory at MEMADDR. Put the result
1140 at debugger address MYADDR. Returns number of bytes read. */
1142 mm_read_inferior_memory (CORE_ADDR memaddr
, char *myaddr
, int len
)
1146 out_msg_buf
->read_req_msg
.code
= READ_REQ
;
1147 out_msg_buf
->read_req_msg
.memory_space
= mm_memory_space (memaddr
);
1152 int num_to_read
= (len
- nread
);
1153 if (num_to_read
> MAXDATA
)
1154 num_to_read
= MAXDATA
;
1155 out_msg_buf
->read_req_msg
.byte_count
= num_to_read
;
1156 out_msg_buf
->read_req_msg
.length
= 3 * 4 + num_to_read
;
1157 out_msg_buf
->read_req_msg
.address
= memaddr
+ nread
;
1158 msg_send_serial (out_msg_buf
);
1160 if (expect_msg (READ_ACK
, in_msg_buf
, 1))
1162 for (i
= 0; i
< in_msg_buf
->read_ack_msg
.byte_count
; i
++)
1163 myaddr
[i
+ nread
] = in_msg_buf
->read_ack_msg
.data
[i
];
1164 nread
+= in_msg_buf
->read_ack_msg
.byte_count
;
1174 /* FIXME! Merge these two. */
1176 mm_xfer_inferior_memory (CORE_ADDR memaddr
, char *myaddr
, int len
, int write
)
1179 memaddr
= translate_addr (memaddr
);
1182 return mm_write_inferior_memory (memaddr
, myaddr
, len
);
1184 return mm_read_inferior_memory (memaddr
, myaddr
, len
);
1188 /********************************************************** MSG_SEND_SERIAL
1189 ** This function is used to send a message over the
1192 ** If the message is successfully sent, a zero is
1193 ** returned. If the message was not sendable, a -1
1194 ** is returned. This function blocks. That is, it
1195 ** does not return until the message is completely
1196 ** sent, or until an error is encountered.
1201 msg_send_serial (union msg_t
*msg_ptr
)
1208 /* Send message header */
1210 message_size
= msg_ptr
->generic_msg
.length
+ (2 * sizeof (INT32
));
1213 c
= *((char *) msg_ptr
+ byte_count
);
1214 result
= write (mm_desc
, &c
, 1);
1217 byte_count
= byte_count
+ 1;
1220 while ((byte_count
< message_size
));
1223 } /* end msg_send_serial() */
1225 /********************************************************** MSG_RECV_SERIAL
1226 ** This function is used to receive a message over a
1229 ** If the message is waiting in the buffer, a zero is
1230 ** returned and the buffer pointed to by msg_ptr is filled
1231 ** in. If no message was available, a -1 is returned.
1232 ** If timeout==0, wait indefinetly for a character.
1237 msg_recv_serial (union msg_t
*msg_ptr
)
1239 static INT32 length
= 0;
1240 static INT32 byte_count
= 0;
1243 if (msg_ptr
== 0) /* re-sync request */
1248 /* The timeout here is the prevailing timeout set with VTIME */
1249 ->"timeout==0 semantics not supported"
1250 read (mm_desc
, in_buf
, BUFER_SIZE
);
1253 read (mm_desc
, in_buf
, BUFER_SIZE
);
1258 /* Receive message */
1260 /* Timeout==0, help support the mm_wait() routine */
1261 ->"timeout==0 semantics not supported (and its nice if they are)"
1262 result
= read (mm_desc
, &c
, 1);
1265 result
= read (mm_desc
, &c
, 1);
1272 error ("Timeout reading from remote system.");
1275 perror_with_name ("remote");
1277 else if (result
== 1)
1279 *((char *) msg_ptr
+ byte_count
) = c
;
1280 byte_count
= byte_count
+ 1;
1283 /* Message header received. Save message length. */
1284 if (byte_count
== (2 * sizeof (INT32
)))
1285 length
= msg_ptr
->generic_msg
.length
;
1287 if (byte_count
>= (length
+ (2 * sizeof (INT32
))))
1289 /* Message received */
1296 } /* end msg_recv_serial() */
1298 /********************************************************************* KBD_RAW
1299 ** This function is used to put the keyboard in "raw"
1300 ** mode for BSD Unix. The original status is saved
1301 ** so that it may be restored later.
1311 /* Get keyboard termio (to save to restore original modes) */
1313 result
= ioctl (0, TCGETA
, &kbd_tbuf
);
1315 result
= ioctl (0, TIOCGETP
, &kbd_tbuf
);
1320 /* Get keyboard TERMINAL (for modification) */
1322 result
= ioctl (0, TCGETA
, &tbuf
);
1324 result
= ioctl (0, TIOCGETP
, &tbuf
);
1329 /* Set up new parameters */
1331 tbuf
.c_iflag
= tbuf
.c_iflag
&
1332 ~(INLCR
| ICRNL
| IUCLC
| ISTRIP
| IXON
| BRKINT
);
1333 tbuf
.c_lflag
= tbuf
.c_lflag
& ~(ICANON
| ISIG
| ECHO
);
1334 tbuf
.c_cc
[4] = 0; /* MIN */
1335 tbuf
.c_cc
[5] = 0; /* TIME */
1337 /* FIXME: not sure if this is correct (matches HAVE_TERMIO). */
1338 tbuf
.sg_flags
|= RAW
;
1339 tbuf
.sg_flags
|= ANYP
;
1340 tbuf
.sg_flags
&= ~ECHO
;
1343 /* Set keyboard termio to new mode (RAW) */
1345 result
= ioctl (0, TCSETAF
, &tbuf
);
1347 result
= ioctl (0, TIOCSETP
, &tbuf
);
1353 } /* end kbd_raw() */
1357 /***************************************************************** KBD_RESTORE
1358 ** This function is used to put the keyboard back in the
1359 ** mode it was in before kbk_raw was called. Note that
1360 ** kbk_raw() must have been called at least once before
1361 ** kbd_restore() is called.
1369 /* Set keyboard termio to original mode */
1371 result
= ioctl (0, TCSETAF
, &kbd_tbuf
);
1373 result
= ioctl (0, TIOCGETP
, &kbd_tbuf
);
1380 } /* end kbd_cooked() */
1383 /*****************************************************************************/
1384 /* Fetch a single register indicatated by 'regno'.
1385 * Returns 0/-1 on success/failure.
1388 fetch_register (int regno
)
1391 out_msg_buf
->read_req_msg
.code
= READ_REQ
;
1392 out_msg_buf
->read_req_msg
.length
= 4 * 3;
1393 out_msg_buf
->read_req_msg
.byte_count
= 4;
1395 if (regno
== GR1_REGNUM
)
1397 out_msg_buf
->read_req_msg
.memory_space
= GLOBAL_REG
;
1398 out_msg_buf
->read_req_msg
.address
= 1;
1400 else if (regno
>= GR96_REGNUM
&& regno
< GR96_REGNUM
+ 32)
1402 out_msg_buf
->read_req_msg
.memory_space
= GLOBAL_REG
;
1403 out_msg_buf
->read_req_msg
.address
= (regno
- GR96_REGNUM
) + 96;
1405 #if defined(GR64_REGNUM)
1406 else if (regno
>= GR64_REGNUM
&& regno
< GR64_REGNUM
+ 32)
1408 out_msg_buf
->read_req_msg
.memory_space
= GLOBAL_REG
;
1409 out_msg_buf
->read_req_msg
.address
= (regno
- GR64_REGNUM
) + 64;
1411 #endif /* GR64_REGNUM */
1412 else if (regno
>= LR0_REGNUM
&& regno
< LR0_REGNUM
+ 128)
1414 out_msg_buf
->read_req_msg
.memory_space
= LOCAL_REG
;
1415 out_msg_buf
->read_req_msg
.address
= (regno
- LR0_REGNUM
);
1417 else if (regno
>= FPE_REGNUM
&& regno
<= EXO_REGNUM
)
1420 supply_register (160 + (regno
- FPE_REGNUM
), &val
);
1421 return 0; /* Pretend Success */
1425 out_msg_buf
->read_req_msg
.memory_space
= SPECIAL_REG
;
1426 out_msg_buf
->read_req_msg
.address
= regnum_to_srnum (regno
);
1429 msg_send_serial (out_msg_buf
);
1431 if (expect_msg (READ_ACK
, in_msg_buf
, 1))
1433 supply_register (regno
, &(in_msg_buf
->read_r_ack_msg
.data
[0]));
1442 /*****************************************************************************/
1443 /* Store a single register indicated by 'regno'.
1444 * Returns 0/-1 on success/failure.
1447 store_register (int regno
)
1451 out_msg_buf
->write_req_msg
.code
= WRITE_REQ
;
1452 out_msg_buf
->write_req_msg
.length
= 4 * 4;
1453 out_msg_buf
->write_req_msg
.byte_count
= 4;
1454 out_msg_buf
->write_r_msg
.data
[0] = read_register (regno
);
1456 if (regno
== GR1_REGNUM
)
1458 out_msg_buf
->write_req_msg
.memory_space
= GLOBAL_REG
;
1459 out_msg_buf
->write_req_msg
.address
= 1;
1460 /* Setting GR1 changes the numbers of all the locals, so invalidate the
1461 * register cache. Do this *after* calling read_register, because we want
1462 * read_register to return the value that write_register has just stuffed
1463 * into the registers array, not the value of the register fetched from
1466 registers_changed ();
1468 #if defined(GR64_REGNUM)
1469 else if (regno
>= GR64_REGNUM
&& regno
< GR64_REGNUM
+ 32)
1471 out_msg_buf
->write_req_msg
.memory_space
= GLOBAL_REG
;
1472 out_msg_buf
->write_req_msg
.address
= (regno
- GR64_REGNUM
) + 64;
1474 #endif /* GR64_REGNUM */
1475 else if (regno
>= GR96_REGNUM
&& regno
< GR96_REGNUM
+ 32)
1477 out_msg_buf
->write_req_msg
.memory_space
= GLOBAL_REG
;
1478 out_msg_buf
->write_req_msg
.address
= (regno
- GR96_REGNUM
) + 96;
1480 else if (regno
>= LR0_REGNUM
&& regno
< LR0_REGNUM
+ 128)
1482 out_msg_buf
->write_req_msg
.memory_space
= LOCAL_REG
;
1483 out_msg_buf
->write_req_msg
.address
= (regno
- LR0_REGNUM
);
1485 else if (regno
>= FPE_REGNUM
&& regno
<= EXO_REGNUM
)
1487 return 0; /* Pretend Success */
1490 /* An unprotected or protected special register */
1492 out_msg_buf
->write_req_msg
.memory_space
= SPECIAL_REG
;
1493 out_msg_buf
->write_req_msg
.address
= regnum_to_srnum (regno
);
1496 msg_send_serial (out_msg_buf
);
1498 if (expect_msg (WRITE_ACK
, in_msg_buf
, 1))
1508 /****************************************************************************/
1510 * Convert a gdb special register number to a 29000 special register number.
1513 regnum_to_srnum (int regno
)
1538 return (USE_SHADOW_PC
? (20) : (10));
1540 return (USE_SHADOW_PC
? (21) : (11));
1542 return (USE_SHADOW_PC
? (22) : (12));
1572 return (255); /* Failure ? */
1575 /****************************************************************************/
1577 * Initialize the target debugger (minimon only).
1580 init_target_mm (ADDR32 tstart
, ADDR32 tend
, ADDR32 dstart
, ADDR32 dend
,
1581 ADDR32 entry
, INT32 ms_size
, INT32 rs_size
, ADDR32 arg_start
)
1583 out_msg_buf
->init_msg
.code
= INIT
;
1584 out_msg_buf
->init_msg
.length
= sizeof (struct init_msg_t
) - 2 * sizeof (INT32
);
1585 out_msg_buf
->init_msg
.text_start
= tstart
;
1586 out_msg_buf
->init_msg
.text_end
= tend
;
1587 out_msg_buf
->init_msg
.data_start
= dstart
;
1588 out_msg_buf
->init_msg
.data_end
= dend
;
1589 out_msg_buf
->init_msg
.entry_point
= entry
;
1590 out_msg_buf
->init_msg
.mem_stack_size
= ms_size
;
1591 out_msg_buf
->init_msg
.reg_stack_size
= rs_size
;
1592 out_msg_buf
->init_msg
.arg_start
= arg_start
;
1593 msg_send_serial (out_msg_buf
);
1594 expect_msg (INIT_ACK
, in_msg_buf
, 1);
1596 /****************************************************************************/
1598 * Return a pointer to a string representing the given message code.
1599 * Not all messages are represented here, only the ones that we expect
1600 * to be called with.
1603 msg_str (INT32 code
)
1605 static char cbuf
[32];
1610 sprintf (cbuf
, "%s (%d)", "BKPT_SET_ACK", code
);
1613 sprintf (cbuf
, "%s (%d)", "BKPT_RM_ACK", code
);
1616 sprintf (cbuf
, "%s (%d)", "INIT_ACK", code
);
1619 sprintf (cbuf
, "%s (%d)", "READ_ACK", code
);
1622 sprintf (cbuf
, "%s (%d)", "WRITE_ACK", code
);
1625 sprintf (cbuf
, "%s (%d)", "ERROR", code
);
1628 sprintf (cbuf
, "%s (%d)", "HALT", code
);
1631 sprintf (cbuf
, "UNKNOWN (%d)", code
);
1636 /****************************************************************************/
1638 * Selected (not all of them) error codes that we might get.
1641 error_msg_str (INT32 code
)
1643 static char cbuf
[50];
1648 return ("EMFAIL: unrecoverable error");
1650 return ("EMBADADDR: Illegal address");
1652 return ("EMBADREG: Illegal register ");
1654 return ("EMACCESS: Could not access memory");
1656 return ("EMBADMSG: Unknown message type");
1658 return ("EMMSG2BIG: Message to large");
1660 return ("EMNOSEND: Could not send message");
1662 return ("EMNORECV: Could not recv message");
1664 return ("EMRESET: Could not RESET target");
1666 return ("EMCONFIG: Could not get target CONFIG");
1668 return ("EMSTATUS: Could not get target STATUS");
1670 return ("EMREAD: Could not READ target memory");
1672 return ("EMWRITE: Could not WRITE target memory");
1674 return ("EMBKPTSET: Could not set breakpoint");
1676 return ("EMBKPTRM: Could not remove breakpoint");
1678 return ("EMBKPTSTAT: Could not get breakpoint status");
1680 return ("EMBKPTNONE: All breakpoints in use");
1682 return ("EMBKPTUSED: Breakpoints already in use");
1684 return ("EMINIT: Could not init target memory");
1686 return ("EMGO: Could not start execution");
1688 return ("EMSTEP: Could not single step");
1690 return ("EMBREAK: Could not BREAK");
1692 return ("EMCOMMERR: Communication error");
1694 sprintf (cbuf
, "error number %d", code
);
1700 /****************************************************************************/
1702 * Receive a message and expect it to be of type msgcode.
1703 * Returns 0/1 on failure/success.
1706 expect_msg (msgcode
, msg_buf
, from_tty
)
1707 INT32 msgcode
; /* Msg code we expect */
1708 union msg_t
*msg_buf
; /* Where to put the message received */
1709 int from_tty
; /* Print message on error if non-zero */
1712 while (msg_recv_serial (msg_buf
) && (retries
++ < MAX_RETRIES
));
1713 if (retries
>= MAX_RETRIES
)
1715 printf ("Expected msg %s, ", msg_str (msgcode
));
1716 printf ("no message received!\n");
1717 return (0); /* Failure */
1720 if (msg_buf
->generic_msg
.code
!= msgcode
)
1724 printf ("Expected msg %s, ", msg_str (msgcode
));
1725 printf ("got msg %s\n", msg_str (msg_buf
->generic_msg
.code
));
1726 if (msg_buf
->generic_msg
.code
== ERROR
)
1727 printf ("%s\n", error_msg_str (msg_buf
->error_msg
.error_code
));
1729 return (0); /* Failure */
1731 return (1); /* Success */
1733 /****************************************************************************/
1735 * Determine the MiniMon memory space qualifier based on the addr.
1736 * FIXME: Can't distinguis I_ROM/D_ROM.
1737 * FIXME: Doesn't know anything about I_CACHE/D_CACHE.
1740 mm_memory_space (CORE_ADDR
*addr
)
1742 ADDR32 tstart
= target_config
.I_mem_start
;
1743 ADDR32 tend
= tstart
+ target_config
.I_mem_size
;
1744 ADDR32 dstart
= target_config
.D_mem_start
;
1745 ADDR32 dend
= tstart
+ target_config
.D_mem_size
;
1746 ADDR32 rstart
= target_config
.ROM_start
;
1747 ADDR32 rend
= tstart
+ target_config
.ROM_size
;
1749 if (((ADDR32
) addr
>= tstart
) && ((ADDR32
) addr
< tend
))
1753 else if (((ADDR32
) addr
>= dstart
) && ((ADDR32
) addr
< dend
))
1757 else if (((ADDR32
) addr
>= rstart
) && ((ADDR32
) addr
< rend
))
1759 /* FIXME: how do we determine between D_ROM and I_ROM */
1762 else /* FIXME: what do me do now? */
1763 return D_MEM
; /* Hmmm! */
1766 /****************************************************************************/
1768 * Define the target subroutine names
1770 struct target_ops mm_ops
;
1775 mm_ops
.to_shortname
= "minimon";
1776 mm_ops
.to_longname
= "Remote AMD/Minimon target";
1777 mm_ops
.to_doc
= "Remote debug an AMD 290*0 using the MiniMon dbg core on the target";
1778 mm_ops
.to_open
= mm_open
;
1779 mm_ops
.to_close
= mm_close
;
1780 mm_ops
.to_attach
= mm_attach
;
1781 mm_ops
.to_post_attach
= NULL
;
1782 mm_ops
.to_require_attach
= NULL
;
1783 mm_ops
.to_detach
= mm_detach
;
1784 mm_ops
.to_require_detach
= NULL
;
1785 mm_ops
.to_resume
= mm_resume
;
1786 mm_ops
.to_wait
= mm_wait
;
1787 mm_ops
.to_post_wait
= NULL
;
1788 mm_ops
.to_fetch_registers
= mm_fetch_registers
;
1789 mm_ops
.to_store_registers
= mm_store_registers
;
1790 mm_ops
.to_prepare_to_store
= mm_prepare_to_store
;
1791 mm_ops
.to_xfer_memory
= mm_xfer_inferior_memory
;
1792 mm_ops
.to_files_info
= mm_files_info
;
1793 mm_ops
.to_insert_breakpoint
= mm_insert_breakpoint
;
1794 mm_ops
.to_remove_breakpoint
= mm_remove_breakpoint
;
1795 mm_ops
.to_terminal_init
= 0;
1796 mm_ops
.to_terminal_inferior
= 0;
1797 mm_ops
.to_terminal_ours_for_output
= 0;
1798 mm_ops
.to_terminal_ours
= 0;
1799 mm_ops
.to_terminal_info
= 0;
1800 mm_ops
.to_kill
= mm_kill
;
1801 mm_ops
.to_load
= mm_load
;
1802 mm_ops
.to_lookup_symbol
= 0;
1803 mm_ops
.to_create_inferior
= mm_create_inferior
;
1804 mm_ops
.to_post_startup_inferior
= NULL
;
1805 mm_ops
.to_acknowledge_created_inferior
= NULL
;
1806 mm_ops
.to_clone_and_follow_inferior
= NULL
;
1807 mm_ops
.to_post_follow_inferior_by_clone
= NULL
;
1808 mm_ops
.to_insert_fork_catchpoint
= NULL
;
1809 mm_ops
.to_remove_fork_catchpoint
= NULL
;
1810 mm_ops
.to_insert_vfork_catchpoint
= NULL
;
1811 mm_ops
.to_remove_vfork_catchpoint
= NULL
;
1812 mm_ops
.to_has_forked
= NULL
;
1813 mm_ops
.to_has_vforked
= NULL
;
1814 mm_ops
.to_can_follow_vfork_prior_to_exec
= NULL
;
1815 mm_ops
.to_post_follow_vfork
= NULL
;
1816 mm_ops
.to_insert_exec_catchpoint
= NULL
;
1817 mm_ops
.to_remove_exec_catchpoint
= NULL
;
1818 mm_ops
.to_has_execd
= NULL
;
1819 mm_ops
.to_reported_exec_events_per_exec_call
= NULL
;
1820 mm_ops
.to_has_exited
= NULL
;
1821 mm_ops
.to_mourn_inferior
= mm_mourn
;
1822 mm_ops
.to_can_run
= 0;
1823 mm_ops
.to_notice_signals
= 0;
1824 mm_ops
.to_thread_alive
= 0;
1826 mm_ops
.to_pid_to_exec_file
= NULL
;
1827 mm_ops
.to_core_file_to_sym_file
= NULL
;
1828 mm_ops
.to_stratum
= process_stratum
;
1829 mm_ops
.DONT_USE
= 0;
1830 mm_ops
.to_has_all_memory
= 1;
1831 mm_ops
.to_has_memory
= 1;
1832 mm_ops
.to_has_stack
= 1;
1833 mm_ops
.to_has_registers
= 1;
1834 mm_ops
.to_has_execution
= 1;
1835 mm_ops
.to_sections
= 0;
1836 mm_ops
.to_sections_end
= 0;
1837 mm_ops
.to_magic
= OPS_MAGIC
;
1841 _initialize_remote_mm (void)
1844 add_target (&mm_ops
);
1847 #ifdef NO_HIF_SUPPORT
1848 service_HIF (union msg_t
*msg
)
1850 return (0); /* Emulate a failure */