162306a36Sopenharmony_ci#!/bin/awk -f 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci# Usage: objdump -d a.out | awk -f objdump_reformat.awk | ./insn_decoder_test 462306a36Sopenharmony_ci# Reformats the disassembly as follows: 562306a36Sopenharmony_ci# - Removes all lines except the disassembled instructions. 662306a36Sopenharmony_ci# - For instructions that exceed 1 line (7 bytes), crams all the hex bytes 762306a36Sopenharmony_ci# into a single line. 862306a36Sopenharmony_ci# - Remove bad(or prefix only) instructions 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciBEGIN { 1162306a36Sopenharmony_ci prev_addr = "" 1262306a36Sopenharmony_ci prev_hex = "" 1362306a36Sopenharmony_ci prev_mnemonic = "" 1462306a36Sopenharmony_ci bad_expr = "(\\(bad\\)|^rex|^.byte|^rep(z|nz)$|^lock$|^es$|^cs$|^ss$|^ds$|^fs$|^gs$|^data(16|32)$|^addr(16|32|64))" 1562306a36Sopenharmony_ci fwait_expr = "^9b " 1662306a36Sopenharmony_ci fwait_str="9b\tfwait" 1762306a36Sopenharmony_ci} 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/^ *[0-9a-f]+ <[^>]*>:/ { 2062306a36Sopenharmony_ci # Symbol entry 2162306a36Sopenharmony_ci printf("%s%s\n", $2, $1) 2262306a36Sopenharmony_ci} 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/^ *[0-9a-f]+:/ { 2562306a36Sopenharmony_ci if (split($0, field, "\t") < 3) { 2662306a36Sopenharmony_ci # This is a continuation of the same insn. 2762306a36Sopenharmony_ci prev_hex = prev_hex field[2] 2862306a36Sopenharmony_ci } else { 2962306a36Sopenharmony_ci # Skip bad instructions 3062306a36Sopenharmony_ci if (match(prev_mnemonic, bad_expr)) 3162306a36Sopenharmony_ci prev_addr = "" 3262306a36Sopenharmony_ci # Split fwait from other f* instructions 3362306a36Sopenharmony_ci if (match(prev_hex, fwait_expr) && prev_mnemonic != "fwait") { 3462306a36Sopenharmony_ci printf "%s\t%s\n", prev_addr, fwait_str 3562306a36Sopenharmony_ci sub(fwait_expr, "", prev_hex) 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci if (prev_addr != "") 3862306a36Sopenharmony_ci printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic 3962306a36Sopenharmony_ci prev_addr = field[1] 4062306a36Sopenharmony_ci prev_hex = field[2] 4162306a36Sopenharmony_ci prev_mnemonic = field[3] 4262306a36Sopenharmony_ci } 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciEND { 4662306a36Sopenharmony_ci if (prev_addr != "") 4762306a36Sopenharmony_ci printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic 4862306a36Sopenharmony_ci} 49