From 833d919c93d52644173d587a6fc8e4dd36edc49e Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 20 Mar 2020 10:16:28 +1030 Subject: [PATCH] PowerPC disassembly of odd sized sections We shouldn't really decode a 2-byte left-over at the end of a section as if the section contains two more bytes of zeros. Not that it matters very much, but this patch tidies the corner case. * ppc-dis.c (print_insn_powerpc): Only clear needed bytes of partially filled buffer. Prevent lookup of 4-byte insns when only VLE 2-byte insns are possible due to section size. Print ".word" rather than ".long" for 2-byte leftovers. --- opcodes/ChangeLog | 7 +++++++ opcodes/ppc-dis.c | 28 ++++++++++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 3e947367e21..98f5d54bb3e 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2020-03-20 Alan Modra + + * ppc-dis.c (print_insn_powerpc): Only clear needed bytes of + partially filled buffer. Prevent lookup of 4-byte insns when + only VLE 2-byte insns are possible due to section size. Print + ".word" rather than ".long" for 2-byte leftovers. + 2020-03-17 Sergey Belyashov PR 25641 diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index a735fbb5a9a..b437fafa374 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -750,8 +750,9 @@ print_insn_powerpc (bfd_vma memaddr, if (status != 0 && (dialect & PPC_OPCODE_VLE) != 0) { /* Clear buffer so unused bytes will not have garbage in them. */ - buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0; + buffer[2] = buffer[3] = 0; status = (*info->read_memory_func) (memaddr, buffer, 2, info); + insn_length = 2; } if (status != 0) @@ -801,12 +802,15 @@ print_insn_powerpc (bfd_vma memaddr, insn_length = 2; } } - if (opcode == NULL && (dialect & PPC_OPCODE_SPE2) != 0) - opcode = lookup_spe2 (insn); - if (opcode == NULL) - opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY); - if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0) - opcode = lookup_powerpc (insn, dialect); + if (opcode == NULL && insn_length == 4) + { + if ((dialect & PPC_OPCODE_SPE2) != 0) + opcode = lookup_spe2 (insn); + if (opcode == NULL) + opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY); + if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0) + opcode = lookup_powerpc (insn, dialect); + } if (opcode != NULL) { @@ -918,9 +922,13 @@ print_insn_powerpc (bfd_vma memaddr, } /* We could not find a match. */ - (*info->fprintf_func) (info->stream, ".long 0x%" PRIx64, insn); - - return 4; + if (insn_length == 4) + (*info->fprintf_func) (info->stream, ".long 0x%x", + (unsigned int) insn); + else + (*info->fprintf_func) (info->stream, ".word 0x%x", + (unsigned int) insn >> 16); + return insn_length; } const disasm_options_and_args_t * -- 2.30.2