powerpc/xmon: Improve dumping prefixed instructions
authorJordan Niethe <jniethe5@gmail.com>
Tue, 2 Jun 2020 05:27:26 +0000 (15:27 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 23 Jul 2020 07:41:59 +0000 (17:41 +1000)
Currently prefixed instructions are dumped as two separate word
instructions. Use mread_instr() so that prefixed instructions are read
as such and update the incrementor in the loop to take this into
account.

'dump_func' is print_insn_powerpc() which comes from ppc-dis.c which is
taken from binutils. When this is updated prefixed instructions will be
disassembled.

Currently dumping prefixed instructions looks like this:
0:mon> di c000000000094168
c000000000094168  0x06000000    .long 0x6000000
c00000000009416c  0x392a0003    addi    r9,r10,3
c000000000094170  0x913f0028    stw     r9,40(r31)
c000000000094174  0xe93f002a    lwa     r9,40(r31)
c000000000094178  0x7d234b78    mr      r3,r9
c00000000009417c  0x383f0040    addi    r1,r31,64
c000000000094180  0xebe1fff8    ld      r31,-8(r1)
c000000000094184  0x4e800020    blr
c000000000094188  0x60000000    nop
 ...
c000000000094190  0x3c4c0121    addis   r2,r12,289
c000000000094194  0x38429670    addi    r2,r2,-27024
c000000000094198  0x7c0802a6    mflr    r0
c00000000009419c  0x60000000    nop
c0000000000941a0  0xe9240100    ld      r9,256(r4)
c0000000000941a4  0x39400001    li      r10,1

After this it looks like:
0:mon> di c000000000094168
c000000000094168  0x06000000 0x392a0003 .long 0x392a000306000000
c000000000094170  0x913f0028    stw     r9,40(r31)
c000000000094174  0xe93f002a    lwa     r9,40(r31)
c000000000094178  0x7d234b78    mr      r3,r9
c00000000009417c  0x383f0040    addi    r1,r31,64
c000000000094180  0xebe1fff8    ld      r31,-8(r1)
c000000000094184  0x4e800020    blr
c000000000094188  0x60000000    nop
 ...
c000000000094190  0x3c4c0121    addis   r2,r12,289
c000000000094194  0x38429570    addi    r2,r2,-27280
c000000000094198  0x7c0802a6    mflr    r0
c00000000009419c  0x60000000    nop
c0000000000941a0  0xe9240100    ld      r9,256(r4)
c0000000000941a4  0x39400001    li      r10,1
c0000000000941a8  0x3d02000b    addis   r8,r2,11

Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200602052728.18227-2-jniethe5@gmail.com
arch/powerpc/xmon/xmon.c

index 8df83a7..1a240b4 100644 (file)
@@ -2954,11 +2954,10 @@ generic_inst_dump(unsigned long adr, long count, int praddr,
        int nr, dotted;
        unsigned long first_adr;
        struct ppc_inst inst, last_inst = ppc_inst(0);
-       unsigned char val[4];
 
        dotted = 0;
-       for (first_adr = adr; count > 0; --count, adr += 4) {
-               nr = mread(adr, val, 4);
+       for (first_adr = adr; count > 0; --count, adr += ppc_inst_len(inst)) {
+               nr = mread_instr(adr, &inst);
                if (nr == 0) {
                        if (praddr) {
                                const char *x = fault_chars[fault_type];
@@ -2966,7 +2965,6 @@ generic_inst_dump(unsigned long adr, long count, int praddr,
                        }
                        break;
                }
-               inst = ppc_inst(GETWORD(val));
                if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
                        if (!dotted) {
                                printf(" ...\n");
@@ -2979,7 +2977,10 @@ generic_inst_dump(unsigned long adr, long count, int praddr,
                if (praddr)
                        printf(REG"  %s", adr, ppc_inst_as_str(inst));
                printf("\t");
-               dump_func(ppc_inst_val(inst), adr);
+               if (!ppc_inst_prefixed(inst))
+                       dump_func(ppc_inst_val(inst), adr);
+               else
+                       dump_func(ppc_inst_as_u64(inst), adr);
                printf("\n");
        }
        return adr - first_adr;