aboutsummaryrefslogtreecommitdiff
path: root/gdb/exec.c
diff options
context:
space:
mode:
authorYao Qi <yao@codesourcery.com>2014-02-11 12:20:05 +0800
committerYao Qi <yao@codesourcery.com>2014-02-23 11:44:27 +0800
commit1ee79381dd9cc2438a61fe4a96294682744d2458 (patch)
treecacc74d2ed737ebef23b92e7688f1974b2a0012b /gdb/exec.c
parent1ca49d376dec6a93e879bc9456617622d7e349b3 (diff)
Use new to_xfer_partial interface in ctf and tfile target
This patch adjust both ctf and tfile target implementation of to_xfer_partial, to return TARGET_XFER_E_UNAVAILABLE and set *XFERED_LEN if data is unavailable. Note that some code on xfer in exec.c can be shared, but we can do it in a separate pass later. gdb: 2014-02-23 Yao Qi <yao@codesourcery.com> * exec.c (section_table_read_available_memory): New function. * exec.h (section_table_read_available_memory): Declare. * ctf.c (ctf_xfer_partial): Call section_table_read_available_memory. * tracefile-tfile.c (tfile_xfer_partial): Likewise.
Diffstat (limited to 'gdb/exec.c')
-rw-r--r--gdb/exec.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/gdb/exec.c b/gdb/exec.c
index 74c61eb810..607f5acc14 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -615,6 +615,60 @@ section_table_available_memory (VEC(mem_range_s) *memory,
}
enum target_xfer_status
+section_table_read_available_memory (gdb_byte *readbuf, ULONGEST offset,
+ ULONGEST len, ULONGEST *xfered_len)
+{
+ VEC(mem_range_s) *available_memory = NULL;
+ struct target_section_table *table;
+ struct cleanup *old_chain;
+ mem_range_s *r;
+ int i;
+
+ table = target_get_section_table (&exec_ops);
+ available_memory = section_table_available_memory (available_memory,
+ offset, len,
+ table->sections,
+ table->sections_end);
+
+ old_chain = make_cleanup (VEC_cleanup(mem_range_s),
+ &available_memory);
+
+ normalize_mem_ranges (available_memory);
+
+ for (i = 0;
+ VEC_iterate (mem_range_s, available_memory, i, r);
+ i++)
+ {
+ if (mem_ranges_overlap (r->start, r->length, offset, len))
+ {
+ CORE_ADDR end;
+ enum target_xfer_status status;
+
+ /* Get the intersection window. */
+ end = min (offset + len, r->start + r->length);
+
+ gdb_assert (end - offset <= len);
+
+ if (offset >= r->start)
+ status = exec_read_partial_read_only (readbuf, offset,
+ end - offset,
+ xfered_len);
+ else
+ {
+ *xfered_len = r->start - offset;
+ status = TARGET_XFER_E_UNAVAILABLE;
+ }
+ do_cleanups (old_chain);
+ return status;
+ }
+ }
+ do_cleanups (old_chain);
+
+ *xfered_len = len;
+ return TARGET_XFER_E_UNAVAILABLE;
+}
+
+enum target_xfer_status
section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf,
ULONGEST offset, ULONGEST len,
ULONGEST *xfered_len,