60 lines
1.6 KiB
Plaintext
60 lines
1.6 KiB
Plaintext
|
#!/usr/bin/env python3
|
||
|
import argparse
|
||
|
import os, sys
|
||
|
|
||
|
from lib.dump import decode_dump
|
||
|
|
||
|
|
||
|
def main():
|
||
|
# parse the arguments
|
||
|
ap = argparse.ArgumentParser(description="""
|
||
|
Parse and decode a memory dump obtained from the D2/D21/D23 g-code
|
||
|
into readable metadata and binary. The output binary is padded and
|
||
|
extended to fit the original address range.
|
||
|
""")
|
||
|
ap.add_argument('-i', dest='info', action='store_true',
|
||
|
help='display crash info only')
|
||
|
ap.add_argument('dump')
|
||
|
ap.add_argument('output', nargs='?')
|
||
|
args = ap.parse_args()
|
||
|
|
||
|
# decode the dump data
|
||
|
dump = decode_dump(args.dump)
|
||
|
if dump is None:
|
||
|
return os.EX_DATAERR
|
||
|
|
||
|
# output descriptors
|
||
|
if args.info:
|
||
|
o_fd = None
|
||
|
o_md = sys.stdout
|
||
|
elif args.output is None:
|
||
|
o_fd = sys.stdout.buffer
|
||
|
o_md = sys.stderr
|
||
|
else:
|
||
|
o_fd = open(args.output, 'wb')
|
||
|
o_md = sys.stdout
|
||
|
|
||
|
# output binary
|
||
|
if o_fd:
|
||
|
o_fd.write(dump.data)
|
||
|
o_fd.close()
|
||
|
|
||
|
# metadata
|
||
|
print(' dump type: {typ}\n'
|
||
|
'crash reason: {reason}\n'
|
||
|
' registers: {regs}\n'
|
||
|
' PC: {pc}\n'
|
||
|
' SP: {sp}\n'
|
||
|
' ranges: {ranges}'.format(
|
||
|
typ=dump.typ,
|
||
|
reason=dump.reason.name if dump.reason is not None else 'N/A',
|
||
|
regs=dump.regs,
|
||
|
pc='{:#x}'.format(dump.pc) if dump.pc is not None else 'N/A',
|
||
|
sp='{:#x}'.format(dump.sp) if dump.sp is not None else 'N/A',
|
||
|
ranges=str(dump.ranges)),
|
||
|
file=o_md)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
exit(main())
|