xref: /openbmc/linux/tools/objtool/builtin-check.c (revision 1e11f3fdc326d7466e43185ea943b6156143387c)
11ccea77eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2442f04c3SJosh Poimboeuf /*
3dcc914f4SJosh Poimboeuf  * Copyright (C) 2015-2017 Josh Poimboeuf <jpoimboe@redhat.com>
4442f04c3SJosh Poimboeuf  */
5442f04c3SJosh Poimboeuf 
6442f04c3SJosh Poimboeuf /*
7442f04c3SJosh Poimboeuf  * objtool check:
8442f04c3SJosh Poimboeuf  *
9442f04c3SJosh Poimboeuf  * This command analyzes every .o file and ensures the validity of its stack
10442f04c3SJosh Poimboeuf  * trace metadata.  It enforces a set of rules on asm code and C inline
11442f04c3SJosh Poimboeuf  * assembly code so that stack traces can be reliable.
12442f04c3SJosh Poimboeuf  *
13442f04c3SJosh Poimboeuf  * For more information, see tools/objtool/Documentation/stack-validation.txt.
14442f04c3SJosh Poimboeuf  */
15442f04c3SJosh Poimboeuf 
16442f04c3SJosh Poimboeuf #include <subcmd/parse-options.h>
17442f04c3SJosh Poimboeuf #include "builtin.h"
18dcc914f4SJosh Poimboeuf #include "check.h"
19442f04c3SJosh Poimboeuf 
20*1e11f3fdSPeter Zijlstra bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats;
21442f04c3SJosh Poimboeuf 
22dcc914f4SJosh Poimboeuf static const char * const check_usage[] = {
23442f04c3SJosh Poimboeuf 	"objtool check [<options>] file.o",
24442f04c3SJosh Poimboeuf 	NULL,
25442f04c3SJosh Poimboeuf };
26442f04c3SJosh Poimboeuf 
27dcc914f4SJosh Poimboeuf const struct option check_options[] = {
28867ac9d7SJosh Poimboeuf 	OPT_BOOLEAN('f', "no-fp", &no_fp, "Skip frame pointer validation"),
29867ac9d7SJosh Poimboeuf 	OPT_BOOLEAN('u', "no-unreachable", &no_unreachable, "Skip 'unreachable instruction' warnings"),
30b5bc2231SPeter Zijlstra 	OPT_BOOLEAN('r', "retpoline", &retpoline, "Validate retpoline assumptions"),
31ca41b97eSPeter Zijlstra 	OPT_BOOLEAN('m', "module", &module, "Indicates the object will be part of a kernel module"),
327697eee3SPeter Zijlstra 	OPT_BOOLEAN('b', "backtrace", &backtrace, "unwind on error"),
33ea24213dSPeter Zijlstra 	OPT_BOOLEAN('a', "uaccess", &uaccess, "enable uaccess checking"),
34*1e11f3fdSPeter Zijlstra 	OPT_BOOLEAN('s', "stats", &stats, "print statistics"),
35442f04c3SJosh Poimboeuf 	OPT_END(),
36442f04c3SJosh Poimboeuf };
37442f04c3SJosh Poimboeuf 
38dcc914f4SJosh Poimboeuf int cmd_check(int argc, const char **argv)
39dcc914f4SJosh Poimboeuf {
40dcc914f4SJosh Poimboeuf 	const char *objname;
41dcc914f4SJosh Poimboeuf 
42dcc914f4SJosh Poimboeuf 	argc = parse_options(argc, argv, check_options, check_usage, 0);
43442f04c3SJosh Poimboeuf 
44442f04c3SJosh Poimboeuf 	if (argc != 1)
45dcc914f4SJosh Poimboeuf 		usage_with_options(check_usage, check_options);
46442f04c3SJosh Poimboeuf 
47442f04c3SJosh Poimboeuf 	objname = argv[0];
48442f04c3SJosh Poimboeuf 
4943a4525fSPeter Zijlstra 	return check(objname, false);
50442f04c3SJosh Poimboeuf }
51