Index: sid/component/gdb/gdb.cxx =================================================================== RCS file: /cvs/src/src/sid/component/gdb/gdb.cxx,v retrieving revision 1.13 diff -c -p -r1.13 gdb.cxx *** sid/component/gdb/gdb.cxx 1 Jul 2004 16:54:47 -0000 1.13 --- sid/component/gdb/gdb.cxx 11 Aug 2004 20:53:30 -0000 *************** gdb::process_get_exp_regs () *** 532,538 **** // Helper functions template ! bus::status read_bus_word(gdbserv* gdbserv, sid::bus* bus, host_int_4 address, --- 532,538 ---- // Helper functions template ! void read_bus_word(gdbserv* gdbserv, sid::bus* bus, host_int_4 address, *************** read_bus_word(gdbserv* gdbserv, *** 545,559 **** 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) gdbserv_output_string (gdbserv, "E05"); - return s; } template ! bus::status write_bus_word(gdbserv* gdbserv, int binary, sid::bus* bus, --- 545,570 ---- for (unsigned i=0; i < sizeof(typename Type::value_type); i++) gdbserv_output_byte (gdbserv, value.read_byte(i)); } ! 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"); } template ! void write_bus_word(gdbserv* gdbserv, int binary, sid::bus* bus, *************** write_bus_word(gdbserv* gdbserv, *** 574,584 **** } 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 gdbserv_output_string (gdbserv, "E05"); - return s; } --- 585,604 ---- } bus::status s = bus->write (address, value); ! 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"); } *************** gdb::process_get_mem (struct gdbserv_reg *** 623,651 **** } 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()); else if (len==1 && e==endian_little) ! b = 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()); else if (len==2 && e==endian_little) ! b = 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()); else if (len==4 && e==endian_little) ! b = 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()); 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) { for (unsigned long i=0; i