Declaring unrecoverable_exception() as __noreturn ?

Nicholas Piggin npiggin at gmail.com
Thu Feb 11 11:44:21 AEDT 2021


Excerpts from Christophe Leroy's message of February 11, 2021 2:44 am:
> As far as I can see, almost all callers of unrecoverable_exception() expect it to never return.
> 
> Can we mark it __noreturn ?

I don't see why not, do_exit is noreturn. We could make die() noreturn 
as well.

> 
> Below is interrupt_exit_kernel_prepare() with then without unrecoverable_exception() declared as 
> __noreturn. (CONFIG_PREEMPT_NONE, and with the BUG_ON() removed)
> 
> With the __noreturn added, we get no stack frame on the likely path

Nice!

Thanks,
Nick

> 
> 000003a8 <interrupt_exit_kernel_prepare>:
>   3a8:	81 43 00 84 	lwz     r10,132(r3)
>   3ac:	71 4a 00 02 	andi.   r10,r10,2
>   3b0:	41 82 00 30 	beq     3e0 <interrupt_exit_kernel_prepare+0x38>
>   3b4:	80 62 00 70 	lwz     r3,112(r2)
>   3b8:	74 63 00 01 	andis.  r3,r3,1
>   3bc:	40 82 00 34 	bne     3f0 <interrupt_exit_kernel_prepare+0x48>
>   3c0:	7d 40 00 a6 	mfmsr   r10
>   3c4:	55 4a 04 5e 	rlwinm  r10,r10,0,17,15
>   3c8:	7d 40 01 24 	mtmsr   r10
>   3cc:	7d 20 00 a6 	mfmsr   r9
>   3d0:	55 29 07 fa 	rlwinm  r9,r9,0,31,29
>   3d4:	55 29 04 5e 	rlwinm  r9,r9,0,17,15
>   3d8:	7d 20 01 24 	mtmsr   r9
>   3dc:	4e 80 00 20 	blr
>   3e0:	94 21 ff f0 	stwu    r1,-16(r1)
>   3e4:	7c 08 02 a6 	mflr    r0
>   3e8:	90 01 00 14 	stw     r0,20(r1)
>   3ec:	48 00 00 01 	bl      3ec <interrupt_exit_kernel_prepare+0x44>
> 			3ec: R_PPC_REL24	unrecoverable_exception
>   3f0:	38 e2 00 70 	addi    r7,r2,112
>   3f4:	3d 00 00 01 	lis     r8,1
>   3f8:	7c c0 38 28 	lwarx   r6,0,r7
>   3fc:	7c c6 40 78 	andc    r6,r6,r8
>   400:	7c c0 39 2d 	stwcx.  r6,0,r7
>   404:	40 a2 ff f4 	bne     3f8 <interrupt_exit_kernel_prepare+0x50>
>   408:	38 60 00 01 	li      r3,1
>   40c:	4b ff ff b4 	b       3c0 <interrupt_exit_kernel_prepare+0x18>
> 
> Without the modification:
> 
> 000003a8 <interrupt_exit_kernel_prepare>:
>   3a8:	94 21 ff f0 	stwu    r1,-16(r1)
>   3ac:	93 e1 00 0c 	stw     r31,12(r1)
>   3b0:	81 23 00 84 	lwz     r9,132(r3)
>   3b4:	71 29 00 02 	andi.   r9,r9,2
>   3b8:	41 82 00 38 	beq     3f0 <interrupt_exit_kernel_prepare+0x48>
>   3bc:	81 22 00 70 	lwz     r9,112(r2)
>   3c0:	75 23 00 01 	andis.  r3,r9,1
>   3c4:	40 82 00 4c 	bne     410 <interrupt_exit_kernel_prepare+0x68>
>   3c8:	7d 20 00 a6 	mfmsr   r9
>   3cc:	55 29 04 5e 	rlwinm  r9,r9,0,17,15
>   3d0:	7d 20 01 24 	mtmsr   r9
>   3d4:	7d 20 00 a6 	mfmsr   r9
>   3d8:	55 29 07 fa 	rlwinm  r9,r9,0,31,29
>   3dc:	55 29 04 5e 	rlwinm  r9,r9,0,17,15
>   3e0:	7d 20 01 24 	mtmsr   r9
>   3e4:	83 e1 00 0c 	lwz     r31,12(r1)
>   3e8:	38 21 00 10 	addi    r1,r1,16
>   3ec:	4e 80 00 20 	blr
>   3f0:	7c 08 02 a6 	mflr    r0
>   3f4:	90 01 00 14 	stw     r0,20(r1)
>   3f8:	48 00 00 01 	bl      3f8 <interrupt_exit_kernel_prepare+0x50>
> 			3f8: R_PPC_REL24	unrecoverable_exception
>   3fc:	81 22 00 70 	lwz     r9,112(r2)
>   400:	80 01 00 14 	lwz     r0,20(r1)
>   404:	75 23 00 01 	andis.  r3,r9,1
>   408:	7c 08 03 a6 	mtlr    r0
>   40c:	41 82 ff bc 	beq     3c8 <interrupt_exit_kernel_prepare+0x20>
>   410:	39 02 00 70 	addi    r8,r2,112
>   414:	3d 20 00 01 	lis     r9,1
>   418:	7c e0 40 28 	lwarx   r7,0,r8
>   41c:	7c e7 48 78 	andc    r7,r7,r9
>   420:	7c e0 41 2d 	stwcx.  r7,0,r8
>   424:	40 a2 ff f4 	bne     418 <interrupt_exit_kernel_prepare+0x70>
>   428:	38 60 00 01 	li      r3,1
>   42c:	7d 20 00 a6 	mfmsr   r9
>   430:	55 29 04 5e 	rlwinm  r9,r9,0,17,15
>   434:	7d 20 01 24 	mtmsr   r9
>   438:	7d 20 00 a6 	mfmsr   r9
>   43c:	55 29 07 fa 	rlwinm  r9,r9,0,31,29
>   440:	55 29 04 5e 	rlwinm  r9,r9,0,17,15
>   444:	7d 20 01 24 	mtmsr   r9
>   448:	83 e1 00 0c 	lwz     r31,12(r1)
>   44c:	38 21 00 10 	addi    r1,r1,16
>   450:	4e 80 00 20 	blr
> 


More information about the Linuxppc-dev mailing list