diff options
author | dfr <dfr@FreeBSD.org> | 2001-09-20 16:29:30 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2001-09-20 16:29:30 +0000 |
commit | c01c5c49d5ed8d474498f25589fc4d00975542fb (patch) | |
tree | 16604a6a8053f0863869eca69cd43f5d81e315f4 /sys/ia64 | |
parent | a5681ae482e3c2b5d6ed8a4ea63fcec9e081042c (diff) | |
download | FreeBSD-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.c | 14 |
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 { |