[PATCH v2 08/15] MIPS: Mask off lowest bit when disassembling compressed code.
Jovan Dmitrovic
jovan.dmitrovic@htecgroup.com
Wed Oct 29 14:09:36 GMT 2025
From: Simon Dardis <simon.dardis@imgtec.com>
Signed-off-by: Jovan Dmitrović <jovan.dmitrovic@htecgroup.com>
opcodes/ChangeLog:
* mips-dis.c (print_insn_mips16, print_insn_micromips): Don't
disassemble from odd addresses in mips16 and microMIPS mode.
---
opcodes/mips-dis.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c
index 8ab2c736203..d246eef3917 100644
--- a/opcodes/mips-dis.c
+++ b/opcodes/mips-dis.c
@@ -2305,7 +2305,7 @@ enum match_kind
/* Disassemble mips16 instructions. */
static int
-print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
+print_insn_mips16 (bfd_vma memaddr_base, struct disassemble_info *info)
{
const fprintf_styled_ftype infprintf = info->fprintf_styled_func;
int status;
@@ -2319,6 +2319,10 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
unsigned int first;
unsigned int full;
+ /* Some users of bfd may supply an address with the MIPS16 flag set,
+ e.g. objdump. MIPS16 instructions must be at least 2 byte aligned. */
+ bfd_vma memaddr = memaddr_base & ~1;
+
info->bytes_per_chunk = 2;
info->display_endian = info->endian;
info->insn_info_valid = 1;
@@ -2533,7 +2537,7 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
/* Disassemble microMIPS instructions. */
static int
-print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+print_insn_micromips (bfd_vma memaddr_base, struct disassemble_info *info)
{
const fprintf_styled_ftype infprintf = info->fprintf_styled_func;
const struct mips_opcode *op, *opend;
@@ -2544,6 +2548,10 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
int status;
unsigned int insn;
+ /* Some users of bfd may supply an address with the micromips flag set,
+ e.g. objdump. microMIPS instructions must be at least 2 byte aligned. */
+ bfd_vma memaddr = memaddr_base & ~1;
+
info->bytes_per_chunk = 2;
info->display_endian = info->endian;
info->insn_info_valid = 1;
--
2.34.1
More information about the Binutils
mailing list