When compiling with LLVM and CONFIG_LTO_CLANG is set, there exist the
following objtool warnings:
vmlinux.o: warning: objtool: kernel_entry+0x0: unreachable instruction
vmlinux.o: warning: objtool: smpboot_entry+0x0: unreachable instruction
kernel_entry() and smpboot_entry() are in arch/loongarch/kernel/head.S,
there is "OBJECT_FILES_NON_STANDARD_head.o := y" to skip objtool checking
for head.o, but the STACK_FRAME_NON_STANDARD macro does not work for link
time validation of vmlinux.o according to objtool documentation, just give
a proper unwind hint to silence the warnings.
By the way, ASM_BUG() can be removed due to unnecessary, otherwise there
are following warnings:
kernel_entry+0xf4: start_kernel() missing __noreturn
in .c/.h or NORETURN() in noreturns.h
smpboot_entry+0x68: start_secondary() missing __noreturn
in .c/.h or NORETURN() in noreturns.h
This is because the previous instructions of kernel_entry+0xf4 and
smpboot_entry+0x68 are the 'bl' instructions, start_kernel() and
start_secondary() are the respective call destination symbols which
are noreturn functions, then the 'bl' instructions are already marked
as dead end in annotate_call_site().
For now, it is time to remove "OBJECT_FILES_NON_STANDARD_head.o := y"
in arch/loongarch/kernel/Makefile.
Link: https://lore.kernel.org/lkml/20250814083651.GR4067720@noisy.programming.kicks-ass.net/
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
---
arch/loongarch/kernel/Makefile | 2 --
arch/loongarch/kernel/head.S | 6 ++----
2 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
index 6f5a4574a911..4302c5b0a201 100644
--- a/arch/loongarch/kernel/Makefile
+++ b/arch/loongarch/kernel/Makefile
@@ -3,8 +3,6 @@
# Makefile for the Linux/LoongArch kernel.
#
-OBJECT_FILES_NON_STANDARD_head.o := y
-
always-$(KBUILD_BUILTIN) := vmlinux.lds
obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \
diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S
index e3865e92a917..a11880f3a7e1 100644
--- a/arch/loongarch/kernel/head.S
+++ b/arch/loongarch/kernel/head.S
@@ -42,6 +42,7 @@ SYM_DATA(kernel_fsize, .long _kernel_fsize);
.align 12
SYM_CODE_START(kernel_entry) # kernel entry point
+ UNWIND_HINT_UNDEFINED
/* Config direct window and set PG */
SETUP_DMWINS t0
@@ -109,8 +110,6 @@ SYM_CODE_START(kernel_entry) # kernel entry point
#endif
bl start_kernel
- ASM_BUG()
-
SYM_CODE_END(kernel_entry)
#ifdef CONFIG_SMP
@@ -120,6 +119,7 @@ SYM_CODE_END(kernel_entry)
* function after setting up the stack and tp registers.
*/
SYM_CODE_START(smpboot_entry)
+ UNWIND_HINT_UNDEFINED
SETUP_DMWINS t0
JUMP_VIRT_ADDR t0, t1
@@ -142,8 +142,6 @@ SYM_CODE_START(smpboot_entry)
ld.d tp, t0, CPU_BOOT_TINFO
bl start_secondary
- ASM_BUG()
-
SYM_CODE_END(smpboot_entry)
#endif /* CONFIG_SMP */
--
2.42.0
On Mon, Sep 01, 2025 at 03:21:56PM +0800, Tiezhu Yang wrote: > +++ b/arch/loongarch/kernel/Makefile > @@ -3,8 +3,6 @@ > # Makefile for the Linux/LoongArch kernel. > # > > -OBJECT_FILES_NON_STANDARD_head.o := y > - > always-$(KBUILD_BUILTIN) := vmlinux.lds > > obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ > diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S > index e3865e92a917..a11880f3a7e1 100644 > --- a/arch/loongarch/kernel/head.S > +++ b/arch/loongarch/kernel/head.S > @@ -42,6 +42,7 @@ SYM_DATA(kernel_fsize, .long _kernel_fsize); > .align 12 > > SYM_CODE_START(kernel_entry) # kernel entry point > + UNWIND_HINT_UNDEFINED Should this not be UNWIND_HINT_END_OF_STACK? I notice Loongarch doesn't seem to use that anywhere. How does any ORC unwind succeed? UNWIND_HINT_UNDEFINED sets an error condition which should cause a livepatch transition to stall. -- Josh
On 2025/9/4 上午3:22, Josh Poimboeuf wrote: > On Mon, Sep 01, 2025 at 03:21:56PM +0800, Tiezhu Yang wrote: >> +++ b/arch/loongarch/kernel/Makefile >> @@ -3,8 +3,6 @@ >> # Makefile for the Linux/LoongArch kernel. >> # >> >> -OBJECT_FILES_NON_STANDARD_head.o := y >> - >> always-$(KBUILD_BUILTIN) := vmlinux.lds >> >> obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ >> diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S >> index e3865e92a917..a11880f3a7e1 100644 >> --- a/arch/loongarch/kernel/head.S >> +++ b/arch/loongarch/kernel/head.S >> @@ -42,6 +42,7 @@ SYM_DATA(kernel_fsize, .long _kernel_fsize); >> .align 12 >> >> SYM_CODE_START(kernel_entry) # kernel entry point >> + UNWIND_HINT_UNDEFINED > > Should this not be UNWIND_HINT_END_OF_STACK? Yes, makes sense, will do it in the next version. > I notice Loongarch doesn't seem to use that anywhere. How does any ORC > unwind succeed? UNWIND_HINT_UNDEFINED sets an error condition which > should cause a livepatch transition to stall. Actually, kernel_entry() or smpboot_entry() is recognized as the last frame, because at this point is_entry_func() is true and state->stack_info.type = STACK_TYPE_UNKNOWN in unwind_next_frame() of arch/loongarch/kernel/unwind_orc.c. Call Trace: [<90000000031a36b4>] show_stack+0x5c/0x180 [<900000000319d4b0>] dump_stack_lvl+0x6c/0x9c [<900000000458d3e0>] nmi_cpu_backtrace+0x160/0x168 [<90000000031a3b6c>] handle_backtrace+0xc/0x40 [<90000000032b1078>] __flush_smp_call_function_queue+0xd0/0x330 [<90000000031aec40>] loongson_ipi_interrupt+0xb0/0x168 [<900000000325b4d4>] __handle_irq_event_percpu+0x54/0x1a8 [<900000000325b63c>] handle_irq_event_percpu+0x14/0x80 [<9000000003262a48>] handle_percpu_irq+0x50/0xa0 [<900000000325aad4>] generic_handle_domain_irq+0x2c/0x80 [<9000000003bc4d24>] handle_cpu_irq+0x64/0xa0 [<90000000045a350c>] handle_loongarch_irq+0x2c/0x48 [<90000000045a35e4>] do_vint+0xbc/0xe0 [<90000000031a1624>] handle_vint+0x144/0x1e4 [<900000000321e2e8>] _nohz_idle_balance.isra.0+0x230/0x3a0 [<90000000031cd004>] handle_softirqs+0x10c/0x298 [<90000000031cd2e8>] __irq_exit_rcu+0x100/0x160 [<90000000045a35a4>] do_vint+0x7c/0xe0 [<90000000045a55cc>] idle_exit+0x0/0x4 [<90000000045a55d8>] arch_cpu_idle+0x8/0x30 [<90000000045a5698>] default_idle_call+0x18/0x50 [<90000000032250b0>] do_idle+0xb8/0x130 [<9000000003225374>] cpu_startup_entry+0x2c/0x38 [<90000000045a6240>] kernel_entry_end+0xdc/0xe0 [<90000000045c0d44>] start_kernel+0x65c/0x660 [<90000000045a60f0>] kernel_entry+0xf0/0xf8 Thanks, Tiezhu
On Thu, Sep 04, 2025 at 11:18:28AM +0800, Tiezhu Yang wrote: > On 2025/9/4 上午3:22, Josh Poimboeuf wrote: > > On Mon, Sep 01, 2025 at 03:21:56PM +0800, Tiezhu Yang wrote: > > > +++ b/arch/loongarch/kernel/Makefile > > > @@ -3,8 +3,6 @@ > > > # Makefile for the Linux/LoongArch kernel. > > > # > > > -OBJECT_FILES_NON_STANDARD_head.o := y > > > - > > > always-$(KBUILD_BUILTIN) := vmlinux.lds > > > obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ > > > diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S > > > index e3865e92a917..a11880f3a7e1 100644 > > > --- a/arch/loongarch/kernel/head.S > > > +++ b/arch/loongarch/kernel/head.S > > > @@ -42,6 +42,7 @@ SYM_DATA(kernel_fsize, .long _kernel_fsize); > > > .align 12 > > > SYM_CODE_START(kernel_entry) # kernel entry point > > > + UNWIND_HINT_UNDEFINED > > > > Should this not be UNWIND_HINT_END_OF_STACK? > > Yes, makes sense, will do it in the next version. > > > I notice Loongarch doesn't seem to use that anywhere. How does any ORC > > unwind succeed? UNWIND_HINT_UNDEFINED sets an error condition which > > should cause a livepatch transition to stall. > > Actually, kernel_entry() or smpboot_entry() is recognized as the last > frame, because at this point is_entry_func() is true and > state->stack_info.type = STACK_TYPE_UNKNOWN in unwind_next_frame() of > arch/loongarch/kernel/unwind_orc.c. I think you can get rid of is_entry_func() in favor of just using UNWIND_HINT_END_OF_STACK at all the entry points. -- Josh
On 2025-09-04 03:22, Josh Poimboeuf wrote: > On Mon, Sep 01, 2025 at 03:21:56PM +0800, Tiezhu Yang wrote: >> +++ b/arch/loongarch/kernel/Makefile >> @@ -3,8 +3,6 @@ >> # Makefile for the Linux/LoongArch kernel. >> # >> >> -OBJECT_FILES_NON_STANDARD_head.o := y >> - >> always-$(KBUILD_BUILTIN) := vmlinux.lds >> >> obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ >> diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S >> index e3865e92a917..a11880f3a7e1 100644 >> --- a/arch/loongarch/kernel/head.S >> +++ b/arch/loongarch/kernel/head.S >> @@ -42,6 +42,7 @@ SYM_DATA(kernel_fsize, .long _kernel_fsize); >> .align 12 >> >> SYM_CODE_START(kernel_entry) # kernel entry point >> + UNWIND_HINT_UNDEFINED > Should this not be UNWIND_HINT_END_OF_STACK? > > I notice Loongarch doesn't seem to use that anywhere. How does any ORC > unwind succeed? IIRC, unwinder stops when fail when call __kernel_text_address(bt_address), or success when call arch/loongarch/kernel/unwind_orc.c::is_entry_func(bt_address). > UNWIND_HINT_UNDEFINED sets an error condition which > should cause a livepatch transition to stall. >
On Mon, Sep 01, 2025 at 03:21:56PM +0800, Tiezhu Yang wrote: > When compiling with LLVM and CONFIG_LTO_CLANG is set, there exist the > following objtool warnings: > > vmlinux.o: warning: objtool: kernel_entry+0x0: unreachable instruction > vmlinux.o: warning: objtool: smpboot_entry+0x0: unreachable instruction > > kernel_entry() and smpboot_entry() are in arch/loongarch/kernel/head.S, > there is "OBJECT_FILES_NON_STANDARD_head.o := y" to skip objtool checking > for head.o, but the STACK_FRAME_NON_STANDARD macro does not work for link > time validation of vmlinux.o according to objtool documentation, just give > a proper unwind hint to silence the warnings. > > By the way, ASM_BUG() can be removed due to unnecessary, otherwise there > are following warnings: > > kernel_entry+0xf4: start_kernel() missing __noreturn > in .c/.h or NORETURN() in noreturns.h > > smpboot_entry+0x68: start_secondary() missing __noreturn > in .c/.h or NORETURN() in noreturns.h > > This is because the previous instructions of kernel_entry+0xf4 and > smpboot_entry+0x68 are the 'bl' instructions, start_kernel() and > start_secondary() are the respective call destination symbols which > are noreturn functions, then the 'bl' instructions are already marked > as dead end in annotate_call_site(). > > For now, it is time to remove "OBJECT_FILES_NON_STANDARD_head.o := y" > in arch/loongarch/kernel/Makefile. > > Link: https://lore.kernel.org/lkml/20250814083651.GR4067720@noisy.programming.kicks-ass.net/ > Suggested-by: Peter Zijlstra <peterz@infradead.org> > Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> Right, this looks good. Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> > --- > arch/loongarch/kernel/Makefile | 2 -- > arch/loongarch/kernel/head.S | 6 ++---- > 2 files changed, 2 insertions(+), 6 deletions(-) > > diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile > index 6f5a4574a911..4302c5b0a201 100644 > --- a/arch/loongarch/kernel/Makefile > +++ b/arch/loongarch/kernel/Makefile > @@ -3,8 +3,6 @@ > # Makefile for the Linux/LoongArch kernel. > # > > -OBJECT_FILES_NON_STANDARD_head.o := y > - > always-$(KBUILD_BUILTIN) := vmlinux.lds > > obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ > diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S > index e3865e92a917..a11880f3a7e1 100644 > --- a/arch/loongarch/kernel/head.S > +++ b/arch/loongarch/kernel/head.S > @@ -42,6 +42,7 @@ SYM_DATA(kernel_fsize, .long _kernel_fsize); > .align 12 > > SYM_CODE_START(kernel_entry) # kernel entry point > + UNWIND_HINT_UNDEFINED > > /* Config direct window and set PG */ > SETUP_DMWINS t0 > @@ -109,8 +110,6 @@ SYM_CODE_START(kernel_entry) # kernel entry point > #endif > > bl start_kernel > - ASM_BUG() > - > SYM_CODE_END(kernel_entry) > > #ifdef CONFIG_SMP > @@ -120,6 +119,7 @@ SYM_CODE_END(kernel_entry) > * function after setting up the stack and tp registers. > */ > SYM_CODE_START(smpboot_entry) > + UNWIND_HINT_UNDEFINED > > SETUP_DMWINS t0 > JUMP_VIRT_ADDR t0, t1 > @@ -142,8 +142,6 @@ SYM_CODE_START(smpboot_entry) > ld.d tp, t0, CPU_BOOT_TINFO > > bl start_secondary > - ASM_BUG() > - > SYM_CODE_END(smpboot_entry) > > #endif /* CONFIG_SMP */ > -- > 2.42.0 >
© 2016 - 2025 Red Hat, Inc.