It will used by bpf to reject attaching fexit prog to functions
annotated with __noreturn.
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
include/linux/noreturns.h | 52 +++++++++++++++++++++++++
tools/objtool/Documentation/objtool.txt | 3 +-
tools/objtool/sync-check.sh | 2 +
3 files changed, 56 insertions(+), 1 deletion(-)
create mode 100644 include/linux/noreturns.h
diff --git a/include/linux/noreturns.h b/include/linux/noreturns.h
new file mode 100644
index 000000000000..b2174894f9f7
--- /dev/null
+++ b/include/linux/noreturns.h
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+/*
+ * This is a (sorted!) list of all known __noreturn functions in the kernel.
+ * It's needed for objtool to properly reverse-engineer the control flow graph.
+ *
+ * Yes, this is unfortunate. A better solution is in the works.
+ */
+NORETURN(__fortify_panic)
+NORETURN(__ia32_sys_exit)
+NORETURN(__ia32_sys_exit_group)
+NORETURN(__kunit_abort)
+NORETURN(__module_put_and_kthread_exit)
+NORETURN(__stack_chk_fail)
+NORETURN(__tdx_hypercall_failed)
+NORETURN(__ubsan_handle_builtin_unreachable)
+NORETURN(__x64_sys_exit)
+NORETURN(__x64_sys_exit_group)
+NORETURN(arch_cpu_idle_dead)
+NORETURN(bch2_trans_in_restart_error)
+NORETURN(bch2_trans_restart_error)
+NORETURN(bch2_trans_unlocked_error)
+NORETURN(cpu_bringup_and_idle)
+NORETURN(cpu_startup_entry)
+NORETURN(do_exit)
+NORETURN(do_group_exit)
+NORETURN(do_task_dead)
+NORETURN(ex_handler_msr_mce)
+NORETURN(hlt_play_dead)
+NORETURN(hv_ghcb_terminate)
+NORETURN(kthread_complete_and_exit)
+NORETURN(kthread_exit)
+NORETURN(kunit_try_catch_throw)
+NORETURN(machine_real_restart)
+NORETURN(make_task_dead)
+NORETURN(mpt_halt_firmware)
+NORETURN(nmi_panic_self_stop)
+NORETURN(panic)
+NORETURN(panic_smp_self_stop)
+NORETURN(rest_init)
+NORETURN(rewind_stack_and_make_dead)
+NORETURN(rust_begin_unwind)
+NORETURN(rust_helper_BUG)
+NORETURN(sev_es_terminate)
+NORETURN(snp_abort)
+NORETURN(start_kernel)
+NORETURN(stop_this_cpu)
+NORETURN(usercopy_abort)
+NORETURN(x86_64_start_kernel)
+NORETURN(x86_64_start_reservations)
+NORETURN(xen_cpu_bringup_again)
+NORETURN(xen_start_kernel)
diff --git a/tools/objtool/Documentation/objtool.txt b/tools/objtool/Documentation/objtool.txt
index 7c3ee959b63c..70a878e4dc36 100644
--- a/tools/objtool/Documentation/objtool.txt
+++ b/tools/objtool/Documentation/objtool.txt
@@ -326,7 +326,8 @@ the objtool maintainers.
The call from foo() to bar() doesn't return, but bar() is missing the
__noreturn annotation. NOTE: In addition to annotating the function
- with __noreturn, please also add it to tools/objtool/noreturns.h.
+ with __noreturn, please also add it to tools/objtool/noreturns.h and
+ include/linux/noreturns.h.
4. file.o: warning: objtool: func(): can't find starting instruction
or
diff --git a/tools/objtool/sync-check.sh b/tools/objtool/sync-check.sh
index 81d120d05442..23b9813cd5e9 100755
--- a/tools/objtool/sync-check.sh
+++ b/tools/objtool/sync-check.sh
@@ -17,6 +17,7 @@ arch/x86/include/asm/emulate_prefix.h
arch/x86/lib/x86-opcode-map.txt
arch/x86/tools/gen-insn-attr-x86.awk
include/linux/static_call_types.h
+tools/objtool/noreturns.h
"
SYNC_CHECK_FILES='
@@ -24,6 +25,7 @@ arch/x86/include/asm/inat.h
arch/x86/include/asm/insn.h
arch/x86/lib/inat.c
arch/x86/lib/insn.c
+include/linux/noreturns.h
'
fi
--
2.43.5
On Sat, Feb 22, 2025 at 10:28 PM Yafang Shao <laoar.shao@gmail.com> wrote: > > It will used by bpf to reject attaching fexit prog to functions > annotated with __noreturn. > > Signed-off-by: Yafang Shao <laoar.shao@gmail.com> > --- > include/linux/noreturns.h | 52 +++++++++++++++++++++++++ > tools/objtool/Documentation/objtool.txt | 3 +- > tools/objtool/sync-check.sh | 2 + > 3 files changed, 56 insertions(+), 1 deletion(-) > create mode 100644 include/linux/noreturns.h > > diff --git a/include/linux/noreturns.h b/include/linux/noreturns.h > new file mode 100644 > index 000000000000..b2174894f9f7 > --- /dev/null > +++ b/include/linux/noreturns.h > @@ -0,0 +1,52 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > + > +/* > + * This is a (sorted!) list of all known __noreturn functions in the kernel. > + * It's needed for objtool to properly reverse-engineer the control flow graph. > + * > + * Yes, this is unfortunate. A better solution is in the works. > + */ > +NORETURN(__fortify_panic) > +NORETURN(__ia32_sys_exit) > +NORETURN(__ia32_sys_exit_group) > +NORETURN(__kunit_abort) > +NORETURN(__module_put_and_kthread_exit) > +NORETURN(__stack_chk_fail) > +NORETURN(__tdx_hypercall_failed) > +NORETURN(__ubsan_handle_builtin_unreachable) > +NORETURN(__x64_sys_exit) > +NORETURN(__x64_sys_exit_group) > +NORETURN(arch_cpu_idle_dead) > +NORETURN(bch2_trans_in_restart_error) > +NORETURN(bch2_trans_restart_error) > +NORETURN(bch2_trans_unlocked_error) > +NORETURN(cpu_bringup_and_idle) > +NORETURN(cpu_startup_entry) > +NORETURN(do_exit) > +NORETURN(do_group_exit) > +NORETURN(do_task_dead) > +NORETURN(ex_handler_msr_mce) > +NORETURN(hlt_play_dead) > +NORETURN(hv_ghcb_terminate) > +NORETURN(kthread_complete_and_exit) > +NORETURN(kthread_exit) > +NORETURN(kunit_try_catch_throw) > +NORETURN(machine_real_restart) > +NORETURN(make_task_dead) > +NORETURN(mpt_halt_firmware) > +NORETURN(nmi_panic_self_stop) > +NORETURN(panic) > +NORETURN(panic_smp_self_stop) > +NORETURN(rest_init) > +NORETURN(rewind_stack_and_make_dead) > +NORETURN(rust_begin_unwind) > +NORETURN(rust_helper_BUG) > +NORETURN(sev_es_terminate) > +NORETURN(snp_abort) > +NORETURN(start_kernel) > +NORETURN(stop_this_cpu) > +NORETURN(usercopy_abort) > +NORETURN(x86_64_start_kernel) > +NORETURN(x86_64_start_reservations) > +NORETURN(xen_cpu_bringup_again) > +NORETURN(xen_start_kernel) > diff --git a/tools/objtool/Documentation/objtool.txt b/tools/objtool/Documentation/objtool.txt > index 7c3ee959b63c..70a878e4dc36 100644 > --- a/tools/objtool/Documentation/objtool.txt > +++ b/tools/objtool/Documentation/objtool.txt > @@ -326,7 +326,8 @@ the objtool maintainers. > > The call from foo() to bar() doesn't return, but bar() is missing the > __noreturn annotation. NOTE: In addition to annotating the function > - with __noreturn, please also add it to tools/objtool/noreturns.h. > + with __noreturn, please also add it to tools/objtool/noreturns.h and > + include/linux/noreturns.h. > > 4. file.o: warning: objtool: func(): can't find starting instruction > or > diff --git a/tools/objtool/sync-check.sh b/tools/objtool/sync-check.sh > index 81d120d05442..23b9813cd5e9 100755 > --- a/tools/objtool/sync-check.sh > +++ b/tools/objtool/sync-check.sh > @@ -17,6 +17,7 @@ arch/x86/include/asm/emulate_prefix.h > arch/x86/lib/x86-opcode-map.txt > arch/x86/tools/gen-insn-attr-x86.awk > include/linux/static_call_types.h > +tools/objtool/noreturns.h > " > > SYNC_CHECK_FILES=' > @@ -24,6 +25,7 @@ arch/x86/include/asm/inat.h > arch/x86/include/asm/insn.h > arch/x86/lib/inat.c > arch/x86/lib/insn.c > +include/linux/noreturns.h The copy looks pointless. Since we cannot rely on objtool let's just list all noreturn funcs directly in BTF_SET_START(fexit_deny) in a single patch. So all changes will be under kernel/bpf directory. pw-bot: cr
On Mon, Feb 24, 2025 at 4:12 AM Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote: > > On Sat, Feb 22, 2025 at 10:28 PM Yafang Shao <laoar.shao@gmail.com> wrote: > > > > It will used by bpf to reject attaching fexit prog to functions > > annotated with __noreturn. > > > > Signed-off-by: Yafang Shao <laoar.shao@gmail.com> > > --- > > include/linux/noreturns.h | 52 +++++++++++++++++++++++++ > > tools/objtool/Documentation/objtool.txt | 3 +- > > tools/objtool/sync-check.sh | 2 + > > 3 files changed, 56 insertions(+), 1 deletion(-) > > create mode 100644 include/linux/noreturns.h > > > > diff --git a/include/linux/noreturns.h b/include/linux/noreturns.h > > new file mode 100644 > > index 000000000000..b2174894f9f7 > > --- /dev/null > > +++ b/include/linux/noreturns.h > > @@ -0,0 +1,52 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > + > > +/* > > + * This is a (sorted!) list of all known __noreturn functions in the kernel. > > + * It's needed for objtool to properly reverse-engineer the control flow graph. > > + * > > + * Yes, this is unfortunate. A better solution is in the works. > > + */ > > +NORETURN(__fortify_panic) > > +NORETURN(__ia32_sys_exit) > > +NORETURN(__ia32_sys_exit_group) > > +NORETURN(__kunit_abort) > > +NORETURN(__module_put_and_kthread_exit) > > +NORETURN(__stack_chk_fail) > > +NORETURN(__tdx_hypercall_failed) > > +NORETURN(__ubsan_handle_builtin_unreachable) > > +NORETURN(__x64_sys_exit) > > +NORETURN(__x64_sys_exit_group) > > +NORETURN(arch_cpu_idle_dead) > > +NORETURN(bch2_trans_in_restart_error) > > +NORETURN(bch2_trans_restart_error) > > +NORETURN(bch2_trans_unlocked_error) > > +NORETURN(cpu_bringup_and_idle) > > +NORETURN(cpu_startup_entry) > > +NORETURN(do_exit) > > +NORETURN(do_group_exit) > > +NORETURN(do_task_dead) > > +NORETURN(ex_handler_msr_mce) > > +NORETURN(hlt_play_dead) > > +NORETURN(hv_ghcb_terminate) > > +NORETURN(kthread_complete_and_exit) > > +NORETURN(kthread_exit) > > +NORETURN(kunit_try_catch_throw) > > +NORETURN(machine_real_restart) > > +NORETURN(make_task_dead) > > +NORETURN(mpt_halt_firmware) > > +NORETURN(nmi_panic_self_stop) > > +NORETURN(panic) > > +NORETURN(panic_smp_self_stop) > > +NORETURN(rest_init) > > +NORETURN(rewind_stack_and_make_dead) > > +NORETURN(rust_begin_unwind) > > +NORETURN(rust_helper_BUG) > > +NORETURN(sev_es_terminate) > > +NORETURN(snp_abort) > > +NORETURN(start_kernel) > > +NORETURN(stop_this_cpu) > > +NORETURN(usercopy_abort) > > +NORETURN(x86_64_start_kernel) > > +NORETURN(x86_64_start_reservations) > > +NORETURN(xen_cpu_bringup_again) > > +NORETURN(xen_start_kernel) > > diff --git a/tools/objtool/Documentation/objtool.txt b/tools/objtool/Documentation/objtool.txt > > index 7c3ee959b63c..70a878e4dc36 100644 > > --- a/tools/objtool/Documentation/objtool.txt > > +++ b/tools/objtool/Documentation/objtool.txt > > @@ -326,7 +326,8 @@ the objtool maintainers. > > > > The call from foo() to bar() doesn't return, but bar() is missing the > > __noreturn annotation. NOTE: In addition to annotating the function > > - with __noreturn, please also add it to tools/objtool/noreturns.h. > > + with __noreturn, please also add it to tools/objtool/noreturns.h and > > + include/linux/noreturns.h. > > > > 4. file.o: warning: objtool: func(): can't find starting instruction > > or > > diff --git a/tools/objtool/sync-check.sh b/tools/objtool/sync-check.sh > > index 81d120d05442..23b9813cd5e9 100755 > > --- a/tools/objtool/sync-check.sh > > +++ b/tools/objtool/sync-check.sh > > @@ -17,6 +17,7 @@ arch/x86/include/asm/emulate_prefix.h > > arch/x86/lib/x86-opcode-map.txt > > arch/x86/tools/gen-insn-attr-x86.awk > > include/linux/static_call_types.h > > +tools/objtool/noreturns.h > > " > > > > SYNC_CHECK_FILES=' > > @@ -24,6 +25,7 @@ arch/x86/include/asm/inat.h > > arch/x86/include/asm/insn.h > > arch/x86/lib/inat.c > > arch/x86/lib/insn.c > > +include/linux/noreturns.h > > The copy looks pointless. > Since we cannot rely on objtool let's just list all noreturn funcs > directly in BTF_SET_START(fexit_deny) in a single patch. > So all changes will be under kernel/bpf directory. OK I will send a new version. -- Regards Yafang
Hi Yafang,
kernel test robot noticed the following build errors:
[auto build test ERROR on bpf-next/master]
url: https://github.com/intel-lab-lkp/linux/commits/Yafang-Shao/objtool-Copy-noreturns-h-to-include-linux/20250223-143010
base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
patch link: https://lore.kernel.org/r/20250223062735.3341-2-laoar.shao%40gmail.com
patch subject: [PATCH v2 bpf-next 1/3] objtool: Copy noreturns.h to include/linux
reproduce: (https://download.01.org/0day-ci/archive/20250223/202502231624.0BVpxwbg-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202502231624.0BVpxwbg-lkp@intel.com/
All errors (new ones prefixed by >>):
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make[2]: *** [scripts/Makefile.build:102: scripts/mod/devicetable-offsets.s] Error 1
make[2]: Target 'scripts/mod/' not remade because of errors.
make[1]: *** [Makefile:1263: prepare0] Error 2
>> diff: tools/tools/objtool/noreturns.h: No such file or directory
Warning: Kernel ABI header at 'tools/tools/objtool/noreturns.h' differs from latest version at 'tools/objtool/noreturns.h'
make[3]: *** [Makefile:70: tools/objtool/objtool-in.o] Error 1
make[3]: Target 'all' not remade because of errors.
make[2]: *** [Makefile:73: objtool] Error 2
make[1]: *** [Makefile:1430: tools/objtool] Error 2
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2025 Red Hat, Inc.