summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2001-09-20 16:29:30 +0000
committerdfr <dfr@FreeBSD.org>2001-09-20 16:29:30 +0000
commitc01c5c49d5ed8d474498f25589fc4d00975542fb (patch)
tree16604a6a8053f0863869eca69cd43f5d81e315f4 /sys/ia64
parenta5681ae482e3c2b5d6ed8a4ea63fcec9e081042c (diff)
downloadFreeBSD-src-c01c5c49d5ed8d474498f25589fc4d00975542fb.zip
FreeBSD-src-c01c5c49d5ed8d474498f25589fc4d00975542fb.tar.gz
The second instruction in an MLX bundle is slot one, not slot two, even
though the actual opcode is stored in the value in slot two.
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/db_disasm.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/ia64/ia64/db_disasm.c b/sys/ia64/ia64/db_disasm.c
index 42bae22..e53a3bc 100644
--- a/sys/ia64/ia64/db_disasm.c
+++ b/sys/ia64/ia64/db_disasm.c
@@ -2831,6 +2831,14 @@ db_disasm(db_addr_t loc, boolean_t altfmt)
loc &= ~15;
db_read_bundle(loc, &b);
+ /*
+ * The uses a Restart Instruction value of one to represent
+ * the L+X slot of an MLX template bundle but the opcode is
+ * actually in slot two.
+ */
+ if ((b.template == 4 || b.template == 5) && slot == 1)
+ slot = 2;
+
if (b.slot[slot] & 63)
db_printf("(p%ld) ", b.slot[slot] & 63);
(prints[b.template][slot])(loc, b.slot[slot], altfmt);
@@ -2839,9 +2847,13 @@ db_disasm(db_addr_t loc, boolean_t altfmt)
else
db_printf("\n");
+ /*
+ * Handle MLX bundles by advancing from slot one to the
+ * following bundle.
+ */
if (b.template == 4 || b.template == 5) {
if (slot == 0)
- loc += 2;
+ loc += 1;
else
loc += 16;
} else {
OpenPOWER on IntegriCloud