xref: /llvm-project/lldb/test/API/functionalities/postmortem/FreeBSDKernel/tools/copy-sparse.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
19c7fbc3fSMichał Górny#!/usr/bin/env python
29c7fbc3fSMichał Górny
39c7fbc3fSMichał Górnyimport argparse
49c7fbc3fSMichał Górnyimport re
59c7fbc3fSMichał Górnyimport sys
69c7fbc3fSMichał Górny
79c7fbc3fSMichał Górny
89c7fbc3fSMichał Górnydef main():
99c7fbc3fSMichał Górny    argp = argparse.ArgumentParser()
10*2238dcc3SJonas Devlieghere    argp.add_argument("infile", type=argparse.FileType("rb"), help="Input vmcore file")
11*2238dcc3SJonas Devlieghere    argp.add_argument(
12*2238dcc3SJonas Devlieghere        "outfile", type=argparse.FileType("wb"), help="Output vmcore file"
13*2238dcc3SJonas Devlieghere    )
149c7fbc3fSMichał Górny    args = argp.parse_args()
159c7fbc3fSMichał Górny
169c7fbc3fSMichał Górny    inf = args.infile
179c7fbc3fSMichał Górny    outf = args.outfile
189c7fbc3fSMichał Górny    line_re = re.compile(r"^% RD: (\d+) (\d+)")
199c7fbc3fSMichał Górny
209c7fbc3fSMichał Górny    # copy the first chunk that usually includes ELF headers
219c7fbc3fSMichał Górny    # (not output by patched libfbsdvmcore since libelf reads this)
229c7fbc3fSMichał Górny    outf.write(inf.read(1024))
239c7fbc3fSMichał Górny
249c7fbc3fSMichał Górny    for l in sys.stdin:
259c7fbc3fSMichał Górny        m = line_re.match(l)
269b1d27b2SMichał Górny        if m is None:
279b1d27b2SMichał Górny            continue
289c7fbc3fSMichał Górny        offset, size = [int(x) for x in m.groups()]
299c7fbc3fSMichał Górny
309c7fbc3fSMichał Górny        inf.seek(offset)
319c7fbc3fSMichał Górny        outf.seek(offset)
329c7fbc3fSMichał Górny        outf.write(inf.read(size))
339c7fbc3fSMichał Górny
349c7fbc3fSMichał Górny
359c7fbc3fSMichał Górnyif __name__ == "__main__":
369c7fbc3fSMichał Górny    main()
37