diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2015-06-12 17:02:44 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2015-06-12 17:03:19 -0400 |
commit | d309493c38fcef624f6f85aee4aa37f4f9e3e62a (patch) | |
tree | ba4610e81e6553b93f5d75bd9b54962b421b2acf /gdb/target.c | |
parent | 3374165f51fa3cc3ce1b1bf8c72293464da9d511 (diff) | |
download | gdb-d309493c38fcef624f6f85aee4aa37f4f9e3e62a.zip gdb-d309493c38fcef624f6f85aee4aa37f4f9e3e62a.tar.gz gdb-d309493c38fcef624f6f85aee4aa37f4f9e3e62a.tar.bz2 |
target: consider addressable unit size when reading/writing memory
If we are reading/writing from a memory object, the length represents
the number of "addresses" to read/write, so the addressable unit size
needs to be taken into account when allocating memory on gdb's side.
gdb/ChangeLog:
* target.c (target_read): Consider addressable unit size when
reading from a memory object.
(read_memory_robust): Same.
(read_whatever_is_readable): Same.
(target_write_with_progress): Consider addressable unit size
when writing to a memory object.
* target.h (target_read): Update documentation.
(target_write): Add documentation.
Diffstat (limited to 'gdb/target.c')
-rw-r--r-- | gdb/target.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/gdb/target.c b/gdb/target.c index dd2393a..4e2d005 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -1593,6 +1593,15 @@ target_read (struct target_ops *ops, ULONGEST offset, LONGEST len) { LONGEST xfered_total = 0; + int unit_size = 1; + + /* If we are reading from a memory object, find the length of an addressable + unit for that architecture. */ + if (object == TARGET_OBJECT_MEMORY + || object == TARGET_OBJECT_STACK_MEMORY + || object == TARGET_OBJECT_CODE_MEMORY + || object == TARGET_OBJECT_RAW_MEMORY) + unit_size = gdbarch_addressable_memory_unit_size (target_gdbarch ()); while (xfered_total < len) { @@ -1600,7 +1609,7 @@ target_read (struct target_ops *ops, enum target_xfer_status status; status = target_read_partial (ops, object, annex, - buf + xfered_total, + buf + xfered_total * unit_size, offset + xfered_total, len - xfered_total, &xfered_partial); @@ -1643,6 +1652,7 @@ target_read (struct target_ops *ops, static void read_whatever_is_readable (struct target_ops *ops, const ULONGEST begin, const ULONGEST end, + int unit_size, VEC(memory_read_result_s) **result) { gdb_byte *buf = xmalloc (end - begin); @@ -1709,7 +1719,7 @@ read_whatever_is_readable (struct target_ops *ops, } xfer = target_read (ops, TARGET_OBJECT_MEMORY, NULL, - buf + (first_half_begin - begin), + buf + (first_half_begin - begin) * unit_size, first_half_begin, first_half_end - first_half_begin); @@ -1745,8 +1755,9 @@ read_whatever_is_readable (struct target_ops *ops, /* The [current_end, end) range has been read. */ LONGEST region_len = end - current_end; - r.data = xmalloc (region_len); - memcpy (r.data, buf + current_end - begin, region_len); + r.data = xmalloc (region_len * unit_size); + memcpy (r.data, buf + (current_end - begin) * unit_size, + region_len * unit_size); r.begin = current_end; r.end = end; xfree (buf); @@ -1773,6 +1784,7 @@ read_memory_robust (struct target_ops *ops, const ULONGEST offset, const LONGEST len) { VEC(memory_read_result_s) *result = 0; + int unit_size = gdbarch_addressable_memory_unit_size (target_gdbarch ()); LONGEST xfered_total = 0; while (xfered_total < len) @@ -1798,7 +1810,7 @@ read_memory_robust (struct target_ops *ops, else { LONGEST to_read = min (len - xfered_total, region_len); - gdb_byte *buffer = (gdb_byte *)xmalloc (to_read); + gdb_byte *buffer = (gdb_byte *) xmalloc (to_read * unit_size); LONGEST xfered_partial = target_read (ops, TARGET_OBJECT_MEMORY, NULL, @@ -1810,7 +1822,7 @@ read_memory_robust (struct target_ops *ops, /* Got an error reading full chunk. See if maybe we can read some subrange. */ xfree (buffer); - read_whatever_is_readable (ops, offset + xfered_total, + read_whatever_is_readable (ops, offset + xfered_total, unit_size, offset + xfered_total + to_read, &result); xfered_total += to_read; } @@ -1840,6 +1852,15 @@ target_write_with_progress (struct target_ops *ops, void (*progress) (ULONGEST, void *), void *baton) { LONGEST xfered_total = 0; + int unit_size = 1; + + /* If we are writing to a memory object, find the length of an addressable + unit for that architecture. */ + if (object == TARGET_OBJECT_MEMORY + || object == TARGET_OBJECT_STACK_MEMORY + || object == TARGET_OBJECT_CODE_MEMORY + || object == TARGET_OBJECT_RAW_MEMORY) + unit_size = gdbarch_addressable_memory_unit_size (target_gdbarch ()); /* Give the progress callback a chance to set up. */ if (progress) @@ -1851,7 +1872,7 @@ target_write_with_progress (struct target_ops *ops, enum target_xfer_status status; status = target_write_partial (ops, object, annex, - (gdb_byte *) buf + xfered_total, + buf + xfered_total * unit_size, offset + xfered_total, len - xfered_total, &xfered_partial); |