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