From eed726c8bfc17c1833727f5e5cf5a9b56d25f06f Mon Sep 17 00:00:00 2001 From: brolley Date: Mon, 28 Jun 2004 21:18:07 +0000 Subject: [PATCH] 2004-06-28 Dave Brolley * gdb.cxx (process_get_mem): Use byte-at-a-time access for unaligned requests. (process_set_mem): Ditto. --- sid/component/gdb/ChangeLog | 6 ++++ sid/component/gdb/gdb.cxx | 78 +++++++++++++++++++++++++-------------------- 2 files changed, 50 insertions(+), 34 deletions(-) diff --git a/sid/component/gdb/ChangeLog b/sid/component/gdb/ChangeLog index 17a145d94f..47ec6c2a3e 100644 --- a/sid/component/gdb/ChangeLog +++ b/sid/component/gdb/ChangeLog @@ -1,3 +1,9 @@ +2004-06-28 Dave Brolley + + * gdb.cxx (process_get_mem): Use byte-at-a-time access for unaligned + requests. + (process_set_mem): Ditto. + 2004-03-22 Dave Brolley * gdb.cxx (deinit_handler): Call target_power and diff --git a/sid/component/gdb/gdb.cxx b/sid/component/gdb/gdb.cxx index 5e34e39da8..72d9d96b5c 100644 --- a/sid/component/gdb/gdb.cxx +++ b/sid/component/gdb/gdb.cxx @@ -620,23 +620,28 @@ gdb::process_get_mem (struct gdbserv_reg *reg_addr, } host_int_4 addr = addr8; // truncate - if (len==1 && e==endian_big) - read_bus_word (gdbserv, memory, addr, big_int_1()); - else if (len==1 && e==endian_little) - read_bus_word (gdbserv, memory, addr, little_int_1()); - else if (len==2 && e==endian_big) - read_bus_word (gdbserv, memory, addr, big_int_2()); - else if (len==2 && e==endian_little) - read_bus_word (gdbserv, memory, addr, little_int_2()); - else if (len==4 && e==endian_big) - read_bus_word (gdbserv, memory, addr, big_int_4()); - else if (len==4 && e==endian_little) - read_bus_word (gdbserv, memory, addr, little_int_4()); - else if (len==8 && e==endian_big) - read_bus_word (gdbserv, memory, addr, big_int_8()); - else if (len==8 && e==endian_little) - read_bus_word (gdbserv, memory, addr, little_int_8()); - else if (e==endian_little) + if (addr % len == 0) + { + if (len==1 && e==endian_big) + { read_bus_word (gdbserv, memory, addr, big_int_1()); return; } + if (len==1 && e==endian_little) + { read_bus_word (gdbserv, memory, addr, little_int_1()); return; } + if (len==2 && e==endian_big) + { read_bus_word (gdbserv, memory, addr, big_int_2()); return; } + if (len==2 && e==endian_little) + { read_bus_word (gdbserv, memory, addr, little_int_2()); return; } + if (len==4 && e==endian_big) + { read_bus_word (gdbserv, memory, addr, big_int_4()); return; } + if (len==4 && e==endian_little) + { read_bus_word (gdbserv, memory, addr, little_int_4()); return; } + if (len==8 && e==endian_big) + { read_bus_word (gdbserv, memory, addr, big_int_8()); return; } + if (len==8 && e==endian_little) + { read_bus_word (gdbserv, memory, addr, little_int_8()); return; } + } + + // Unaligned access or unsupported size. + if (e==endian_little) { for (unsigned long i=0; i