Skip to content

Instantly share code, notes, and snippets.

@xrg
Last active February 13, 2026 17:12
Show Gist options
  • Select an option

  • Save xrg/88a26eb322eb2fa8884be888b514755f to your computer and use it in GitHub Desktop.

Select an option

Save xrg/88a26eb322eb2fa8884be888b514755f to your computer and use it in GitHub Desktop.
#! /usr/bin/env python3
from __future__ import annotations
import argparse
import os
import os.path
from collections import defaultdict
from prettytable import PrettyTable
FIRMWARE_BASE = "/sys/firmware/memmap"
def oread(mdir: str, entry: str) -> str:
with open(f"{FIRMWARE_BASE}/{mdir}/{entry}", "rt") as fp:
return fp.read().strip()
def pretty_size(s: int):
if isinstance(s, str):
s = int(s, 16)
s = float(s)
e = 0
suffs = ('', 'k', 'M', 'G', 'T', 'P')
while s > 1000:
s = s / 1024
e += 1
return f"{s:.2f} {suffs[e]}B"
def main():
table = PrettyTable()
table.align = "l"
table.field_names = ('Id', "Type", "Start", "End", "Size")
by_name = defaultdict(int)
entry_keys = os.listdir(FIRMWARE_BASE)
entry_keys.sort(key=lambda x: int(x))
for memt in entry_keys:
mtype = oread(memt, "type")
mstart = oread(memt, "start")
mend = oread(memt, "end")
try:
size = int(mend, 16) - int(mstart, 16)
by_name[mtype] += size
psize = pretty_size(size)
except (ValueError, IndexError) as e:
print(f"Can't compute size: {e}")
size = 0
row = [int(memt), mtype, mstart, mend, psize]
table.add_row(row)
table.add_divider()
for mtype, size in by_name.items():
table.add_row(["", mtype, "", "", pretty_size(size)])
print(table)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment