| Index: gdb/dcache.c
|
| diff --git a/gdb/dcache.c b/gdb/dcache.c
|
| index 652cfab9e091e86723e2beef7f797bd4d908641e..804d567d1f8a24d9243c0abe4e515095a242e937 100644
|
| --- a/gdb/dcache.c
|
| +++ b/gdb/dcache.c
|
| @@ -1,7 +1,6 @@
|
| /* Caching code for GDB, the GNU debugger.
|
|
|
| - Copyright (C) 1992-1993, 1995-1996, 1998-2001, 2003, 2007-2012 Free
|
| - Software Foundation, Inc.
|
| + Copyright (C) 1992-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -21,9 +20,9 @@
|
| #include "defs.h"
|
| #include "dcache.h"
|
| #include "gdbcmd.h"
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
| #include "gdbcore.h"
|
| -#include "target.h"
|
| +#include "target-dcache.h"
|
| #include "inferior.h"
|
| #include "splay-tree.h"
|
|
|
| @@ -140,8 +139,6 @@ show_dcache_enabled_p (struct ui_file *file, int from_tty,
|
| 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:
|
| @@ -226,9 +223,6 @@ free_block (struct dcache_block *block, void *param)
|
| 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);
|
| @@ -342,15 +336,14 @@ dcache_read_line (DCACHE *dcache, struct dcache_block *db)
|
| len -= reg_len;
|
| continue;
|
| }
|
| -
|
| - res = target_read (¤t_target, TARGET_OBJECT_RAW_MEMORY,
|
| - NULL, myaddr, memaddr, reg_len);
|
| - if (res < reg_len)
|
| +
|
| + res = target_read_raw_memory (memaddr, myaddr, reg_len);
|
| + if (res != 0)
|
| return 0;
|
|
|
| - memaddr += res;
|
| - myaddr += res;
|
| - len -= res;
|
| + memaddr += reg_len;
|
| + myaddr += reg_len;
|
| + len -= reg_len;
|
| }
|
|
|
| return 1;
|
| @@ -469,7 +462,6 @@ dcache_init (void)
|
| dcache->size = 0;
|
| dcache->line_size = dcache_line_size;
|
| dcache->ptid = null_ptid;
|
| - last_cache = dcache;
|
|
|
| return dcache;
|
| }
|
| @@ -558,26 +550,28 @@ dcache_update (DCACHE *dcache, CORE_ADDR memaddr, gdb_byte *myaddr, int len)
|
| 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)
|
| @@ -589,21 +583,23 @@ dcache_print_line (int index)
|
| db = (struct dcache_block *) n->value;
|
|
|
| printf_filtered (_("Line %d: address %s [%d hits]\n"),
|
| - index, paddress (target_gdbarch, db->addr), db->refs);
|
| + 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;
|
| @@ -619,27 +615,27 @@ dcache_info (char *exp, int tty)
|
| 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)
|
| @@ -647,17 +643,23 @@ dcache_info (char *exp, int tty)
|
| struct dcache_block *db = (struct dcache_block *) n->value;
|
|
|
| printf_filtered (_("Line %d: address %s [%d hits]\n"),
|
| - i, paddress (target_gdbarch, db->addr), db->refs);
|
| + i, paddress (target_gdbarch (), db->addr), db->refs);
|
| 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)
|
| {
|
| @@ -666,8 +668,7 @@ set_dcache_size (char *args, int from_tty,
|
| 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
|
| @@ -681,8 +682,7 @@ set_dcache_line_size (char *args, int from_tty,
|
| 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
|
| @@ -728,20 +728,20 @@ Use this command to set number of lines in dcache and line-size."),
|
| Show dcachesettings."),
|
| &dcache_show_list, "show dcache ", /*allow_unknown*/0, &showlist);
|
|
|
| - add_setshow_uinteger_cmd ("line-size", class_obscure,
|
| - &dcache_line_size, _("\
|
| + add_setshow_zuinteger_cmd ("line-size", class_obscure,
|
| + &dcache_line_size, _("\
|
| Set dcache line size in bytes (must be power of 2)."), _("\
|
| Show dcache line size."),
|
| - NULL,
|
| - set_dcache_line_size,
|
| - NULL,
|
| - &dcache_set_list, &dcache_show_list);
|
| - add_setshow_uinteger_cmd ("size", class_obscure,
|
| - &dcache_size, _("\
|
| + NULL,
|
| + set_dcache_line_size,
|
| + NULL,
|
| + &dcache_set_list, &dcache_show_list);
|
| + add_setshow_zuinteger_cmd ("size", class_obscure,
|
| + &dcache_size, _("\
|
| Set number of dcache lines."), _("\
|
| Show number of dcache lines."),
|
| - NULL,
|
| - set_dcache_size,
|
| - NULL,
|
| - &dcache_set_list, &dcache_show_list);
|
| + NULL,
|
| + set_dcache_size,
|
| + NULL,
|
| + &dcache_set_list, &dcache_show_list);
|
| }
|
|
|