summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Snyder <msnyder@specifix.com>2005-06-03 14:42:06 +0000
committerMichael Snyder <msnyder@specifix.com>2005-06-03 14:42:06 +0000
commit7750a5fb55ef5bcbe430172600e715342ce99035 (patch)
treecba83de50ff77a30d7a66eee57f646e05ce42d9d
parentc50ff3c21ec3ac7732cbf7278504dfe1aa5a31d1 (diff)
downloadgdb-7750a5fb55ef5bcbe430172600e715342ce99035.tar.gz
2005-05-12 Michael Snyder <msnyder@redhat.com>
* target.c (target_read_memory_trusted): New function. Implements 'trust-readonly-section'. (target_read_partial): Honor trust-readonly-section. (target_read_memory_partial): Ditto. (target_read_memory): Ditto. (do_xfer_memory): Ditto.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/target.c83
2 files changed, 67 insertions, 25 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index db70c67f0dc..0380c536e7f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2005-05-12 Michael Snyder <msnyder@redhat.com>
+
+ * target.c (target_read_memory_trusted): New function.
+ Implements 'trust-readonly-section'.
+ (target_read_partial): Honor trust-readonly-section.
+ (target_read_memory_partial): Ditto.
+ (target_read_memory): Ditto.
+ (do_xfer_memory): Ditto.
+
2005-06-03 Michael Snyder <msnyder@redhat.com>
* defs.h (noisy_command, quiet_command): New command types
diff --git a/gdb/target.c b/gdb/target.c
index dfe942775c9..a3894a2ad52 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -845,6 +845,40 @@ target_section_by_addr (struct target_ops *target, CORE_ADDR addr)
return NULL;
}
+static int trust_readonly = 0;
+static void
+show_trust_readonly (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file,
+ _("Mode for reading from readonly sections is %s.\n"),
+ value);
+}
+
+/* If trust-readonly-sections, and if MEMADDR is within a
+ read-only section, read LEN bytes from the bfd at MEMADDR,
+ placing the results in GDB's memory at MYADDR. Returns
+ the number of bytes read. */
+
+static int
+target_read_memory_trusted (CORE_ADDR memaddr, char *myaddr, int len)
+{
+ struct section_table *secp;
+ /* User-settable option, 'trust-readonly-sections'. If true,
+ then memory from any SEC_READONLY bfd section may be read
+ directly from the bfd file. */
+ if (trust_readonly)
+ {
+ secp = target_section_by_addr (&current_target, memaddr);
+ if (secp != NULL
+ && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section)
+ & SEC_READONLY))
+ return xfer_memory (memaddr, myaddr, len, 0, NULL, &current_target);
+ }
+
+ return 0;
+}
+
/* Return non-zero when the target vector has supplied an xfer_partial
method and it, rather than xfer_memory, should be used. */
static int
@@ -999,6 +1033,12 @@ xfer_using_stratum (enum target_object object, const char *annex,
int
target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
{
+ int ret;
+
+ /* Honor 'trust-readonly-sections' if set. */
+ if ((ret = target_read_memory_trusted (memaddr, myaddr, len)) > 0)
+ return (ret != len);
+
if (target_xfer_partial_p ())
return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL,
memaddr, len, myaddr, NULL);
@@ -1033,16 +1073,6 @@ target_stopped_data_address_p (struct target_ops *target)
}
#endif
-static int trust_readonly = 0;
-static void
-show_trust_readonly (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
-{
- fprintf_filtered (file, _("\
-Mode for reading from readonly sections is %s.\n"),
- value);
-}
-
/* Move memory to or from the targets. The top target gets priority;
if it cannot handle it, it is offered to the next one down, etc.
@@ -1060,23 +1090,15 @@ do_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
if (len == 0)
return 0;
+ /* Honor 'trust-readonly-sections' if set. */
+ if (!write &&
+ (res = target_read_memory_trusted (memaddr, myaddr, len)) > 0)
+ return res;
+
/* deprecated_xfer_memory is not guaranteed to set errno, even when
it returns 0. */
errno = 0;
- if (!write && trust_readonly)
- {
- struct section_table *secp;
- /* User-settable option, "trust-readonly-sections". If true,
- then memory from any SEC_READONLY bfd section may be read
- directly from the bfd file. */
- secp = target_section_by_addr (&current_target, memaddr);
- if (secp != NULL
- && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section)
- & SEC_READONLY))
- return xfer_memory (memaddr, myaddr, len, 0, attrib, &current_target);
- }
-
/* The quick case is that the top target can handle the transfer. */
res = current_target.deprecated_xfer_memory
(memaddr, myaddr, len, write, attrib, &current_target);
@@ -1244,10 +1266,14 @@ target_xfer_memory_partial (CORE_ADDR memaddr, char *myaddr, int len,
int
target_read_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
{
+ int retval;
+
+ /* Honor 'trust-readonly-sections' if set. */
+ if ((retval = target_read_memory_trusted (memaddr, buf, len)) > 0)
+ return retval;
+
if (target_xfer_partial_p ())
{
- int retval;
-
retval = target_xfer_partial (target_stack, TARGET_OBJECT_MEMORY,
NULL, buf, NULL, memaddr, len);
@@ -1351,6 +1377,13 @@ target_read_partial (struct target_ops *ops,
const char *annex, gdb_byte *buf,
ULONGEST offset, LONGEST len)
{
+ int ret;
+
+ /* Honor 'trust-readonly-sections' if set. */
+ if (object == TARGET_OBJECT_MEMORY)
+ if ((ret = target_read_memory_trusted (offset, buf, len)) > 0)
+ return ret;
+
return target_xfer_partial (ops, object, annex, buf, NULL, offset, len);
}