* monitor.c (monitor_open): If a dcache has already been created,

invalidate it rather than creating another.
* ocd.c (ocd_open): Likewise.
* remote-nindy.c (nindy_open): Likewise.
* remote-sds.c (sds_open): Likewise.
* remote-utils.c (gr_open): Likewise.
* remote.c (remote_open_1, remote_cisco_open): Likewise.

* dcache.c (dcache_alloc): Changed to take address of line as an
argument, and to invalidate cache line before returning.
(dcache_peek_byte): Updated.
(dcache_poke_byte): Updated.
-------------------------------------------------------------------
This commit is contained in:
J.T. Conklin 2000-08-10 18:54:27 +00:00
parent e84d946b3a
commit f1d7622b95
8 changed files with 63 additions and 22 deletions

View File

@ -1,3 +1,18 @@
2000-08-10 J.T. Conklin <jtc@redback.com>
* monitor.c (monitor_open): If a dcache has already been created,
invalidate it rather than creating another.
* ocd.c (ocd_open): Likewise.
* remote-nindy.c (nindy_open): Likewise.
* remote-sds.c (sds_open): Likewise.
* remote-utils.c (gr_open): Likewise.
* remote.c (remote_open_1, remote_cisco_open): Likewise.
* dcache.c (dcache_alloc): Changed to take address of line as an
argument, and to invalidate cache line before returning.
(dcache_peek_byte): Updated.
(dcache_poke_byte): Updated.
2000-08-10 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
From Greg McGary <greg@mcgary.org>:

View File

@ -157,7 +157,7 @@ static struct dcache_block *dcache_hit (DCACHE * dcache, CORE_ADDR addr);
static int dcache_write_line (DCACHE * dcache, struct dcache_block *db);
static struct dcache_block *dcache_alloc (DCACHE * dcache);
static struct dcache_block *dcache_alloc (DCACHE * dcache, CORE_ADDR addr);
static int dcache_writeback (DCACHE * dcache);
@ -267,15 +267,10 @@ dcache_write_line (DCACHE *dcache, register struct dcache_block *db)
/* Get a free cache block, put or keep it on the valid list,
and return its address. The caller should store into the block
the address and data that it describes, then remque it from the
free list and insert it into the valid list. This procedure
prevents errors from creeping in if a memory retrieval is
interrupted (which used to put garbage blocks in the valid
list...). */
and return its address. */
static struct dcache_block *
dcache_alloc (DCACHE *dcache)
dcache_alloc (DCACHE *dcache, CORE_ADDR addr)
{
register struct dcache_block *db;
@ -297,6 +292,11 @@ dcache_alloc (DCACHE *dcache)
dcache_write_line (dcache, db);
}
db->addr = MASK(addr);
db->refs = 0;
db->anydirty = 0;
memset (db->state, ENTRY_BAD, sizeof (db->data));
/* append this line to end of valid list */
if (!dcache->valid_head)
dcache->valid_head = db;
@ -327,9 +327,9 @@ dcache_peek_byte (DCACHE *dcache, CORE_ADDR addr, char *ptr)
dcache_write_line (dcache, db);
}
else
db = dcache_alloc (dcache);
db = dcache_alloc (dcache, addr);
immediate_quit++;
db->addr = MASK (addr);
while (done < LINE_SIZE)
{
int try =
@ -379,9 +379,7 @@ dcache_poke_byte (DCACHE *dcache, CORE_ADDR addr, char *ptr)
if (!db)
{
db = dcache_alloc (dcache);
db->addr = MASK (addr);
memset (db->state, ENTRY_BAD, sizeof (db->data));
db = dcache_alloc (dcache, addr);
}
db->data[XFORM (addr)] = *ptr;

View File

@ -838,10 +838,17 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
monitor_printf (current_monitor->line_term);
if (current_monitor->flags & MO_HAS_BLOCKWRITES)
remote_dcache = dcache_init (monitor_read_memory, monitor_write_memory_block);
if (!remote_dcache)
{
if (current_monitor->flags & MO_HAS_BLOCKWRITES)
remote_dcache = dcache_init (monitor_read_memory,
monitor_write_memory_block);
else
remote_dcache = dcache_init (monitor_read_memory, monitor_write_memory);
}
else
remote_dcache = dcache_init (monitor_read_memory, monitor_write_memory);
dcache_flush (remote_dcache);
start_remote ();
}

View File

@ -292,7 +292,10 @@ device the OCD device is attached to (e.g. /dev/ttya).");
unpush_target (current_ops);
ocd_dcache = dcache_init (ocd_read_bytes, ocd_write_bytes);
if (!ocd_dcache)
ocd_dcache = dcache_init (ocd_read_bytes, ocd_write_bytes);
else
dcache_flush (ocd_dcache);
if (strncmp (name, "wiggler", 7) == 0)
{

View File

@ -187,7 +187,11 @@ nindy_open (char *name, /* "/dev/ttyXX", "ttyXX", or "XX": tty to be opened */
nindy_close (0);
have_regs = regs_changed = 0;
nindy_dcache = dcache_init (ninMemGet, ninMemPut);
if (!nindy_dcache)
nindy_dcache = dcache_init (ninMemGet, ninMemPut);
else
dcache_flush (nindy_dcache);
/* Allow user to interrupt the following -- we could hang if there's
no NINDY at the other end of the remote tty. */

View File

@ -203,7 +203,10 @@ device is attached to the remote system (e.g. /dev/ttya).");
unpush_target (&sds_ops);
sds_dcache = dcache_init (sds_read_bytes, sds_write_bytes);
if (!sds_dcache)
sds_dcache = dcache_init (sds_read_bytes, sds_write_bytes);
else
dcache_flush (sds_dcache);
sds_desc = SERIAL_OPEN (name);
if (!sds_desc)

View File

@ -154,13 +154,18 @@ gr_generic_checkin (void)
void
gr_open (char *args, int from_tty, struct gr_settings *gr)
{
DCACHE *dcache;
target_preopen (from_tty);
sr_scan_args (gr->ops->to_shortname, args);
unpush_target (gr->ops);
gr_settings = gr;
gr_set_dcache (dcache_init (gr->readfunc, gr->writefunc));
if ((dcache = gr_get_dcache()) == NULL)
gr_set_dcache (dcache_init (gr->readfunc, gr->writefunc));
else
dcache_flush (dcache);
if (sr_get_desc () != NULL)
gr_close (0);

View File

@ -2057,7 +2057,10 @@ serial device is attached to the remote system\n\
unpush_target (target);
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
if (!remote_dcache)
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
else
dcache_flush (remote_dcache);
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)
@ -5034,7 +5037,10 @@ device is attached to the remote system (e.g. host:port).");
unpush_target (&remote_cisco_ops);
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
if (!remote_dcache)
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
else
dcache_flush (remote_dcache);
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)