From 5f40e14d768b94f7fdc050aeba5ee62e6a8d5756 Mon Sep 17 00:00:00 2001 From: Jan Stancek Date: Mon, 24 Aug 2015 14:50:15 +0100 Subject: [PATCH] Fix the partial disassembly of a broken three byte instruction at the end of a function. opcodes * i386-dis.c (print_insn): Fix decoding of three byte operands. tests * gas/i386/intel.s: Add test of disassembly of a potential three byte instuction at the end of a function. * gas/i386/intel.d: Update expected disassembly. --- gas/testsuite/ChangeLog | 6 ++++++ gas/testsuite/gas/i386/intel.d | 4 ++++ gas/testsuite/gas/i386/intel.s | 11 +++++++++++ opcodes/ChangeLog | 4 ++++ opcodes/i386-dis.c | 6 ++++-- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 2951966..6b85249 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-08-24 Jan Stancek + + * gas/i386/intel.s: Add test of disassembly of a potential + three byte instuction at the end of a function. + * gas/i386/intel.d: Update expected disassembly. + 2015-08-21 Nick Clifton PR gas/18581 diff --git a/gas/testsuite/gas/i386/intel.d b/gas/testsuite/gas/i386/intel.d index 45a66a5..d10b4f0 100644 --- a/gas/testsuite/gas/i386/intel.d +++ b/gas/testsuite/gas/i386/intel.d @@ -698,4 +698,8 @@ Disassembly of section .text: [ ]*[a-f0-9]+: 0f 4b 90 90 90 90 90 cmovnp -0x6f6f6f70\(%eax\),%edx [ ]*[a-f0-9]+: 66 0f 4a 90 90 90 90 90 cmovp -0x6f6f6f70\(%eax\),%dx [ ]*[a-f0-9]+: 66 0f 4b 90 90 90 90 90 cmovnp -0x6f6f6f70\(%eax\),%dx +[ ]*[a-f0-9]+: 24 2f and \$0x2f,%al +[ ]*[a-f0-9]+: 0f \.byte 0xf +[a-f0-9]+ : +[ ]*[a-f0-9]+: 0f ba e2 03 bt \$0x3,%edx #pass diff --git a/gas/testsuite/gas/i386/intel.s b/gas/testsuite/gas/i386/intel.s index a3a07b3..045d6ae 100644 --- a/gas/testsuite/gas/i386/intel.s +++ b/gas/testsuite/gas/i386/intel.s @@ -698,3 +698,14 @@ fidivr dword ptr [ebx] cmovpo edx, 0x90909090[eax] cmovpe dx, 0x90909090[eax] cmovpo dx, 0x90909090[eax] + + # Test that disassembly of a partial instruction shows the partial byte: + # https://www.sourceware.org/ml/binutils/2015-08/msg00226.html + .byte 0x24 + .byte 0x2f + .byte 0x0f +barn: + .byte 0x0f + .byte 0xba + .byte 0xe2 + .byte 0x03 diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 89e150f..3529dbc 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,7 @@ +2015-08-24 Jan Stancek + + * i386-dis.c (print_insn): Fix decoding of three byte operands. + 2015-08-21 Alexander Fomin PR binutils/18257 diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 055b38f..ae18cf2 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -13438,8 +13438,10 @@ print_insn (bfd_vma pc, disassemble_info *info) if (*codep == 0x0f) { unsigned char threebyte; - FETCH_DATA (info, codep + 2); - threebyte = *++codep; + + codep++; + FETCH_DATA (info, codep + 1); + threebyte = *codep; dp = &dis386_twobyte[threebyte]; need_modrm = twobyte_has_modrm[*codep]; codep++; -- 2.7.4