AArch64 EL2 hypervisor for QEMU virt that boots at EL2
1#!/usr/bin/env python3
2from __future__ import annotations
3
4import argparse
5from collections import Counter
6import shlex
7import sys
8
9
10def parse(line: str) -> dict[str, str]:
11 parts = shlex.split(line.strip())
12 if not parts or parts[0] != "event":
13 return {}
14 out: dict[str, str] = {}
15 for part in parts[1:]:
16 if "=" in part:
17 key, value = part.split("=", 1)
18 out[key] = value
19 return out
20
21
22def emit_event(event: dict[str, str]) -> None:
23 print(
24 "seq={seq} vcpu={vcpu} kind={kind} ec={ec} name={name} "
25 "dir={dir} action={action} reason={reason}".format(
26 seq=event.get("seq", "-"),
27 vcpu=event.get("vcpu", "-"),
28 kind=event.get("kind", "-"),
29 ec=event.get("ec", "-"),
30 name=event.get("name", "-"),
31 dir=event.get("dir", "-"),
32 action=event.get("action", "-"),
33 reason=event.get("reason", "-"),
34 )
35 )
36
37
38def print_counter(title: str, counter: Counter[str]) -> None:
39 print(title)
40 for key, count in counter.most_common():
41 print(f" {key}: {count}")
42
43
44def main() -> int:
45 parser = argparse.ArgumentParser()
46 parser.add_argument("--summary", action="store_true", help="print aggregate trace counters")
47 parser.add_argument("--events", action="store_true", help="print normalized events with --summary")
48 args = parser.parse_args()
49
50 events: list[dict[str, str]] = []
51 for line in sys.stdin:
52 event = parse(line)
53 if not event:
54 continue
55 events.append(event)
56 if not args.summary or args.events:
57 emit_event(event)
58
59 if args.summary:
60 print(f"events: {len(events)}")
61 print_counter("by-kind", Counter(e.get("kind", "-") for e in events))
62 print_counter("by-ec", Counter(e.get("ec", "-") for e in events))
63 print_counter("by-sysreg", Counter(e.get("name", "-") for e in events if e.get("kind") == "trap"))
64 print_counter("by-action", Counter(e.get("action", "-") for e in events))
65 print_counter("by-reason", Counter(e.get("reason", "-") for e in events))
66 return 0
67
68
69if __name__ == "__main__":
70 raise SystemExit(main())