198fe07fcSMasami Hiramatsu#!/bin/awk -f 298fe07fcSMasami Hiramatsu# SPDX-License-Identifier: GPL-2.0 398fe07fcSMasami Hiramatsu# Usage: objdump -d a.out | awk -f objdump_reformat.awk | ./insn_decoder_test 498fe07fcSMasami Hiramatsu# Reformats the disassembly as follows: 598fe07fcSMasami Hiramatsu# - Removes all lines except the disassembled instructions. 698fe07fcSMasami Hiramatsu# - For instructions that exceed 1 line (7 bytes), crams all the hex bytes 798fe07fcSMasami Hiramatsu# into a single line. 898fe07fcSMasami Hiramatsu# - Remove bad(or prefix only) instructions 998fe07fcSMasami Hiramatsu 1098fe07fcSMasami HiramatsuBEGIN { 1198fe07fcSMasami Hiramatsu prev_addr = "" 1298fe07fcSMasami Hiramatsu prev_hex = "" 1398fe07fcSMasami Hiramatsu prev_mnemonic = "" 1498fe07fcSMasami Hiramatsu bad_expr = "(\\(bad\\)|^rex|^.byte|^rep(z|nz)$|^lock$|^es$|^cs$|^ss$|^ds$|^fs$|^gs$|^data(16|32)$|^addr(16|32|64))" 1598fe07fcSMasami Hiramatsu fwait_expr = "^9b " 1698fe07fcSMasami Hiramatsu fwait_str="9b\tfwait" 1798fe07fcSMasami Hiramatsu} 1898fe07fcSMasami Hiramatsu 1998fe07fcSMasami Hiramatsu/^ *[0-9a-f]+ <[^>]*>:/ { 2098fe07fcSMasami Hiramatsu # Symbol entry 2198fe07fcSMasami Hiramatsu printf("%s%s\n", $2, $1) 2298fe07fcSMasami Hiramatsu} 2398fe07fcSMasami Hiramatsu 2498fe07fcSMasami Hiramatsu/^ *[0-9a-f]+:/ { 2598fe07fcSMasami Hiramatsu if (split($0, field, "\t") < 3) { 2698fe07fcSMasami Hiramatsu # This is a continuation of the same insn. 2798fe07fcSMasami Hiramatsu prev_hex = prev_hex field[2] 2898fe07fcSMasami Hiramatsu } else { 2998fe07fcSMasami Hiramatsu # Skip bad instructions 3098fe07fcSMasami Hiramatsu if (match(prev_mnemonic, bad_expr)) 3198fe07fcSMasami Hiramatsu prev_addr = "" 3298fe07fcSMasami Hiramatsu # Split fwait from other f* instructions 3398fe07fcSMasami Hiramatsu if (match(prev_hex, fwait_expr) && prev_mnemonic != "fwait") { 3498fe07fcSMasami Hiramatsu printf "%s\t%s\n", prev_addr, fwait_str 3598fe07fcSMasami Hiramatsu sub(fwait_expr, "", prev_hex) 3698fe07fcSMasami Hiramatsu } 3798fe07fcSMasami Hiramatsu if (prev_addr != "") 3898fe07fcSMasami Hiramatsu printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic 3998fe07fcSMasami Hiramatsu prev_addr = field[1] 4098fe07fcSMasami Hiramatsu prev_hex = field[2] 4198fe07fcSMasami Hiramatsu prev_mnemonic = field[3] 4298fe07fcSMasami Hiramatsu } 4398fe07fcSMasami Hiramatsu} 4498fe07fcSMasami Hiramatsu 4598fe07fcSMasami HiramatsuEND { 4698fe07fcSMasami Hiramatsu if (prev_addr != "") 4798fe07fcSMasami Hiramatsu printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic 4898fe07fcSMasami Hiramatsu} 49