powerpc/xmon: Improve dumping prefixed instructions
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
This commit is contained in:
committed by
Michael Ellerman
parent
50428fdc53
commit
8b98afc117
@@ -2954,11 +2954,10 @@ generic_inst_dump(unsigned long adr, long count, int praddr,
|
|||||||
int nr, dotted;
|
int nr, dotted;
|
||||||
unsigned long first_adr;
|
unsigned long first_adr;
|
||||||
struct ppc_inst inst, last_inst = ppc_inst(0);
|
struct ppc_inst inst, last_inst = ppc_inst(0);
|
||||||
unsigned char val[4];
|
|
||||||
|
|
||||||
dotted = 0;
|
dotted = 0;
|
||||||
for (first_adr = adr; count > 0; --count, adr += 4) {
|
for (first_adr = adr; count > 0; --count, adr += ppc_inst_len(inst)) {
|
||||||
nr = mread(adr, val, 4);
|
nr = mread_instr(adr, &inst);
|
||||||
if (nr == 0) {
|
if (nr == 0) {
|
||||||
if (praddr) {
|
if (praddr) {
|
||||||
const char *x = fault_chars[fault_type];
|
const char *x = fault_chars[fault_type];
|
||||||
@@ -2966,7 +2965,6 @@ generic_inst_dump(unsigned long adr, long count, int praddr,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
inst = ppc_inst(GETWORD(val));
|
|
||||||
if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
|
if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
|
||||||
if (!dotted) {
|
if (!dotted) {
|
||||||
printf(" ...\n");
|
printf(" ...\n");
|
||||||
@@ -2979,7 +2977,10 @@ generic_inst_dump(unsigned long adr, long count, int praddr,
|
|||||||
if (praddr)
|
if (praddr)
|
||||||
printf(REG" %s", adr, ppc_inst_as_str(inst));
|
printf(REG" %s", adr, ppc_inst_as_str(inst));
|
||||||
printf("\t");
|
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");
|
printf("\n");
|
||||||
}
|
}
|
||||||
return adr - first_adr;
|
return adr - first_adr;
|
||||||
|
|||||||
Reference in New Issue
Block a user