xref: /openbmc/qemu/scripts/disas-objdump.pl (revision 8dc6d24091edc34be1f989a2d92703130760401f)
1*8dc6d240SRichard Henderson#!/usr/bin/perl -w
2*8dc6d240SRichard Henderson
3*8dc6d240SRichard Hendersonuse File::Temp qw/ tempfile /;
4*8dc6d240SRichard Hendersonuse Getopt::Long;
5*8dc6d240SRichard Henderson
6*8dc6d240SRichard Henderson# Default to the system objdump if a cross-compiler edition not given.
7*8dc6d240SRichard Hendersonmy $aobjdump = "objdump";
8*8dc6d240SRichard Hendersonmy $hobjdump = "";
9*8dc6d240SRichard Hendersonmy $tobjdump = "";
10*8dc6d240SRichard Hendersonmy $hmachine = "";
11*8dc6d240SRichard Hendersonmy $tmachine = "";
12*8dc6d240SRichard Henderson
13*8dc6d240SRichard HendersonGetOptions ('O|objdump=s' => \$aobjdump,
14*8dc6d240SRichard Henderson            'host-objdump=s' => \$hobjdump,
15*8dc6d240SRichard Henderson            'target-objdump=s' => \$tobjdump,
16*8dc6d240SRichard Henderson            'h|host-machine=s' => \$hmachine,
17*8dc6d240SRichard Henderson            't|target-machine=s' => \$tmachine);
18*8dc6d240SRichard Henderson
19*8dc6d240SRichard Henderson# But we can't default the machines.  Sanity check that we've at least one.
20*8dc6d240SRichard Hendersondie "No host or target machine type" if !$hmachine && !$tmachine;
21*8dc6d240SRichard Henderson
22*8dc6d240SRichard Henderson# Reuse one temp file for all of the hunks.
23*8dc6d240SRichard Hendersonmy ($outh, $outname) = tempfile();
24*8dc6d240SRichard Hendersonbinmode($outh);
25*8dc6d240SRichard HendersonEND { unlink $outname; }
26*8dc6d240SRichard Henderson
27*8dc6d240SRichard Henderson# Pre-construct the command-lines for executing the dump.
28*8dc6d240SRichard Hendersonsub mkobjcommand ($$) {
29*8dc6d240SRichard Henderson    my ($cmd, $mach) = @_;
30*8dc6d240SRichard Henderson    return 0 if !$mach;
31*8dc6d240SRichard Henderson    $cmd = $aobjdump if !$cmd;
32*8dc6d240SRichard Henderson    return "$cmd -m $mach --disassemble-all -b binary $outname";
33*8dc6d240SRichard Henderson}
34*8dc6d240SRichard Henderson
35*8dc6d240SRichard Henderson$objdump[1] = mkobjcommand($hobjdump, $hmachine);
36*8dc6d240SRichard Henderson$objdump[2] = mkobjcommand($tobjdump, $tmachine);
37*8dc6d240SRichard Henderson
38*8dc6d240SRichard Henderson# Zero-initialize current dumping state.
39*8dc6d240SRichard Hendersonmy $mem = "";
40*8dc6d240SRichard Hendersonmy $inobjd = 0;
41*8dc6d240SRichard Henderson
42*8dc6d240SRichard Hendersonsub objcommand {
43*8dc6d240SRichard Henderson    my $ret = $objdump[$inobjd];
44*8dc6d240SRichard Henderson    if (!$ret) {
45*8dc6d240SRichard Henderson        die "Host machine type not specified" if $inobjd == 1;
46*8dc6d240SRichard Henderson        die "Target machine type not specified" if $inobjd == 2;
47*8dc6d240SRichard Henderson        die "Internal error";
48*8dc6d240SRichard Henderson    }
49*8dc6d240SRichard Henderson    return $ret;
50*8dc6d240SRichard Henderson}
51*8dc6d240SRichard Henderson
52*8dc6d240SRichard Hendersonwhile (<>) {
53*8dc6d240SRichard Henderson    # Collect the data from the relevant OBJD-* lines.
54*8dc6d240SRichard Henderson    if (/^OBJD-H: /) {
55*8dc6d240SRichard Henderson        die "Internal error" if $inobjd == 2;
56*8dc6d240SRichard Henderson        $mem = $mem . pack("H*", substr($_, 8, -1));
57*8dc6d240SRichard Henderson        $inobjd = 1;
58*8dc6d240SRichard Henderson    } elsif (/^OBJD-T: /) {
59*8dc6d240SRichard Henderson        die "Internal error" if $inobjd == 1;
60*8dc6d240SRichard Henderson        $mem = $mem . pack("H*", substr($_, 8, -1));
61*8dc6d240SRichard Henderson        $inobjd = 2;
62*8dc6d240SRichard Henderson    }
63*8dc6d240SRichard Henderson    # ... which will always be followed by a blank line,
64*8dc6d240SRichard Henderson    # at which point we should produce our dump.
65*8dc6d240SRichard Henderson    elsif ($inobjd) {
66*8dc6d240SRichard Henderson        # Rewrite the temp file in one go; it will usually be small.
67*8dc6d240SRichard Henderson        sysseek $outh, 0, 0;
68*8dc6d240SRichard Henderson        truncate $outh, 0;
69*8dc6d240SRichard Henderson        syswrite $outh, $mem;
70*8dc6d240SRichard Henderson
71*8dc6d240SRichard Henderson        # Pipe from objdump...
72*8dc6d240SRichard Henderson        open IN, "-|", objcommand();
73*8dc6d240SRichard Henderson
74*8dc6d240SRichard Henderson        # ... copying all but the first 7 lines of boilerplate to our stdout.
75*8dc6d240SRichard Henderson	my $i = 0;
76*8dc6d240SRichard Henderson	while (<IN>) {
77*8dc6d240SRichard Henderson	    print if (++$i > 7);
78*8dc6d240SRichard Henderson        }
79*8dc6d240SRichard Henderson        close IN;
80*8dc6d240SRichard Henderson        print "\n";
81*8dc6d240SRichard Henderson
82*8dc6d240SRichard Henderson        $mem = "";
83*8dc6d240SRichard Henderson        $inobjd = 0;
84*8dc6d240SRichard Henderson    } else {
85*8dc6d240SRichard Henderson        print;
86*8dc6d240SRichard Henderson    }
87*8dc6d240SRichard Henderson}
88