diff options
author | Peter Zijlstra <peterz@infradead.org> | 2023-01-12 20:43:31 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2023-01-13 11:48:15 +0100 |
commit | 2b5a0e425e6e319b1978db1e9564f6af4228a567 (patch) | |
tree | c9926cea6c676d9c0d7945d372df83009713ded8 /tools/objtool/check.c | |
parent | cpuidle: Annotate poll_idle() (diff) | |
download | linux-2b5a0e425e6e319b1978db1e9564f6af4228a567.tar.xz linux-2b5a0e425e6e319b1978db1e9564f6af4228a567.zip |
objtool/idle: Validate __cpuidle code as noinstr
Idle code is very like entry code in that RCU isn't available. As
such, add a little validation.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Tony Lindgren <tony@atomide.com>
Tested-by: Ulf Hansson <ulf.hansson@linaro.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Frederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/r/20230112195540.373461409@infradead.org
Diffstat (limited to '')
-rw-r--r-- | tools/objtool/check.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 4350be739f4f..64954aa83522 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -376,6 +376,7 @@ static int decode_instructions(struct objtool_file *file) if (!strcmp(sec->name, ".noinstr.text") || !strcmp(sec->name, ".entry.text") || + !strcmp(sec->name, ".cpuidle.text") || !strncmp(sec->name, ".text.__x86.", 12)) sec->noinstr = true; @@ -3366,6 +3367,12 @@ static inline bool noinstr_call_dest(struct objtool_file *file, return true; /* + * If the symbol is a static_call trampoline, we can't tell. + */ + if (func->static_call_tramp) + return true; + + /* * The __ubsan_handle_*() calls are like WARN(), they only happen when * something 'BAD' happened. At the risk of taking the machine down, * let them proceed to get the message out. @@ -4162,6 +4169,12 @@ static int validate_noinstr_sections(struct objtool_file *file) warnings += validate_unwind_hints(file, sec); } + sec = find_section_by_name(file->elf, ".cpuidle.text"); + if (sec) { + warnings += validate_section(file, sec); + warnings += validate_unwind_hints(file, sec); + } + return warnings; } |