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