1*4882a593Smuzhiyun#!/bin/awk -f 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# Usage: objdump -d a.out | awk -f objdump_reformat.awk | ./insn_decoder_test 4*4882a593Smuzhiyun# Reformats the disassembly as follows: 5*4882a593Smuzhiyun# - Removes all lines except the disassembled instructions. 6*4882a593Smuzhiyun# - For instructions that exceed 1 line (7 bytes), crams all the hex bytes 7*4882a593Smuzhiyun# into a single line. 8*4882a593Smuzhiyun# - Remove bad(or prefix only) instructions 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunBEGIN { 11*4882a593Smuzhiyun prev_addr = "" 12*4882a593Smuzhiyun prev_hex = "" 13*4882a593Smuzhiyun prev_mnemonic = "" 14*4882a593Smuzhiyun bad_expr = "(\\(bad\\)|^rex|^.byte|^rep(z|nz)$|^lock$|^es$|^cs$|^ss$|^ds$|^fs$|^gs$|^data(16|32)$|^addr(16|32|64))" 15*4882a593Smuzhiyun fwait_expr = "^9b " 16*4882a593Smuzhiyun fwait_str="9b\tfwait" 17*4882a593Smuzhiyun} 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun/^ *[0-9a-f]+ <[^>]*>:/ { 20*4882a593Smuzhiyun # Symbol entry 21*4882a593Smuzhiyun printf("%s%s\n", $2, $1) 22*4882a593Smuzhiyun} 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun/^ *[0-9a-f]+:/ { 25*4882a593Smuzhiyun if (split($0, field, "\t") < 3) { 26*4882a593Smuzhiyun # This is a continuation of the same insn. 27*4882a593Smuzhiyun prev_hex = prev_hex field[2] 28*4882a593Smuzhiyun } else { 29*4882a593Smuzhiyun # Skip bad instructions 30*4882a593Smuzhiyun if (match(prev_mnemonic, bad_expr)) 31*4882a593Smuzhiyun prev_addr = "" 32*4882a593Smuzhiyun # Split fwait from other f* instructions 33*4882a593Smuzhiyun if (match(prev_hex, fwait_expr) && prev_mnemonic != "fwait") { 34*4882a593Smuzhiyun printf "%s\t%s\n", prev_addr, fwait_str 35*4882a593Smuzhiyun sub(fwait_expr, "", prev_hex) 36*4882a593Smuzhiyun } 37*4882a593Smuzhiyun if (prev_addr != "") 38*4882a593Smuzhiyun printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic 39*4882a593Smuzhiyun prev_addr = field[1] 40*4882a593Smuzhiyun prev_hex = field[2] 41*4882a593Smuzhiyun prev_mnemonic = field[3] 42*4882a593Smuzhiyun } 43*4882a593Smuzhiyun} 44*4882a593Smuzhiyun 45*4882a593SmuzhiyunEND { 46*4882a593Smuzhiyun if (prev_addr != "") 47*4882a593Smuzhiyun printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic 48*4882a593Smuzhiyun} 49