Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#!/usr/bin/env python3
2# SPDX-License-Identifier: GPL-2.0-only
3#
4# Copyright (C) 2019-2022 Red Hat, Inc. Daniel Bristot de Oliveira <bristot@kernel.org>
5#
6# dot2k: transform dot files into a monitor for the Linux kernel.
7#
8# For further information, see:
9# Documentation/trace/rv/da_monitor_synthesis.rst
10
11if __name__ == '__main__':
12 from rvgen.dot2k import da2k, ha2k
13 from rvgen.generator import Monitor
14 from rvgen.container import Container
15 from rvgen.ltl2k import ltl2k
16 from rvgen.automata import AutomataError
17 import argparse
18 import sys
19
20 parser = argparse.ArgumentParser(description='Generate kernel rv monitor')
21 parser.add_argument("-D", "--description", dest="description", required=False)
22 parser.add_argument("-a", "--auto_patch", dest="auto_patch",
23 action="store_true", required=False,
24 help="Patch the kernel in place")
25
26 subparsers = parser.add_subparsers(dest="subcmd", required=True)
27
28 monitor_parser = subparsers.add_parser("monitor")
29 monitor_parser.add_argument('-n', "--model_name", dest="model_name")
30 monitor_parser.add_argument("-p", "--parent", dest="parent",
31 required=False, help="Create a monitor nested to parent")
32 monitor_parser.add_argument('-c', "--class", dest="monitor_class", required=True,
33 help="Monitor class, either \"da\", \"ha\" or \"ltl\"")
34 monitor_parser.add_argument('-s', "--spec", dest="spec", required=True,
35 help="Monitor specification file")
36 monitor_parser.add_argument('-t', "--monitor_type", dest="monitor_type", required=True,
37 help=f"Available options: {', '.join(Monitor.monitor_types.keys())}")
38
39 container_parser = subparsers.add_parser("container")
40 container_parser.add_argument('-n', "--model_name", dest="model_name", required=True)
41
42 params = parser.parse_args()
43
44 try:
45 if params.subcmd == "monitor":
46 print(f"Opening and parsing the specification file {params.spec}")
47 if params.monitor_class == "da":
48 monitor = da2k(params.spec, params.monitor_type, vars(params))
49 elif params.monitor_class == "ha":
50 monitor = ha2k(params.spec, params.monitor_type, vars(params))
51 elif params.monitor_class == "ltl":
52 monitor = ltl2k(params.spec, params.monitor_type, vars(params))
53 else:
54 print("Unknown monitor class:", params.monitor_class)
55 sys.exit(1)
56 else:
57 monitor = Container(vars(params))
58 except AutomataError as e:
59 print(f"There was an error processing {params.spec}: {e}", file=sys.stderr)
60 sys.exit(1)
61
62 print(f"Writing the monitor into the directory {monitor.name}")
63 monitor.print_files()
64 print("Almost done, checklist")
65 if params.subcmd == "monitor":
66 print(f" - Edit the {monitor.name}/{monitor.name}.c to add the instrumentation")
67 print(monitor.fill_tracepoint_tooltip())
68 print(monitor.fill_makefile_tooltip())
69 print(monitor.fill_kconfig_tooltip())
70 print(monitor.fill_monitor_tooltip())