mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
ea24213d80
It is important that UACCESS regions are as small as possible; furthermore the UACCESS state is not scheduled, so doing anything that might directly call into the scheduler will cause random code to be ran with UACCESS enabled. Teach objtool too track UACCESS state and warn about any CALL made while UACCESS is enabled. This very much includes the __fentry__() and __preempt_schedule() calls. Note that exceptions _do_ save/restore the UACCESS state, and therefore they can drive preemption. This also means that all exception handlers must have an otherwise redundant UACCESS disable instruction; therefore ignore this warning for !STT_FUNC code (exception handlers are not normal functions). Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@kernel.org>
62 lines
2.0 KiB
C
62 lines
2.0 KiB
C
/*
|
|
* Copyright (C) 2015-2017 Josh Poimboeuf <jpoimboe@redhat.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* objtool check:
|
|
*
|
|
* This command analyzes every .o file and ensures the validity of its stack
|
|
* trace metadata. It enforces a set of rules on asm code and C inline
|
|
* assembly code so that stack traces can be reliable.
|
|
*
|
|
* For more information, see tools/objtool/Documentation/stack-validation.txt.
|
|
*/
|
|
|
|
#include <subcmd/parse-options.h>
|
|
#include "builtin.h"
|
|
#include "check.h"
|
|
|
|
bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess;
|
|
|
|
static const char * const check_usage[] = {
|
|
"objtool check [<options>] file.o",
|
|
NULL,
|
|
};
|
|
|
|
const struct option check_options[] = {
|
|
OPT_BOOLEAN('f', "no-fp", &no_fp, "Skip frame pointer validation"),
|
|
OPT_BOOLEAN('u', "no-unreachable", &no_unreachable, "Skip 'unreachable instruction' warnings"),
|
|
OPT_BOOLEAN('r', "retpoline", &retpoline, "Validate retpoline assumptions"),
|
|
OPT_BOOLEAN('m', "module", &module, "Indicates the object will be part of a kernel module"),
|
|
OPT_BOOLEAN('b', "backtrace", &backtrace, "unwind on error"),
|
|
OPT_BOOLEAN('a', "uaccess", &uaccess, "enable uaccess checking"),
|
|
OPT_END(),
|
|
};
|
|
|
|
int cmd_check(int argc, const char **argv)
|
|
{
|
|
const char *objname;
|
|
|
|
argc = parse_options(argc, argv, check_options, check_usage, 0);
|
|
|
|
if (argc != 1)
|
|
usage_with_options(check_usage, check_options);
|
|
|
|
objname = argv[0];
|
|
|
|
return check(objname, false);
|
|
}
|