aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2008-08-07 21:25:28 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2008-08-07 21:25:28 +0000
commit12ab8a602f4ebb83654346ccbcf63df58a7497f8 (patch)
tree765ac789ebfb59b24844c866599bfa49d018d51b
parentd35fd65983caac22b1204d4c0d79f5b9eabb1286 (diff)
downloadgdb-12ab8a602f4ebb83654346ccbcf63df58a7497f8.zip
gdb-12ab8a602f4ebb83654346ccbcf63df58a7497f8.tar.gz
gdb-12ab8a602f4ebb83654346ccbcf63df58a7497f8.tar.bz2
ChangeLog:
* spu-tdep.c (info_spu_dma_cmdlist): Only show entries with the valid bit set. Ensure display order respects partial order defined by dependency bits. testsuite/ChangeLog: * gdb.arch/spu-info.exp: Updated for "info spu dma" changes.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/spu-tdep.c46
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.arch/spu-info.exp8
4 files changed, 54 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5e4b8cf..2be158e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2008-08-07 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * spu-tdep.c (info_spu_dma_cmdlist): Only show entries with
+ the valid bit set. Ensure display order respects partial
+ order defined by dependency bits.
+
2008-08-06 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* solib-pa64.c (read_dld_descriptor): Return zero if load map is not
diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
index 8198835..64c7051 100644
--- a/gdb/spu-tdep.c
+++ b/gdb/spu-tdep.c
@@ -1742,8 +1742,44 @@ info_spu_dma_cmdlist (gdb_byte *buf, int nr)
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
};
+ int *seq = alloca (nr * sizeof (int));
+ int done = 0;
struct cleanup *chain;
- int i;
+ int i, j;
+
+
+ /* Determine sequence in which to display (valid) entries. */
+ for (i = 0; i < nr; i++)
+ {
+ /* Search for the first valid entry all of whose
+ dependencies are met. */
+ for (j = 0; j < nr; j++)
+ {
+ ULONGEST mfc_cq_dw3;
+ ULONGEST dependencies;
+
+ if (done & (1 << (nr - 1 - j)))
+ continue;
+
+ mfc_cq_dw3 = extract_unsigned_integer (buf + 32*j + 24, 8);
+ if (!spu_mfc_get_bitfield (mfc_cq_dw3, 16, 16))
+ continue;
+
+ dependencies = spu_mfc_get_bitfield (mfc_cq_dw3, 0, nr - 1);
+ if ((dependencies & done) != dependencies)
+ continue;
+
+ seq[i] = j;
+ done |= 1 << (nr - 1 - j);
+ break;
+ }
+
+ if (j == nr)
+ break;
+ }
+
+ nr = i;
+
chain = make_cleanup_ui_out_table_begin_end (uiout, 10, nr, "dma_cmd");
@@ -1766,7 +1802,6 @@ info_spu_dma_cmdlist (gdb_byte *buf, int nr)
ULONGEST mfc_cq_dw0;
ULONGEST mfc_cq_dw1;
ULONGEST mfc_cq_dw2;
- ULONGEST mfc_cq_dw3;
int mfc_cmd_opcode, mfc_cmd_tag, rclass_id, tclass_id;
int lsa, size, list_lsa, list_size, mfc_lsa, mfc_size;
ULONGEST mfc_ea;
@@ -1775,10 +1810,9 @@ info_spu_dma_cmdlist (gdb_byte *buf, int nr)
/* Decode contents of MFC Command Queue Context Save/Restore Registers.
See "Cell Broadband Engine Registers V1.3", section 3.3.2.1. */
- mfc_cq_dw0 = extract_unsigned_integer (buf + 32*i, 8);
- mfc_cq_dw1 = extract_unsigned_integer (buf + 32*i + 8, 8);
- mfc_cq_dw2 = extract_unsigned_integer (buf + 32*i + 16, 8);
- mfc_cq_dw3 = extract_unsigned_integer (buf + 32*i + 24, 8);
+ mfc_cq_dw0 = extract_unsigned_integer (buf + 32*seq[i], 8);
+ mfc_cq_dw1 = extract_unsigned_integer (buf + 32*seq[i] + 8, 8);
+ mfc_cq_dw2 = extract_unsigned_integer (buf + 32*seq[i] + 16, 8);
list_lsa = spu_mfc_get_bitfield (mfc_cq_dw0, 0, 14);
list_size = spu_mfc_get_bitfield (mfc_cq_dw0, 15, 26);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 204eb8a..28046a9 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2008-08-07 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+
+ * gdb.arch/spu-info.exp: Updated for "info spu dma" changes.
+
2008-08-06 Tom Tromey <tromey@redhat.com>
* gdb.python/python.exp: New file.
diff --git a/gdb/testsuite/gdb.arch/spu-info.exp b/gdb/testsuite/gdb.arch/spu-info.exp
index e59b071..265b21d 100644
--- a/gdb/testsuite/gdb.arch/spu-info.exp
+++ b/gdb/testsuite/gdb.arch/spu-info.exp
@@ -106,12 +106,12 @@ gdb_test "info spu mailbox" \
# 'info spu dma'.
gdb_test "info spu dma" \
- "Tag-Group Status.*Tag-Group Mask.*Stall-and-Notify .*Atomic Cmd Status.*Opcode.*Tag.*TId.*RId.*EA.*LSA.*Size.*LstAddr.*LstSize.*E.*" \
+ "Tag-Group Status.*Tag-Group Mask.*Stall-and-Notify .*Atomic Cmd Status.*" \
"info spu dma"
# 'info spu proxydma'.
gdb_test "info spu proxydma" \
- "Tag-Group Status.*Tag-Group Mask.*Opcode.*Tag.*TId.*RId.*EA.*LSA.*Size.*LstAddr.*LstSize.*E.*" \
+ "Tag-Group Status.*Tag-Group Mask.*" \
"info spu proxydma"
# Event tests.
@@ -186,14 +186,14 @@ gdb_test "info spu event" \
# 'info spu dma' should be empty.
c_to "Marker DMA"
gdb_test "info spu dma" \
- "Tag-Group Status.*0x00000000.*Tag-Group Mask.*0x00000000.*Stall-and-Notify.*0x00000000.*Atomic Cmd Status.*0x00000000.*Opcode.*Tag.*TId.*RId.*EA.*LSA.*Size.*LstAddr.*LstSize.*E.*0.*0.*0.*0.*0x00000 0x00000.*" \
+ "Tag-Group Status.*0x00000000.*Tag-Group Mask.*0x00000000.*Stall-and-Notify.*0x00000000.*Atomic Cmd Status.*0x00000000\[\r\n\]+" \
"info spu dma (empty)"
# 'info spu dma' should be filled with some data.
c_to "Marker DMAWait"
gdb_test "next" "" "next"
gdb_test "info spu dma" \
- "Tag-Group Status.*0x00000000.*Tag-Group Mask.*0x00000020.*Stall-and-Notify.*0x00000000.*Atomic Cmd Status.*0x00000000.*Opcode.*Tag.*TId.*RId.*EA.*LSA.*Size.*LstAddr.*LstSize.*E.*getl.*putllc.*get.*mfcsync.*get.*0.*0.*0.*0.*0x00000 0x00000.*" \
+ "Tag-Group Status.*0x00000000.*Tag-Group Mask.*0x00000020.*Stall-and-Notify.*0x00000000.*Atomic Cmd Status.*0x00000000.*Opcode.*Tag.*TId.*RId.*EA.*LSA.*Size.*LstAddr.*LstSize.*E.*get.*5.*0.*0.*0x00080\[ \r\n\]+" \
"info spu dma (non-empty)"
gdb_test "finish" "" "finish"