Cleanup debug logging, fix single stepping. WinBond works good!
authorRob Savoye <rob@cygnus>
Wed, 12 Oct 1994 23:12:47 +0000 (23:12 +0000)
committerRob Savoye <rob@cygnus>
Wed, 12 Oct 1994 23:12:47 +0000 (23:12 +0000)
gdb/monitor.c
gdb/monitor.h
gdb/op50-rom.c
gdb/w89k-rom.c

index bd0709d..1fde43b 100644 (file)
@@ -121,13 +121,88 @@ printf_monitor(va_alist)
 
   vsprintf(buf, pattern, args);
 
-  if (sr_get_debug() > 3)
-    printf ("Sending to monitor,\r\n\t\"%s\".\r\n", buf);
+  debuglogs (1, "printf_monitor(), Sending: \"%s\".", buf);
 
   if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
     fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
 }
 
+/*
+ * debuglogs -- deal with debugging info to multiple sources. This takes
+ *     two real args, the first one is the level to be compared against 
+ *     the sr_get_debug() value, the second arg is a printf buffer and args
+ *     to be formatted and printed. A CR is added after each string is printed.
+ */
+static void
+debuglogs(va_alist)
+     va_dcl
+{
+  va_list args;
+  char *pattern, *p;
+  char buf[200];
+  char newbuf[300];
+  int level, i;
+
+  va_start(args);
+
+  level = va_arg(args, int);                   /* get the debug level */
+  if ((level <0) || (level > 100)) {
+    error ("Bad argument passed to debuglogs()");
+    return;
+  }
+      
+  pattern = va_arg(args, char *);              /* get the printf style pattern */
+
+  vsprintf(buf, pattern, args);                        /* format the string */
+  
+  /* convert some characters so it'll look right in the log */
+  p = newbuf;
+  for (i=0 ; buf[i] != '\0'; i++) {
+    switch (buf[i]) {
+    case '\n':                                 /* newlines */
+      *p++ = '\\';
+      *p++ = 'n';
+      continue;
+    case '\r':                                 /* carriage returns */
+      *p++ = '\\';
+      *p++ = 'r';
+      continue;
+    case '\033':                               /* escape */
+      *p++ = '\\';
+      *p++ = 'e';
+      continue;
+    case '\t':                                 /* tab */
+      *p++ = '\\';
+      *p++ = 't';
+      continue;
+    case '\b':                                 /* backspace */
+      *p++ = '\\';
+      *p++ = 'b';
+      continue;
+    default:                                   /* no change */
+      *p++ = buf[i];
+    }
+
+    if (buf[i] < 26) {                         /* modify control characters */
+      *p++ = '^';
+      *p++ = buf[i] + 'A';
+      continue;
+    }
+  }
+  *p = '\0';                                   /* terminate the string */
+
+  if (sr_get_debug() > level)
+    puts (newbuf);
+
+#ifdef LOG_FILE                                        /* write to the monitor log */
+  if (log_file != 0x0) {
+    fputs (newbuf, log_file);
+    fputc ('\n', log_file);
+    fflush (log_file);
+  }
+#endif
+}
+
 /* readchar -- read a character from the remote system, doing all the fancy
  *     timeout stuff.
  */
@@ -139,7 +214,7 @@ readchar(timeout)
 
   c = SERIAL_READCHAR(monitor_desc, timeout);
 
-  if (sr_get_debug() > 5)
+  if (sr_get_debug() > 4)
     putchar(c & 0x7f);
 
 #ifdef LOG_FILE
@@ -172,8 +247,7 @@ expect (string, discard)
   int c;
 
 
-  if (sr_get_debug())
-    printf ("Expecting \"%s\".\n", string);
+  debuglogs (1, "Expecting \"%s\".", string);
 
   immediate_quit = 1;
   while (1) {
@@ -238,11 +312,11 @@ junk(ch)
   case '\r':
   case '\n':
     if (sr_get_debug() > 5)
-      printf ("Ignoring \'%c\'.\n", ch);
+      debuglogs (5, "Ignoring \'%c\'.", ch);
     return 1;
   default:
     if (sr_get_debug() > 5)
-      printf ("Accepting \'%c\'.\n", ch);
+      debuglogs (5, "Accepting \'%c\'.", ch);
     return 0;
   }
 }
@@ -261,7 +335,7 @@ get_hex_digit(ignore)
     if (junk(ch))
       continue;
     if (sr_get_debug() > 4)
-      printf ("get_hex_digit() got a 0x%x(%c)\n", ch, ch);
+      debuglogs (4, "get_hex_digit() got a 0x%x(%c)", ch, ch);
 
     if (ch >= '0' && ch <= '9')
       return ch - '0';
@@ -288,16 +362,13 @@ get_hex_byte (byt)
   int val;
 
   val = get_hex_digit (1) << 4;
-   if (sr_get_debug() > 3)
-    printf ("\nget_hex_digit() -- Read first nibble 0x%x\n", val);
+  debuglogs (4, "get_hex_digit() -- Read first nibble 0x%x", val);
  
   val |= get_hex_digit (0);
-  if (sr_get_debug() > 3)
-    printf ("\nget_hex_digit() -- Read second nibble 0x%x\n", val);
+  debuglogs (4, "get_hex_digit() -- Read second nibble 0x%x", val);
   *byt = val;
   
-  if (sr_get_debug() > 3)
-    printf ("\nget_hex_digit() -- Read a 0x%x\n", val);
+  debuglogs (4, "get_hex_digit() -- Read a 0x%x", val);
 }
 
 /* 
@@ -314,8 +385,7 @@ get_hex_word ()
   for (i = 0; i < 8; i++)
     val = (val << 4) + get_hex_digit (i == 0);
   
-  if (sr_get_debug() > 3)
-    printf ("\nget_hex_word() got a 0x%x.\n", val);
+  debuglogs (3, "get_hex_word() got a 0x%x.", val);
 
   return val;
 }
@@ -338,9 +408,7 @@ monitor_create_inferior (execfile, args, env)
 
   entry_pt = (int) bfd_get_start_address (exec_bfd);
 
-#ifdef LOG_FILE
-  fputs ("\nIn Create_inferior()", log_file);
-#endif
+  debuglogs (2, "create_inferior(exexfile=%s, args=%s, env=%s)", execfile, args, env);
 
 /* The "process" (board) is already stopped awaiting our commands, and
    the program is already downloaded.  We just set its PC and go.  */
@@ -433,8 +501,7 @@ monitor_close (quitting)
   SERIAL_CLOSE(monitor_desc);
   monitor_desc = NULL;
 
-  if (sr_get_debug() > 4)
-    puts ("\nmonitor_close ()");
+  debuglogs (1, "monitor_close (quitting=%d)", quitting);
 
 #if defined (LOG_FILE)
   if (log_file) {
@@ -455,9 +522,8 @@ void
 monitor_detach (from_tty)
      int from_tty;
 {
-#ifdef LOG_FILE
-  fprintf (log_file, "\nmonitor_detach ()\n");
-#endif
+
+  debuglogs (4, "monitor_detach ()");
 
   pop_target();                /* calls monitor_close to do the real work */
   if (from_tty)
@@ -495,12 +561,7 @@ monitor_resume (pid, step, sig)
      int pid, step;
      enum target_signal sig;
 {
-#ifdef LOG_FILE
-  fprintf (log_file, "\nmonitor_resume (step=%d, sig=%d)\n", step, sig);
-#endif
-
-  if (sr_get_debug() > 4)
-    printf ("\nmonitor_resume (step=%d, sig=%d)\n", step, sig);
+  debuglogs (4, "monitor_resume (step=%d, sig=%d)", step, sig);
 
   if (step) {
     printf_monitor (STEP_CMD);
@@ -524,16 +585,19 @@ monitor_wait (pid, status)
      struct target_waitstatus *status;
 {
   int old_timeout = timeout;
-#ifdef LOG_FILE
-  fputs ("\nIn wait ()", log_file);
-#endif
 
+  debuglogs(4, "monitor_wait (), printing extraneous text.", log_file);
+  
   status->kind = TARGET_WAITKIND_EXITED;
   status->value.integer = 0;
 
   timeout = 0;         /* Don't time out -- user program is running. */
 
   expect_prompt(0);    /* Wait for prompt, outputting extraneous text */
+  if (sr_get_debug() > 4)
+    puts ("monitor_wait(), got the prompt.");
+
+  debuglogs (4, "monitor_wait(%x), got the prompt.", 12345678);
 
   status->kind = TARGET_WAITKIND_STOPPED;
   status->value.sig = TARGET_SIGNAL_TRAP;
@@ -565,19 +629,15 @@ get_reg_name (regno)
 
   *b = '\000';
 
-  if (sr_get_debug() > 5)
-    printf ("Got name \"%s\" from regno #%d.\n", buf, regno);
-
-#ifdef LOG_FILE
-  fprintf (log_file, "Got name \"%s\" from regno #%d.\n", buf, regno);
-  fflush (log_file);
-#endif
+  debuglogs (5, "Got name \"%s\" from regno #%d.", buf, regno);
 
   return buf;
 }
 
-/* read the remote registers into the block regs.  */
-
+/*
+ * monitor_fetch_registers -- read the remote registers into the
+ *     block regs.
+ */
 void
 monitor_fetch_registers ()
 {
@@ -600,10 +660,7 @@ monitor_fetch_register (regno)
 {
   int val, j;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
-  fflush (log_file);
-#endif
+  debuglogs (1, "monitor_fetch_register (regno=%d)", get_reg_name (regno));
 
   if (regno < 0) {
     monitor_fetch_registers ();
@@ -636,10 +693,8 @@ monitor_store_registers ()
 {
   int regno;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Fetch Registers\n");
-  fflush (log_file);
-#endif
+  debuglogs (1, "monitor_store_registers()");
+
   for (regno = 0; regno <= PC_REGNUM; regno++)
     monitor_store_register(regno);
 
@@ -659,15 +714,12 @@ monitor_store_register (regno)
 
   i = read_register(regno);
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
-#endif
+  debuglogs (1, "monitor_store_register (regno=%d)", regno);
 
   if (regno < 0)
     monitor_store_registers ();
   else {
-    if (sr_get_debug() > 3)
-      printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));
+      debuglogs (3, "Setting register %s to 0x%x", get_reg_name (regno), read_register (regno));
     
     name = get_reg_name (regno);
     if (STREQ(name, ""))
@@ -723,12 +775,7 @@ monitor_write_inferior_memory (memaddr, myaddr, len)
   int i;
   char buf[10];
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
-#endif
-
-  if (sr_get_debug() > 0)
-    printf ("\nTrying to set 0x%x to 0x%x\n", memaddr, myaddr);
+  debuglogs (1, "monitor_write_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
 
   for (i = 0; i < len; i++) {
     printf_monitor (ROMCMD(SET_MEM), memaddr + i, myaddr[i] );
@@ -772,9 +819,7 @@ monitor_read_inferior_memory(memaddr, myaddr, len)
   /* Number of bytes to read in this pass.  */
   int len_this_pass;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
-#endif
+  debuglogs (1, "monitor_read_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
 
   /* Note that this code works correctly if startaddr is just less
      than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
@@ -798,16 +843,12 @@ monitor_read_inferior_memory(memaddr, myaddr, len)
       len_this_pass -= startaddr % 16;
     if (len_this_pass > (len - count))
       len_this_pass = (len - count);
-    if (sr_get_debug())
-      printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
+
+    debuglogs (3, "Display %d bytes at %x", len_this_pass, startaddr);
     
     for (i = 0; i < len_this_pass; i++) {
       printf_monitor (ROMCMD(GET_MEM), startaddr, startaddr);
       sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
-#if 0
-      expect (buf,1);                          /* get the command echo */
-      get_hex_word(1);                         /* strip away the address */
-#endif
       if (*ROMDELIM(GET_MEM) != 0) {           /* if there's a delimiter */
        expect (ROMDELIM(GET_MEM), 1);
       } else {
@@ -877,12 +918,7 @@ monitor_insert_breakpoint (addr, shadow)
 {
   int i;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
-#endif
-
-  if (sr_get_debug() > 4)
-    printf ("insert_breakpoint() addr = 0x%x\n", addr);
+  debuglogs (1, "monitor_insert_breakpoint() addr = 0x%x", addr);
 
   for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++) {
     if (breakaddr[i] == 0) {
@@ -910,12 +946,7 @@ monitor_remove_breakpoint (addr, shadow)
 {
   int i;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
-#endif
-
-  if (sr_get_debug() > 4)
-    printf ("remove_breakpoint (addr=%x)\n", addr);
+  debuglogs (1, "monitor_remove_breakpoint() addr = 0x%x", addr);
 
   for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++) {
     if (breakaddr[i] == addr) {
@@ -1006,18 +1037,14 @@ monitor_command (args, fromtty)
   char c, cp;
   p = PROMPT;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nmonitor_command (args=%s)\n", args);
-#endif
+  debuglogs (1, "monitor_command (args=%s)", args);
+
   if (monitor_desc == NULL)
     error("monitor target not open.");
 
   if (!args)
     error("Missing command.");
        
-  if (sr_get_debug() > 4)
-    printf ("monitor_command (args=%s)\n", args);
-
   printf_monitor ("%s\n", args);
 
   expect_prompt(0);
index b3ed532..aaaa495 100644 (file)
@@ -78,6 +78,7 @@ extern struct monitor_ops        *current_monitor;
 
 #define push_monitor(x)                current_monitor = x;
 
+extern void debuglogs();
 extern void monitor_open();
 extern void monitor_close();
 extern void monitor_detach();
index 10341ea..791005a 100644 (file)
@@ -87,16 +87,16 @@ Specify the serial device it is connected to (e.g. /dev/ttya).",
 
 struct monitor_ops op50n_cmds = {
   1,                                   /* 1 for ASCII, 0 for binary */
-  ".\n",                               /* monitor init string */
-  "g %x",                      /* execute or usually GO command */
-  "",                          /* continue command */
-  "",                          /* single step */
+  ".\nXx\n",                           /* monitor init string */
+  "g %x",                              /* execute or usually GO command */
+  "g.",                                        /* continue command */
+  "c\n",                                /* single step */
   "b %x\n",                            /* set a breakpoint */
-  "",                          /* clear a breakpoint */
-  1,                                   /* 0 for number, 1 for address */
+  "bx %x\n",                           /* clear a breakpoint */
+  0,                                   /* 0 for number, 1 for address */
   {
     "sx %x %x;.\n",                    /* set memory */
-    "",                                /* delimiter  */
+    "",                                        /* delimiter  */
     "",                                        /* the result */
   },
   {
@@ -105,7 +105,7 @@ struct monitor_ops op50n_cmds = {
     " ",                               /* the result */
   },
   {
-    "x %s %x\n",                       /* set a register */
+    "x %s\n",                          /* set a register */
     "=",                               /* delimiter between registers */
     "",                                        /* the result */
   },
index ef1a3ee..7e8a628 100644 (file)
@@ -83,7 +83,7 @@ Specify the serial device it is connected to (e.g. /dev/ttya).",
 struct monitor_ops w89k_cmds = {
   1,                                   /* 1 for ASCII, 0 for binary */
   "\n",                                        /* monitor init string */
-  "g = %x\n",                  /* execute or usually GO command */
+  "g = %x\n",                          /* execute or usually GO command */
   "g\n",                               /* continue command */
   "t\n",                               /* single step */
   "bp %x\n",                           /* set a breakpoint */
@@ -99,13 +99,13 @@ struct monitor_ops w89k_cmds = {
     "",                                        /* delimiter */
     "",                                        /* the result */
   },
-  {                                    /* set a register */
+  {
     "r %s %x\n",                       /* set a register */
     "",                                        /* delimiter between registers */
     "",                                        /* the result */
   },
   {
-    "r %s\r",                          /* get a register */
+    "r %s\n",                          /* get a register */
     "",                                        /* delimiter between registers */
     "",                                        /* the result */
   },