xref: /linux/tools/tracing/rtla/src/rtla.c (revision 4f77c3462308c62ffe7129cc18b9ac937f44b5a5)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org>
4  */
5 
6 #include <getopt.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <stdio.h>
10 
11 #include "osnoise.h"
12 #include "timerlat.h"
13 
14 /*
15  * rtla_usage - print rtla usage
16  */
17 static void rtla_usage(int err)
18 {
19 	int i;
20 
21 	static const char *msg[] = {
22 		"",
23 		"rtla version " VERSION,
24 		"",
25 		"  usage: rtla COMMAND ...",
26 		"",
27 		"  commands:",
28 		"     osnoise  - gives information about the operating system noise (osnoise)",
29 		"     hwnoise  - gives information about hardware-related noise",
30 		"     timerlat - measures the timer irq and thread latency",
31 		"",
32 		NULL,
33 	};
34 
35 	for (i = 0; msg[i]; i++)
36 		fprintf(stderr, "%s\n", msg[i]);
37 	exit(err);
38 }
39 
40 /*
41  * run_command - try to run a rtla tool command
42  *
43  * It returns 0 if it fails. The tool's main will generally not
44  * return as they should call exit().
45  */
46 int run_command(int argc, char **argv, int start_position)
47 {
48 	if (strcmp(argv[start_position], "osnoise") == 0) {
49 		osnoise_main(argc-start_position, &argv[start_position]);
50 		goto ran;
51 	} else if (strcmp(argv[start_position], "hwnoise") == 0) {
52 		hwnoise_main(argc-start_position, &argv[start_position]);
53 		goto ran;
54 	} else if (strcmp(argv[start_position], "timerlat") == 0) {
55 		timerlat_main(argc-start_position, &argv[start_position]);
56 		goto ran;
57 	}
58 
59 	return 0;
60 ran:
61 	return 1;
62 }
63 
64 int main(int argc, char *argv[])
65 {
66 	int retval;
67 
68 	/* is it an alias? */
69 	retval = run_command(argc, argv, 0);
70 	if (retval)
71 		exit(0);
72 
73 	if (argc < 2)
74 		goto usage;
75 
76 	if (strcmp(argv[1], "-h") == 0) {
77 		rtla_usage(0);
78 	} else if (strcmp(argv[1], "--help") == 0) {
79 		rtla_usage(0);
80 	}
81 
82 	retval = run_command(argc, argv, 1);
83 	if (retval)
84 		exit(0);
85 
86 usage:
87 	rtla_usage(1);
88 	exit(1);
89 }
90