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