* remote.c (MIN_REMOTE_PACKET_SIZE): Set to 20.
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 8 Mar 2005 14:30:46 +0000 (14:30 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Tue, 8 Mar 2005 14:30:46 +0000 (14:30 +0000)
(remote_fetch_registers): Allow uppercase hex when resyncing.
(remote_write_bytes): Only call get_memory_write_packet_size once.
Robustify packet size calculation for very small packets. Check
that at least one byte will be written.

gdb/ChangeLog
gdb/remote.c

index b352ce4c2fd9c3a1a43b08ba238477edc76a7647..b49026715a12d90b79e3d45610569dc6423707b8 100644 (file)
@@ -1,5 +1,11 @@
 2005-03-08  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * remote.c (MIN_REMOTE_PACKET_SIZE): Set to 20.
+       (remote_fetch_registers): Allow uppercase hex when resyncing.
+       (remote_write_bytes): Only call get_memory_write_packet_size once.
+       Robustify packet size calculation for very small packets. Check
+       that at least one byte will be written.
+
        * tracepoint.c (target_is_remote): Allow extended-remote.
        (struct collection_list): Allow 256 registers, like the comment
        said.
index 3e97427d7bf00838243b9faa84ed7a88840a3cc9..317a7d53fb9415a48f95f2f0c9d51a5a14a1d648 100644 (file)
@@ -413,9 +413,9 @@ get_memory_packet_size (struct memory_packet_config *config)
 #ifndef MAX_REMOTE_PACKET_SIZE
 #define MAX_REMOTE_PACKET_SIZE 16384
 #endif
-  /* NOTE: 16 is just chosen at random.  */
+  /* NOTE: 20 ensures we can write at least one byte.  */
 #ifndef MIN_REMOTE_PACKET_SIZE
-#define MIN_REMOTE_PACKET_SIZE 16
+#define MIN_REMOTE_PACKET_SIZE 20
 #endif
   long what_they_get;
   if (config->fixed_p)
@@ -3332,6 +3332,7 @@ remote_fetch_registers (int regnum)
      in the buffer is not a hex character, assume that has happened
      and try to fetch another packet to read.  */
   while ((buf[0] < '0' || buf[0] > '9')
+        && (buf[0] < 'A' || buf[0] > 'F')
         && (buf[0] < 'a' || buf[0] > 'f')
         && buf[0] != 'x')      /* New: unavailable register value.  */
     {
@@ -3659,16 +3660,18 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
   /* Verify that the target can support a binary download.  */
   check_binary_download (memaddr);
 
+  payload_size = get_memory_write_packet_size ();
+  
   /* Compute the size, and then allocate space for the largest
-     possible packet.  Include space for an extra trailing NULL.  */
-  sizeof_buf = get_memory_write_packet_size () + 1;
+     possible packet.  Include space for an extra trailing NUL.  */
+  sizeof_buf = payload_size + 1;
   buf = alloca (sizeof_buf);
 
   /* Compute the size of the actual payload by subtracting out the
-     packet header and footer overhead: "$M<memaddr>,<len>:...#nn".  */
-  payload_size = (get_memory_write_packet_size () - (strlen ("$M,:#NN")
-                                                    + hexnumlen (memaddr)
-                                                    + hexnumlen (len)));
+     packet header and footer overhead: "$M<memaddr>,<len>:...#nn".
+     */
+  payload_size -= strlen ("$M,:#NN");
+  payload_size -= hexnumlen (memaddr);
 
   /* Construct the packet header: "[MX]<memaddr>,<len>:".   */
 
@@ -3681,11 +3684,15 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
       *p++ = 'X';
       /* Best guess at number of bytes that will fit.  */
       todo = min (len, payload_size);
+      payload_size -= hexnumlen (todo);
+      todo = min (todo, payload_size);
       break;
     case PACKET_DISABLE:
       *p++ = 'M';
       /* Num bytes that will fit.  */
       todo = min (len, payload_size / 2);
+      payload_size -= hexnumlen (todo);
+      todo = min (todo, payload_size / 2);
       break;
     case PACKET_SUPPORT_UNKNOWN:
       internal_error (__FILE__, __LINE__,
@@ -3693,6 +3700,9 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
     default:
       internal_error (__FILE__, __LINE__, _("bad switch"));
     }
+  if (todo <= 0)
+    internal_error (__FILE__, __LINE__,
+                   _("minumum packet size too small to write data"));
 
   /* Append "<memaddr>".  */
   memaddr = remote_address_masked (memaddr);