summaryrefslogtreecommitdiffstats
path: root/tools/guest-diag/wall2/kc_dump_fn.py
blob: e481d24185c4d75f196355432453c7d082d6cead (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import struct, sys
VA = int(sys.argv[1], 16)
N = int(sys.argv[2], 16) if len(sys.argv) > 2 else 0x800
f = open("/proc/kcore","rb")
hdr = f.read(64)
e_phoff = struct.unpack_from("<Q", hdr, 0x20)[0]
e_phentsize = struct.unpack_from("<H", hdr, 0x36)[0]
e_phnum = struct.unpack_from("<H", hdr, 0x38)[0]
segs = []
for i in range(e_phnum):
    f.seek(e_phoff + i*e_phentsize)
    ph = f.read(e_phentsize)
    p_type, p_flags, p_offset, p_vaddr, p_paddr, p_filesz, p_memsz = struct.unpack_from("<IIQQQQQ", ph, 0)
    if p_type == 1:
        segs.append((p_vaddr, p_memsz, p_offset))
for v, sz, off in segs:
    if v <= VA < v+sz:
        f.seek(off + (VA - v))
        d = f.read(min(N, v+sz-VA))
        sys.stdout.write(d.hex())
        break