#!/usr/bin/env python3 # Print the META header and kernel capabilities of a main.npdm (read only). import struct import sys d = open(sys.argv[1], "rb").read() assert d[:4] == b"META" flags = d[0xC] print(f"META flags=0x{flags:02x} is64={flags & 1} address_space_type={(flags >> 1) & 7} " f"prio={d[0xE]} core={d[0xF]} sys_res=0x{struct.unpack_from('> 4 & 0x3F, cap >> 10 & 0x3F cl, ch = cap >> 16 & 0xFF, cap >> 24 print(f" ThreadInfo prio {lo}..{hi} cores {cl}..{ch}") elif t == 4: idx, mask = cap >> 29, cap >> 5 & 0xFFFFFF for b in range(24): if mask >> b & 1: svcs.add(idx * 24 + b) elif t == 6: print(f" MapRange 0x{cap:08x}") elif t == 7: print(f" MapIoPage 0x{cap:08x}") elif t == 10: print(f" MapRegion 0x{cap:08x}") elif t == 11: print(f" EnableInterrupts 0x{cap:08x}") elif t == 13: print(f" ProgramType {cap >> 14 & 7}") elif t == 14: print(f" KernelVersion {cap >> 19 & 0x1FFF}.{cap >> 15 & 0xF}") elif t == 15: print(f" HandleTableSize {cap >> 16 & 0x3FF}") elif t == 16: print(f" DebugFlags 0x{cap:08x}") else: print(f" unknown cap type {t}: 0x{cap:08x}") print("SVCs:", " ".join(f"{s:02x}" for s in sorted(svcs)))