3 # b43 firmware state dumper
5 # Copyright (C) 2008 Michael Buesch <mb@bu3sch.de>
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License version 3
9 # as published by the Free Software Foundation.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
22 from sys import stdout
23 from tempfile import *
27 print "b43 firmware state dumper"
29 print "Copyright (C) 2008 Michael Buesch <mb@bu3sch.de>"
30 print "Licensed under the GNU/GPL version 3"
32 print "Usage: b43-fwdump [OPTIONS]"
34 print "-h|--help Print this help text"
35 print "-p|--phy PHY The PHY to use. For example phy0"
36 print "-b|--binary BIN The firmware binary. This is required for"
37 print " an instruction dump."
38 print "-d|--dasmopt OPT Additional options to the disassembler."
39 print "-s|--shm Also dump SHM."
40 print "-S|--shmbin Do a binary SHM dump, only."
50 phy = None # Autodetect
51 binary = None # No instruction dump
57 (opts, args) = getopt.getopt(sys.argv[1:],
59 [ "help", "phy=", "binary=", "dasmopt=", "shm", "shmbin" ])
60 except getopt.GetoptError:
65 if o in ("-h", "--help"):
68 if o in ("-p", "--phy"):
70 if o in ("-b", "--binary"):
72 if o in ("-d", "--dasmopt"):
74 if o in ("-s", "--shm"):
76 if o in ("-S", "--shmbin"):
81 def dump_regs(prefix, regs):
83 template = "%s%02u: %04X "
85 template = "%s%01u: %04X "
86 for i in range(0, len(regs)):
87 if i != 0 and i % 4 == 0:
89 stdout.write(template % (prefix, i, regs[i]))
93 def disassembleText(text):
94 input = NamedTemporaryFile()
95 output = NamedTemporaryFile()
99 os.system("b43-dasm %s %s %s --paddr" % (input.name, dasmopt, output.name))
103 def makeShortDump(dasm, pc):
104 dasm = dasm.splitlines()
107 if "/* %03X */" % pc in line:
111 return "<Could not find PC in the binary>"
114 end = min(i + 8, len(dasm) - 1)
117 if "/* %03X */" % pc in dasm[pos]:
118 ret += "\t\t<<<<<<<<<<<"
124 if char >= 32 and char <= 126:
133 # Fetch the hardware information
136 lr = b43.getLinkRegs()
137 off = b43.getOffsetRegs()
138 if dumpShm or dumpShmBin:
139 shm = b43.shmSharedRead()
140 dbg = b43.getPsmDebug()
141 psmcond = b43.getPsmConditions()
145 # Only do a binary SHM dump
149 print "--- B43 microcode state dump ---"
150 print "PC: %03X PSM-COND: %04X" % (dbg.getPc(), psmcond)
151 print "Link registers:"
153 print "Offset registers:"
154 dump_regs("off", off)
155 print "General purpose registers:"
161 bintext = file(binary, "r").read()
163 print "Could not read binary file %s: %s" % (binary, e.strerror)
165 dasm = disassembleText(bintext)
166 print makeShortDump(dasm, dbg.getPc())
168 print "<No binary supplied. See --binary option>"
171 print "Shared memory:"
173 for i in range(0, len(shm)):
174 if i % 16 == 0 and i != 0:
175 stdout.write(" " + ascii + "\n")
178 stdout.write("0x%04X: " % i)
180 stdout.write("%02X" % c)
184 stdout.write(" " + ascii + "\n")