OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [remote-mm.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.