summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog31
-rw-r--r--gdb/dcache.c141
-rw-r--r--gdb/monitor.c6
-rw-r--r--gdb/ocd.c4
-rw-r--r--gdb/remote-adapt.c4
-rw-r--r--gdb/remote-array.c4
-rw-r--r--gdb/remote-e7000.c4
-rw-r--r--gdb/remote-eb.c4
-rw-r--r--gdb/remote-mips.c8
-rw-r--r--gdb/remote-nrom.c5
-rw-r--r--gdb/remote-os9k.c4
-rw-r--r--gdb/remote-sds.c4
-rw-r--r--gdb/remote-st.c4
-rw-r--r--gdb/remote-utils.c4
-rw-r--r--gdb/remote.c4
-rw-r--r--gdb/tracepoint.c2
16 files changed, 149 insertions, 84 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8fff846aa44..1040d557d90 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,34 @@
+2000-08-31 J.T. Conklin <jtc@redback.com>
+
+ * dcache.c (dcache_info): Output a cache line's state vector so it
+ lines up under the data vector.
+
+ * dcache.c (dcache_read_line): New function.
+ (dcache_peek_byte): Use it.
+ (dcache_alloc): Return NULL if write of reclaimed cache line fails.
+ (dcache_peek_byte, dcache_poke_byte): Return failure if
+ dcache_alloc() returns a NULL data block pointer.
+ (dcache_xfer_memory): Don't force writeback unless we were writing.
+
+ * monitor.c (monitor_expect): Change places where immediate_quit
+ is set to 1 or 0 to increments and decrements respectively. This
+ allows such changes to nest properly.
+ * ocd.c (ocd_start_remote): Likewise.
+ * remote-adapt.c (expect): Likewise.
+ * remote-array.c (expect): Likewise.
+ * remote-eb.c (expect): Likewise.
+ * remote-e7000.c (e7000_start_remote): Likewise.
+ * remote-mips.c (mips_expect_timeout, mips_getstring): Likewise.
+ * remote-nrom.c (expect): Likewise.
+ * remote-os9k.c (expect): Likewise.
+ * remote-sds.c (sds_start_remote): Likewise.
+ * remote-st.c (expect): Likewise.
+ * remote-utils.c (sr_expect): Likewise.
+ * remote.c (remote_start_remote): Likewise.
+ * tracepoint.c (read_actions): Likewise.
+
+ * remote-mips.c (mips_getstring): Balance changes to immediate_quit.
+
2000-08-31 David Anderson <davea@sgi.com>
* MAINTAINERS: Add myself to write-after-approval list.
diff --git a/gdb/dcache.c b/gdb/dcache.c
index a563d8bff97..46255d9c7ab 100644
--- a/gdb/dcache.c
+++ b/gdb/dcache.c
@@ -149,17 +149,19 @@ struct dcache_struct
int cache_has_stuff;
};
-static int dcache_poke_byte (DCACHE * dcache, CORE_ADDR addr, char *ptr);
+static int dcache_poke_byte (DCACHE *dcache, CORE_ADDR addr, char *ptr);
-static int dcache_peek_byte (DCACHE * dcache, CORE_ADDR addr, char *ptr);
+static int dcache_peek_byte (DCACHE *dcache, CORE_ADDR addr, char *ptr);
-static struct dcache_block *dcache_hit (DCACHE * dcache, CORE_ADDR addr);
+static struct dcache_block *dcache_hit (DCACHE *dcache, CORE_ADDR addr);
-static int dcache_write_line (DCACHE * dcache, struct dcache_block *db);
+static int dcache_write_line (DCACHE *dcache, struct dcache_block *db);
-static struct dcache_block *dcache_alloc (DCACHE * dcache, CORE_ADDR addr);
+static int dcache_read_line (DCACHE *dcache, struct dcache_block *db);
-static int dcache_writeback (DCACHE * dcache);
+static struct dcache_block *dcache_alloc (DCACHE *dcache, CORE_ADDR addr);
+
+static int dcache_writeback (DCACHE *dcache);
static void dcache_info (char *exp, int tty);
@@ -231,7 +233,7 @@ dcache_write_line (DCACHE *dcache, register struct dcache_block *db)
{
int s;
int e;
- s = 0;
+
if (db->anydirty)
{
for (s = 0; s < LINE_SIZE; s++)
@@ -266,6 +268,44 @@ dcache_write_line (DCACHE *dcache, register struct dcache_block *db)
}
+/* Read cache line */
+static int
+dcache_read_line (DCACHE *dcache, struct dcache_block *db)
+{
+ CORE_ADDR memaddr;
+ char *myaddr;
+ int len;
+ int res;
+
+ /* If there are any dirty bytes in the line, it must be written
+ before a new line can be read */
+ if (db->anydirty)
+ {
+ if (!dcache_write_line (dcache, db))
+ return 0;
+ }
+
+ len = LINE_SIZE;
+ memaddr = db->addr;
+ myaddr = db->data;
+
+ while (len > 0)
+ {
+ res = (*dcache->read_memory) (memaddr, myaddr, len);
+ if (res == 0)
+ return 0;
+
+ memaddr += res;
+ myaddr += res;
+ len -= res;
+ }
+
+ memset (db->state, ENTRY_OK, sizeof (db->data));
+ db->anydirty = 0;
+
+ return 1;
+}
+
/* Get a free cache block, put or keep it on the valid list,
and return its address. */
@@ -287,9 +327,11 @@ dcache_alloc (DCACHE *dcache, CORE_ADDR addr)
{
/* Nothing left on free list, so grab one from the valid list */
db = dcache->valid_head;
- dcache->valid_head = db->p;
- dcache_write_line (dcache, db);
+ if (!dcache_write_line (dcache, db))
+ return NULL;
+
+ dcache->valid_head = db->p;
}
db->addr = MASK(addr);
@@ -308,48 +350,6 @@ dcache_alloc (DCACHE *dcache, CORE_ADDR addr)
return db;
}
-/* Using the data cache DCACHE return the contents of the byte at
- address ADDR in the remote machine.
-
- Returns 0 on error. */
-
-static int
-dcache_peek_byte (DCACHE *dcache, CORE_ADDR addr, char *ptr)
-{
- register struct dcache_block *db = dcache_hit (dcache, addr);
- int ok = 1;
- int done = 0;
- if (db == 0
- || db->state[XFORM (addr)] == ENTRY_BAD)
- {
- if (db)
- {
- dcache_write_line (dcache, db);
- }
- else
- db = dcache_alloc (dcache, addr);
-
- immediate_quit++;
- while (done < LINE_SIZE)
- {
- int try =
- (*dcache->read_memory)
- (db->addr + done,
- db->data + done,
- LINE_SIZE - done);
- if (try == 0)
- return 0;
- done += try;
- }
- immediate_quit--;
-
- memset (db->state, ENTRY_OK, sizeof (db->data));
- db->anydirty = 0;
- }
- *ptr = db->data[XFORM (addr)];
- return ok;
-}
-
/* Writeback any dirty lines to the remote. */
static int
dcache_writeback (DCACHE *dcache)
@@ -368,6 +368,34 @@ dcache_writeback (DCACHE *dcache)
}
+/* Using the data cache DCACHE return the contents of the byte at
+ address ADDR in the remote machine.
+
+ Returns 0 on error. */
+
+static int
+dcache_peek_byte (DCACHE *dcache, CORE_ADDR addr, char *ptr)
+{
+ register struct dcache_block *db = dcache_hit (dcache, addr);
+
+ if (!db)
+ {
+ db = dcache_alloc (dcache, addr);
+ if (!db)
+ return 0;
+ }
+
+ if (db->state[XFORM (addr)] == ENTRY_BAD)
+ {
+ if (!dcache_read_line(dcache, db))
+ return 0;
+ }
+
+ *ptr = db->data[XFORM (addr)];
+ return 1;
+}
+
+
/* Write the byte at PTR into ADDR in the data cache.
Return zero on write error.
*/
@@ -380,6 +408,8 @@ dcache_poke_byte (DCACHE *dcache, CORE_ADDR addr, char *ptr)
if (!db)
{
db = dcache_alloc (dcache, addr);
+ if (!db)
+ return 0;
}
db->data[XFORM (addr)] = *ptr;
@@ -435,7 +465,7 @@ dcache_xfer_memory (DCACHE *dcache, CORE_ADDR memaddr, char *myaddr, int len,
if (dcache_enabled_p)
{
- int (*xfunc) (DCACHE * dcache, CORE_ADDR addr, char *ptr);
+ int (*xfunc) (DCACHE *dcache, CORE_ADDR addr, char *ptr);
xfunc = should_write ? dcache_poke_byte : dcache_peek_byte;
for (i = 0; i < len; i++)
@@ -443,8 +473,11 @@ dcache_xfer_memory (DCACHE *dcache, CORE_ADDR memaddr, char *myaddr, int len,
if (!xfunc (dcache, memaddr + i, myaddr + i))
return 0;
}
+
+ if (should_write)
+ dcache_writeback (dcache);
+
dcache->cache_has_stuff = 1;
- dcache_writeback (dcache);
}
else
{
@@ -487,7 +520,7 @@ dcache_info (char *exp, int tty)
printf_filtered ("\n");
for (j = 0; j < LINE_SIZE; j++)
- printf_filtered (" %2x", p->state[j]);
+ printf_filtered ("%2x", p->state[j]);
printf_filtered ("\n");
}
}
diff --git a/gdb/monitor.c b/gdb/monitor.c
index ca7dd301529..c5d6da69ae0 100644
--- a/gdb/monitor.c
+++ b/gdb/monitor.c
@@ -521,7 +521,7 @@ monitor_expect (char *string, char *buf, int buflen)
fprintf_unfiltered (gdb_stdlog, "MON Expecting '%s'\n", safe_string);
}
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
if (buf)
@@ -529,7 +529,7 @@ monitor_expect (char *string, char *buf, int buflen)
if (buflen < 2)
{
*buf = '\000';
- immediate_quit = 0;
+ immediate_quit--;
return -1;
}
@@ -549,7 +549,7 @@ monitor_expect (char *string, char *buf, int buflen)
p++;
if (*p == '\0')
{
- immediate_quit = 0;
+ immediate_quit--;
if (buf)
{
diff --git a/gdb/ocd.c b/gdb/ocd.c
index 6dd601e5da1..eb809488024 100644
--- a/gdb/ocd.c
+++ b/gdb/ocd.c
@@ -181,7 +181,7 @@ ocd_start_remote (PTR dummy)
target_type = *(enum ocd_target_type *) dummy;
- immediate_quit = 1; /* Allow user to interrupt it */
+ immediate_quit++; /* Allow user to interrupt it */
SERIAL_SEND_BREAK (ocd_desc); /* Wake up the wiggler */
@@ -243,7 +243,7 @@ ocd_start_remote (PTR dummy)
ocd_error ("OCD_SET_CTL_FLAGS:", error_code);
#endif
- immediate_quit = 0;
+ immediate_quit--;
/* This is really the job of start_remote however, that makes an assumption
that the target is about to print out a status message of some sort. That
diff --git a/gdb/remote-adapt.c b/gdb/remote-adapt.c
index 4e6b70b25db..f5cc1234d2b 100644
--- a/gdb/remote-adapt.c
+++ b/gdb/remote-adapt.c
@@ -201,7 +201,7 @@ expect (char *string)
char *p = string;
fflush (adapt_stream);
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
if (readchar () == *p)
@@ -209,7 +209,7 @@ expect (char *string)
p++;
if (*p == '\0')
{
- immediate_quit = 0;
+ immediate_quit--;
return;
}
}
diff --git a/gdb/remote-array.c b/gdb/remote-array.c
index 47d2833dae0..9c3a9d79cef 100644
--- a/gdb/remote-array.c
+++ b/gdb/remote-array.c
@@ -363,7 +363,7 @@ expect (char *string, int discard)
debuglogs (1, "Expecting \"%s\".", string);
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
c = readchar (timeout);
@@ -373,7 +373,7 @@ expect (char *string, int discard)
{
if (*p == '\0')
{
- immediate_quit = 0;
+ immediate_quit--;
debuglogs (4, "Matched");
return;
}
diff --git a/gdb/remote-e7000.c b/gdb/remote-e7000.c
index 35ce227e44e..ae89e829d2e 100644
--- a/gdb/remote-e7000.c
+++ b/gdb/remote-e7000.c
@@ -569,7 +569,7 @@ e7000_start_remote (void *dummy)
int try;
int quit_trying;
- immediate_quit = 1; /* Allow user to interrupt it */
+ immediate_quit++; /* Allow user to interrupt it */
/* Hello? Are you there? */
sync = 0;
@@ -635,7 +635,7 @@ e7000_start_remote (void *dummy)
puts_e7000debug ("b -\r"); /* Clear breakpoints */
expect_prompt ();
- immediate_quit = 0;
+ immediate_quit--;
/* This is really the job of start_remote however, that makes an assumption
that the target is about to print out a status message of some sort. That
diff --git a/gdb/remote-eb.c b/gdb/remote-eb.c
index c5c33a7c4e8..302e87ef677 100644
--- a/gdb/remote-eb.c
+++ b/gdb/remote-eb.c
@@ -100,7 +100,7 @@ expect (char *string)
{
char *p = string;
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
if (readchar () == *p)
@@ -108,7 +108,7 @@ expect (char *string)
p++;
if (*p == '\0')
{
- immediate_quit = 0;
+ immediate_quit--;
return;
}
}
diff --git a/gdb/remote-mips.c b/gdb/remote-mips.c
index 4366fb8a019..e2faeacc521 100644
--- a/gdb/remote-mips.c
+++ b/gdb/remote-mips.c
@@ -551,7 +551,7 @@ mips_expect_timeout (const char *string, int timeout)
fprintf_unfiltered (gdb_stdlog, "\", got \"");
}
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
int c;
@@ -575,7 +575,7 @@ mips_expect_timeout (const char *string, int timeout)
{
if (*p == '\0')
{
- immediate_quit = 0;
+ immediate_quit--;
if (remote_debug)
fprintf_unfiltered (gdb_stdlog, "\": OK\n");
return 1;
@@ -609,7 +609,7 @@ mips_getstring (char *string, int n)
char *p = string;
int c;
- immediate_quit = 1;
+ immediate_quit++;
while (n > 0)
{
c = SERIAL_READCHAR (mips_desc, 2);
@@ -618,6 +618,7 @@ mips_getstring (char *string, int n)
{
fprintf_unfiltered (gdb_stderr,
"Failed to read %d characters from target (TIMEOUT)\n", n);
+ immediate_quit--;
return 0;
}
@@ -625,6 +626,7 @@ mips_getstring (char *string, int n)
n--;
}
+ immediate_quit--;
return 1;
}
diff --git a/gdb/remote-nrom.c b/gdb/remote-nrom.c
index 49e51c39e4e..86a0718c674 100644
--- a/gdb/remote-nrom.c
+++ b/gdb/remote-nrom.c
@@ -66,7 +66,7 @@ expect (char *string)
char *p = string;
int c;
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
@@ -76,8 +76,7 @@ expect (char *string)
{
if (*p == '\0')
{
- immediate_quit = 0;
-
+ immediate_quit--;
return 0;
}
}
diff --git a/gdb/remote-os9k.c b/gdb/remote-os9k.c
index 53ca13d2762..343c75d0d32 100644
--- a/gdb/remote-os9k.c
+++ b/gdb/remote-os9k.c
@@ -143,7 +143,7 @@ expect (char *string, int discard)
if (sr_get_debug ())
printf ("Expecting \"%s\"\n", string);
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
c = readchar (timeout);
@@ -153,7 +153,7 @@ expect (char *string, int discard)
{
if (*p == '\0')
{
- immediate_quit = 0;
+ immediate_quit--;
if (sr_get_debug ())
printf ("\nMatched\n");
return;
diff --git a/gdb/remote-sds.c b/gdb/remote-sds.c
index 582d46b31c3..f7fbf00fae1 100644
--- a/gdb/remote-sds.c
+++ b/gdb/remote-sds.c
@@ -163,7 +163,7 @@ sds_start_remote (PTR dummy)
char c;
unsigned char buf[200];
- immediate_quit = 1; /* Allow user to interrupt it */
+ immediate_quit++; /* Allow user to interrupt it */
/* Ack any packet which the remote side has already sent. */
SERIAL_WRITE (sds_desc, "{#*\r\n", 5);
@@ -181,7 +181,7 @@ sds_start_remote (PTR dummy)
buf[0] = 0;
sds_send (buf, 1);
- immediate_quit = 0;
+ immediate_quit--;
start_remote (); /* Initialize gdb process mechanisms */
return 1;
diff --git a/gdb/remote-st.c b/gdb/remote-st.c
index 485f9414493..aa00e8fa2e5 100644
--- a/gdb/remote-st.c
+++ b/gdb/remote-st.c
@@ -117,7 +117,7 @@ expect (char *string, int discard)
char *p = string;
int c;
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
c = readchar (timeout);
@@ -125,7 +125,7 @@ expect (char *string, int discard)
{
if (*p == '\0')
{
- immediate_quit = 0;
+ immediate_quit--;
return;
}
}
diff --git a/gdb/remote-utils.c b/gdb/remote-utils.c
index 236a0ec1423..207761299f2 100644
--- a/gdb/remote-utils.c
+++ b/gdb/remote-utils.c
@@ -264,7 +264,7 @@ sr_expect (char *string)
{
char *p = string;
- immediate_quit = 1;
+ immediate_quit++;
while (1)
{
if (sr_readchar () == *p)
@@ -272,7 +272,7 @@ sr_expect (char *string)
p++;
if (*p == '\0')
{
- immediate_quit = 0;
+ immediate_quit--;
return;
}
}
diff --git a/gdb/remote.c b/gdb/remote.c
index 9a6e2f93c05..b58911ce58a 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -1975,7 +1975,7 @@ remote_start_remote_dummy (void *dummy)
static int
remote_start_remote (PTR dummy)
{
- immediate_quit = 1; /* Allow user to interrupt it */
+ immediate_quit++; /* Allow user to interrupt it */
/* Ack any packet which the remote side has already sent. */
SERIAL_WRITE (remote_desc, "+", 1);
@@ -1988,7 +1988,7 @@ remote_start_remote (PTR dummy)
get_offsets (); /* Get text, data & bss offsets */
putpkt ("?"); /* initiate a query from remote machine */
- immediate_quit = 0;
+ immediate_quit--;
return remote_start_remote_dummy (dummy);
}
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 7d8a631458b..02cf5f8d500 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -889,7 +889,7 @@ read_actions (struct tracepoint *t)
if (job_control)
signal (STOP_SIGNAL, SIG_DFL);
#endif
- immediate_quit = 0;
+ immediate_quit--;
discard_cleanups (old_chain);
}