OSDN Git Service

2004-08-11 Dave Brolley <brolley@redhat.com>
authorbrolley <brolley>
Wed, 11 Aug 2004 20:59:05 +0000 (20:59 +0000)
committerbrolley <brolley>
Wed, 11 Aug 2004 20:59:05 +0000 (20:59 +0000)
        * gdb.cxx (read_bus_word): Handle bus::misaligned. Return type now
        'void' again.
        (write_bus_word): Ditto.
        (process_get_mem): Don't handle bus::misaligned here.
        (process_set_mem): Ditto.

sid/component/gdb/ChangeLog
sid/component/gdb/gdb.cxx

index fbb5670..c8fd15e 100644 (file)
@@ -1,3 +1,11 @@
+2004-08-11  Dave Brolley  <brolley@redhat.com>
+
+       * gdb.cxx (read_bus_word): Handle bus::misaligned. Return type now
+       'void' again.
+       (write_bus_word): Ditto.
+       (process_get_mem): Don't handle bus::misaligned here.
+       (process_set_mem): Ditto.
+
 2004-07-01  Dave Brolley  <brolley@redhat.com>
 
        * gdb.cxx (read_bus_word): Now returns bus::status. Return status
index 8c60b6e..e5ade1c 100644 (file)
@@ -532,7 +532,7 @@ gdb::process_get_exp_regs ()
 // Helper functions
 
 template <class Type>
-bus::status
+void
 read_bus_word(gdbserv* gdbserv, 
              sid::bus* bus,
              host_int_4 address,
@@ -545,15 +545,26 @@ read_bus_word(gdbserv* gdbserv,
       for (unsigned i=0; i < sizeof(typename Type::value_type); i++)
        gdbserv_output_byte (gdbserv, value.read_byte(i));
     }
-  // misaligned will be handled by the caller
-  else if (s != bus::misaligned)
+  else if (s == bus::misaligned)
+    {
+      // Try it one byte at a time
+      for (unsigned i=0; i < sizeof(typename Type::value_type); i++)
+       {
+         big_int_1 b; // endianness of a single byte is irrelevent
+         s = bus->read (address + i, b);
+         if (s == bus::ok) 
+           gdbserv_output_byte (gdbserv, b);
+         else
+           gdbserv_output_string (gdbserv, "E05");
+       }
+    }
+  else
     gdbserv_output_string (gdbserv, "E05");
-  return s;
 }
 
 
 template <class Type>
-bus::status
+void
 write_bus_word(gdbserv* gdbserv, 
               int binary,
               sid::bus* bus,
@@ -574,11 +585,20 @@ write_bus_word(gdbserv* gdbserv,
     }
 
   bus::status s = bus->write (address, value);
-  if (s == bus::ok || s == bus::misaligned)
-    ; // No response means "OK" -- misaligned will be handled by the caller
-  else
+  if (s == bus::misaligned)
+    {
+      // Try it a byte at a time
+      for (unsigned i=0; i < sizeof(typename Type::value_type); i++)
+       {
+         // endianness of a single byte is irrelevent
+         big_int_1 b = value.read_byte (i);
+         s = bus->write (address + i, b);
+         if (s != bus::ok)
+           gdbserv_output_string (gdbserv, "E05");
+       }
+    }
+  else if (s != bus::ok)
     gdbserv_output_string (gdbserv, "E05");
-  return s;
 }
 
 
@@ -623,29 +643,23 @@ gdb::process_get_mem (struct gdbserv_reg *reg_addr,
     }
   host_int_4 addr = addr8; // truncate
 
-  bus::status b = bus::misaligned;
   if (len==1 && e==endian_big) 
-    b = read_bus_word (gdbserv, memory, addr, big_int_1());
+    read_bus_word (gdbserv, memory, addr, big_int_1());
   else if (len==1 && e==endian_little)
-    b = read_bus_word (gdbserv, memory, addr, little_int_1());
+    read_bus_word (gdbserv, memory, addr, little_int_1());
   else if (len==2 && e==endian_big) 
-    b = read_bus_word (gdbserv, memory, addr, big_int_2());
+    read_bus_word (gdbserv, memory, addr, big_int_2());
   else if (len==2 && e==endian_little)
-    b = read_bus_word (gdbserv, memory, addr, little_int_2());
+    read_bus_word (gdbserv, memory, addr, little_int_2());
   else if (len==4 && e==endian_big) 
-    b = read_bus_word (gdbserv, memory, addr, big_int_4());
+    read_bus_word (gdbserv, memory, addr, big_int_4());
   else if (len==4 && e==endian_little)
-    b = read_bus_word (gdbserv, memory, addr, little_int_4());
+    read_bus_word (gdbserv, memory, addr, little_int_4());
   else if (len==8 && e==endian_big) 
-    b = read_bus_word (gdbserv, memory, addr, big_int_8());
+    read_bus_word (gdbserv, memory, addr, big_int_8());
   else if (len==8 && e==endian_little)
-    b = read_bus_word (gdbserv, memory, addr, little_int_8());
-
-  if (b != bus::misaligned)
-    return;
-  
-  // Unaligned access or unsupported size.
-  if (e==endian_little)
+    read_bus_word (gdbserv, memory, addr, little_int_8());
+  else if (e==endian_little)
     {
       for (unsigned long i=0; i<len; i++)
        read_bus_word (gdbserv, memory, addr + i, little_int_1());
@@ -709,29 +723,23 @@ gdb::process_set_mem (struct gdbserv_reg *reg_addr,
     }
   host_int_4 addr = addr8; // truncate
 
-  bus::status b = bus::misaligned;
   if (len==1 && e==endian_big) 
-    b = write_bus_word (gdbserv, binary, memory, addr, big_int_1());
-  if (len==1 && e==endian_little)
-    b = write_bus_word (gdbserv, binary, memory, addr, little_int_1());
-  if (len==2 && e==endian_big) 
-    b = write_bus_word (gdbserv, binary, memory, addr, big_int_2());
-  if (len==2 && e==endian_little)
-    b = write_bus_word (gdbserv, binary, memory, addr, little_int_2());
-  if (len==4 && e==endian_big) 
-    b = write_bus_word (gdbserv, binary, memory, addr, big_int_4());
-  if (len==4 && e==endian_little)
-    b = write_bus_word (gdbserv, binary, memory, addr, little_int_4());
-  if (len==8 && e==endian_big) 
-    b = write_bus_word (gdbserv, binary, memory, addr, big_int_8());
-  if (len==8 && e==endian_little)
-    b = write_bus_word (gdbserv, binary, memory, addr, little_int_8());
-
-  if (b != bus::misaligned)
-    return;
-
-  // Unaligned access or unsupported size.
-  if (e==endian_little)
+    write_bus_word (gdbserv, binary, memory, addr, big_int_1());
+  else if (len==1 && e==endian_little)
+    write_bus_word (gdbserv, binary, memory, addr, little_int_1());
+  else if (len==2 && e==endian_big) 
+    write_bus_word (gdbserv, binary, memory, addr, big_int_2());
+  else if (len==2 && e==endian_little)
+    write_bus_word (gdbserv, binary, memory, addr, little_int_2());
+  else if (len==4 && e==endian_big) 
+    write_bus_word (gdbserv, binary, memory, addr, big_int_4());
+  else if (len==4 && e==endian_little)
+    write_bus_word (gdbserv, binary, memory, addr, little_int_4());
+  else if (len==8 && e==endian_big) 
+    write_bus_word (gdbserv, binary, memory, addr, big_int_8());
+  else if (len==8 && e==endian_little)
+    write_bus_word (gdbserv, binary, memory, addr, little_int_8());
+  else if (e==endian_little)
     {
       for (unsigned long i=0; i<len; i++)
        write_bus_word (gdbserv, binary, memory, addr + i, little_int_1());