xref: /openbmc/linux/tools/objtool/builtin-check.c (revision 6545eb030e6f14cef8793a86312483c788eaee46)
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>
17c4a33939SPeter Zijlstra #include <string.h>
18442f04c3SJosh Poimboeuf #include "builtin.h"
190decf1f8SMatt Helsley #include "objtool.h"
20442f04c3SJosh Poimboeuf 
21c4a33939SPeter Zijlstra bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux;
22442f04c3SJosh Poimboeuf 
23dcc914f4SJosh Poimboeuf static const char * const check_usage[] = {
24442f04c3SJosh Poimboeuf 	"objtool check [<options>] file.o",
25442f04c3SJosh Poimboeuf 	NULL,
26442f04c3SJosh Poimboeuf };
27442f04c3SJosh Poimboeuf 
28dcc914f4SJosh Poimboeuf const struct option check_options[] = {
29867ac9d7SJosh Poimboeuf 	OPT_BOOLEAN('f', "no-fp", &no_fp, "Skip frame pointer validation"),
30867ac9d7SJosh Poimboeuf 	OPT_BOOLEAN('u', "no-unreachable", &no_unreachable, "Skip 'unreachable instruction' warnings"),
31b5bc2231SPeter Zijlstra 	OPT_BOOLEAN('r', "retpoline", &retpoline, "Validate retpoline assumptions"),
32ca41b97eSPeter Zijlstra 	OPT_BOOLEAN('m', "module", &module, "Indicates the object will be part of a kernel module"),
337697eee3SPeter Zijlstra 	OPT_BOOLEAN('b', "backtrace", &backtrace, "unwind on error"),
34ea24213dSPeter Zijlstra 	OPT_BOOLEAN('a', "uaccess", &uaccess, "enable uaccess checking"),
351e11f3fdSPeter Zijlstra 	OPT_BOOLEAN('s', "stats", &stats, "print statistics"),
36c4a33939SPeter Zijlstra 	OPT_BOOLEAN('d', "duplicate", &validate_dup, "duplicate validation for vmlinux.o"),
37c4a33939SPeter Zijlstra 	OPT_BOOLEAN('l', "vmlinux", &vmlinux, "vmlinux.o validation"),
38442f04c3SJosh Poimboeuf 	OPT_END(),
39442f04c3SJosh Poimboeuf };
40442f04c3SJosh Poimboeuf 
41dcc914f4SJosh Poimboeuf int cmd_check(int argc, const char **argv)
42dcc914f4SJosh Poimboeuf {
43c4a33939SPeter Zijlstra 	const char *objname, *s;
44*6545eb03SJulien Thierry 	struct objtool_file *file;
45dcc914f4SJosh Poimboeuf 
46dcc914f4SJosh Poimboeuf 	argc = parse_options(argc, argv, check_options, check_usage, 0);
47442f04c3SJosh Poimboeuf 
48442f04c3SJosh Poimboeuf 	if (argc != 1)
49dcc914f4SJosh Poimboeuf 		usage_with_options(check_usage, check_options);
50442f04c3SJosh Poimboeuf 
51442f04c3SJosh Poimboeuf 	objname = argv[0];
52442f04c3SJosh Poimboeuf 
53c4a33939SPeter Zijlstra 	s = strstr(objname, "vmlinux.o");
54c4a33939SPeter Zijlstra 	if (s && !s[9])
55c4a33939SPeter Zijlstra 		vmlinux = true;
56c4a33939SPeter Zijlstra 
57*6545eb03SJulien Thierry 	file = objtool_open_read(objname);
58*6545eb03SJulien Thierry 	if (!file)
59*6545eb03SJulien Thierry 		return 1;
60*6545eb03SJulien Thierry 
61*6545eb03SJulien Thierry 	return check(file, false);
62442f04c3SJosh Poimboeuf }
63