+2013-11-20 Yao Qi <yao@codesourcery.com>
+
+ * dcache.c (last_cache): Remove.
+ (dcache_free, dcache_init): Update.
+ (dcache_update):
+ (dcache_print_line): Add parameter 'dcache'. Replace
+ 'target_dcache' with 'dcache'.
+ (dcache_info): Move code to dcache_info_1. Call
+ 'dcache_info_1'.
+ (dcache_info_1): New function.
+ (set_dcache_size): Call target_dcache_invalidate.
+ (set_dcache_line_size): Call target_dcache_invalidate.
+ * target.c (target_dcache_init_p): New function.
+ (target_dcache_invalidate): Check target_dcache_init_p first.
+ (target_dcache_get, target_dcache_get_or_init): New function.
+ (memory_xfer_partial_1): Adjust.
+ (initialize_target): Don't initialize 'target_dcache'.
+ * target.h (struct dcache_struct): Declare.
+ (target_dcache_get): Declare.
+
2013-11-19 Yao Qi <yao@codesourcery.com>
* varobj.c (varobj_get_type): Fix typo.
fprintf_filtered (file, _("Deprecated remotecache flag is %s.\n"), value);
}
-static DCACHE *last_cache; /* Used by info dcache. */
-
/* Add BLOCK to circular block list BLIST, behind the block at *BLIST.
*BLIST is not updated (unless it was previously NULL of course).
This is for the least-recently-allocated list's sake:
void
dcache_free (DCACHE *dcache)
{
- if (last_cache == dcache)
- last_cache = NULL;
-
splay_tree_delete (dcache->tree);
for_each_block (&dcache->oldest, free_block, NULL);
for_each_block (&dcache->freelist, free_block, NULL);
dcache->size = 0;
dcache->line_size = dcache_line_size;
dcache->ptid = null_ptid;
- last_cache = dcache;
return dcache;
}
dcache_poke_byte (dcache, memaddr + i, myaddr + i);
}
+/* Print DCACHE line INDEX. */
+
static void
-dcache_print_line (int index)
+dcache_print_line (DCACHE *dcache, int index)
{
splay_tree_node n;
struct dcache_block *db;
int i, j;
- if (!last_cache)
+ if (dcache == NULL)
{
printf_filtered (_("No data cache available.\n"));
return;
}
- n = splay_tree_min (last_cache->tree);
+ n = splay_tree_min (dcache->tree);
for (i = index; i > 0; --i)
{
if (!n)
break;
- n = splay_tree_successor (last_cache->tree, n->key);
+ n = splay_tree_successor (dcache->tree, n->key);
}
if (!n)
printf_filtered (_("Line %d: address %s [%d hits]\n"),
index, paddress (target_gdbarch (), db->addr), db->refs);
- for (j = 0; j < last_cache->line_size; j++)
+ for (j = 0; j < dcache->line_size; j++)
{
printf_filtered ("%02x ", db->data[j]);
/* Print a newline every 16 bytes (48 characters). */
- if ((j % 16 == 15) && (j != last_cache->line_size - 1))
+ if ((j % 16 == 15) && (j != dcache->line_size - 1))
printf_filtered ("\n");
}
printf_filtered ("\n");
}
+/* Parse EXP and show the info about DCACHE. */
+
static void
-dcache_info (char *exp, int tty)
+dcache_info_1 (DCACHE *dcache, char *exp)
{
splay_tree_node n;
int i, refcount;
return;
}
- dcache_print_line (i);
+ dcache_print_line (dcache, i);
return;
}
printf_filtered (_("Dcache %u lines of %u bytes each.\n"),
dcache_size,
- last_cache ? (unsigned) last_cache->line_size
+ dcache ? (unsigned) dcache->line_size
: dcache_line_size);
- if (!last_cache || ptid_equal (last_cache->ptid, null_ptid))
+ if (dcache == NULL || ptid_equal (dcache->ptid, null_ptid))
{
printf_filtered (_("No data cache available.\n"));
return;
}
printf_filtered (_("Contains data for %s\n"),
- target_pid_to_str (last_cache->ptid));
+ target_pid_to_str (dcache->ptid));
refcount = 0;
- n = splay_tree_min (last_cache->tree);
+ n = splay_tree_min (dcache->tree);
i = 0;
while (n)
i++;
refcount += db->refs;
- n = splay_tree_successor (last_cache->tree, n->key);
+ n = splay_tree_successor (dcache->tree, n->key);
}
printf_filtered (_("Cache state: %d active lines, %d hits\n"), i, refcount);
}
+static void
+dcache_info (char *exp, int tty)
+{
+ dcache_info_1 (target_dcache_get (), exp);
+}
+
static void
set_dcache_size (char *args, int from_tty,
struct cmd_list_element *c)
dcache_size = DCACHE_DEFAULT_SIZE;
error (_("Dcache size must be greater than 0."));
}
- if (last_cache)
- dcache_invalidate (last_cache);
+ target_dcache_invalidate ();
}
static void
dcache_line_size = DCACHE_DEFAULT_LINE_SIZE;
error (_("Invalid dcache line size: %u (must be power of 2)."), d);
}
- if (last_cache)
- dcache_invalidate (last_cache);
+ target_dcache_invalidate ();
}
static void
/* 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. */
&& (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;
&& 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
Otherwise, any attempt to interrupt or stop will be ignored."),
set_target_permissions, NULL,
&setlist, &showlist);
-
-
- target_dcache = dcache_init ();
}
struct static_tracepoint_marker;
struct traceframe_info;
struct expression;
+struct dcache_struct;
/* This include file defines the interface between the main part
of the debugger, and the part which is target-specific, or
/* Invalidate all target dcaches. */
extern void target_dcache_invalidate (void);
+extern struct dcache_struct *target_dcache_get (void);
+
extern int target_read_string (CORE_ADDR, char **, int, int *);
extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr,