home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / gdb-4.12-src.lha / GNU / src / amiga / gdb-4.12 / gdb / remote-mm.c < prev    next >
C/C++ Source or Header  |  1994-02-03  |  50KB  |  1,627 lines

  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 (wood@lab.ultra.nyu.edu) at New York University adapted this
  24.     file to gdb 3.95.  I was unable to get this working on sun3os4
  25.     with termio, only with sgtty.  Because we are only attempting to
  26.     use this module to debug our kernel, which is already loaded when
  27.     gdb is started up, I did not code up the file downloading facilities.  
  28.     As a result this module has only the stubs to download files. 
  29.     You should get tagged at compile time if you need to make any 
  30.     changes/additions.  */
  31.  
  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, TARGET_SIGNAL_DEFAULT, 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 = dam