Re: [RFC PATCH v3 11/12] powerpc: Remove unreachable() from WARN_ON()
From: Christophe Leroy <hidden>
Date: 2022-07-04 12:44:38
Also in:
lkml
Le 04/07/2022 à 14:05, Peter Zijlstra a écrit :
On Sat, Jun 25, 2022 at 06:46:54AM +0000, Christophe Leroy wrote:quoted
Le 24/06/2022 à 20:32, Sathvika Vasireddy a écrit :quoted
objtool is throwing *unannotated intra-function call* warnings with a few instructions that are marked unreachable. Remove unreachable() from WARN_ON() to fix these warnings, as the codegen remains same with and without unreachable() in WARN_ON().Did you try the two exemples described in commit 1e688dd2a3d6 ("powerpc/bug: Provide better flexibility to WARN_ON/__WARN_FLAGS() with asm goto") ? Without your patch: 00000640 <test>: 640: 81 23 00 84 lwz r9,132(r3) 644: 71 29 40 00 andi. r9,r9,16384 648: 40 82 00 0c bne 654 <test+0x14> 64c: 80 63 00 0c lwz r3,12(r3) 650: 4e 80 00 20 blr 654: 0f e0 00 00 twui r0,0 00000658 <test9w>: 658: 2c 04 00 00 cmpwi r4,0 65c: 41 82 00 0c beq 668 <test9w+0x10> 660: 7c 63 23 96 divwu r3,r3,r4 664: 4e 80 00 20 blr 668: 0f e0 00 00 twui r0,0 66c: 38 60 00 00 li r3,0 670: 4e 80 00 20 blrPer this construct you should do as x86 does and assume twui terminates control flow and explicitly annotate the WARN case. That is, given the fact that BUG as no instructions following it, you can't very well annotate that.
That exactly the problem I guess. I'm fine with replacing the unreachable() by __builtin_unreachable() with our __WARN_FLAGS() and BUG() but we will still have a problem with some of the unrachable() that are in core parts of the kernel. Even the ones in arch/powerpc/, they are valid and should remain. The point seems that the generic annotate_unreachable() is wrong for powerpc as is, and activating CONFIG_OBJTOOL lead to bad code generation. By the way, for which functionnalities of objtool is that analysis necessary ? I understand it is not necessary to mcount accounting, so maybe the not empty annotate_unreachable() should be limited to those those functionnalities ?
Alternatively, you can teach objtool to look at __bug_table to distinguish these cases.
Isn't it enough to tell objtool that execution never go past twui, using INSN_BUG ? By the way, for __WARN_FLAGS, we use the __extable for the continuation. Is objtools able to follow __extable ? Christophe