aboutsummaryrefslogtreecommitdiff
path: root/gdb/target.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/target.c')
-rw-r--r--gdb/target.c47
1 files changed, 38 insertions, 9 deletions
diff --git a/gdb/target.c b/gdb/target.c
index 52d1081..cb75853 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -238,12 +238,42 @@ show_stack_cache_enabled_p (struct ui_file *file, int from_tty,
/* Cache of memory operations, to speed up remote access. */
static DCACHE *target_dcache;
+/* Target dcache is initialized or not. */
+
+static int
+target_dcache_init_p (void)
+{
+ return (target_dcache != NULL);
+}
+
/* Invalidate the target dcache. */
void
target_dcache_invalidate (void)
{
- dcache_invalidate (target_dcache);
+ if (target_dcache_init_p ())
+ dcache_invalidate (target_dcache);
+}
+
+/* Return the target dcache. Return NULL if target dcache is not
+ initialized yet. */
+
+DCACHE *
+target_dcache_get (void)
+{
+ return target_dcache;
+}
+
+/* Return the target dcache. If it is not initialized yet, initialize
+ it. */
+
+static DCACHE *
+target_dcache_get_or_init (void)
+{
+ if (!target_dcache_init_p ())
+ target_dcache = dcache_init ();
+
+ return target_dcache;
}
/* The user just typed 'target' without the name of a target. */
@@ -1588,15 +1618,15 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object,
&& (region->attrib.cache
|| (stack_cache_enabled_p && object == TARGET_OBJECT_STACK_MEMORY)))
{
+ DCACHE *dcache = target_dcache_get_or_init ();
+
if (readbuf != NULL)
- res = dcache_xfer_memory (ops, target_dcache, memaddr, readbuf,
- reg_len, 0);
+ res = dcache_xfer_memory (ops, dcache, memaddr, readbuf, reg_len, 0);
else
/* FIXME drow/2006-08-09: If we're going to preserve const
correctness dcache_xfer_memory should take readbuf and
writebuf. */
- res = dcache_xfer_memory (ops, target_dcache, memaddr,
- (void *) writebuf,
+ res = dcache_xfer_memory (ops, dcache, memaddr, (void *) writebuf,
reg_len, 1);
if (res <= 0)
return -1;
@@ -1641,7 +1671,9 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object,
&& stack_cache_enabled_p
&& object != TARGET_OBJECT_STACK_MEMORY)
{
- dcache_update (target_dcache, memaddr, (void *) writebuf, res);
+ DCACHE *dcache = target_dcache_get_or_init ();
+
+ dcache_update (dcache, memaddr, (void *) writebuf, res);
}
/* If we still haven't got anything, return the last error. We
@@ -5193,7 +5225,4 @@ When this permission is on, GDB may interrupt/stop the target's execution.\n\
Otherwise, any attempt to interrupt or stop will be ignored."),
set_target_permissions, NULL,
&setlist, &showlist);
-
-
- target_dcache = dcache_init ();
}