Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1922299pxb; Wed, 10 Feb 2021 22:36:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJysKJFv2ikG6GH5eQmDJ3KsRMPKWLYSe2Y0JKh9dy89MEkQqAZZCONucekA6yWg+s2ZC2L5 X-Received: by 2002:a17:906:5653:: with SMTP id v19mr6937417ejr.481.1613025387806; Wed, 10 Feb 2021 22:36:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613025387; cv=none; d=google.com; s=arc-20160816; b=I1csaNha4Jw07tZJeO1N3Fwbl1j8hOGv2TeLT5roFE2ULHhPPYV9sitrKaGMuFwJFX Tr5EkJ2gmStreMSjBxXi+kAOXkvegYDU/apVkxU0a4wXQ3glEY2n7J/mBSoy9rE2Q7/X 7KV+ulW0Mk5G4++XKTphh0TQMs1c5zQ13nQv+GCI4h+qzNMdlRroVLnjq2CvGQ88WTNO nV6JQ8Km3wszDO/aMkXA9KAajyrkDyP8mr2lkVRxX3kzPEK49bRRdi8pcvQngxSCNV5z 8A5IvatmTHS53wJpZJxvSsokIxhEt3WlouqnwBfe4/ulnjwG1VoFvv5orsF9XlJ+SYL6 qsPw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:date:cc:to:subject:from:message-id; bh=8LWkeTcbdqSTJfcgPMMYYKy6ZQTf7nsTj9Kw0EyXBWM=; b=zy3gnyt1zkdGc/2fbxfluPW3xawyArtRaoJWEnb/CUkrJwaUfCYtTfvf083To4hbFX ShDXvCmADzelGLIeviohvF09uC6mFw08UKFUb2rIoE66ey62kzAtIXF2orrH/6iOq+qi Ocu9HLCw+wppejjQ9sl9WMCOTixI0rIWOvJClcQvA/0W5HKmrNX3WTd8kG+zvC7L5Asg naNH48dw56lY9zoGih3vR7R2htBabOmXMeJ/gbsokFvLSuHSDUA4wWCsg599TNlXOwy1 V9nuNOJg85s+LBgtpDmUThaaqippEb1PkruU567jjm8v36N/QN97qhSUwu1Ok66fu1jS TtQQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b2si2891454ejk.68.2021.02.10.22.36.01; Wed, 10 Feb 2021 22:36:27 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229478AbhBKGfb (ORCPT + 99 others); Thu, 11 Feb 2021 01:35:31 -0500 Received: from pegase1.c-s.fr ([93.17.236.30]:55710 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229451AbhBKGfa (ORCPT ); Thu, 11 Feb 2021 01:35:30 -0500 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 4Dbn0z31Swz9v06X; Thu, 11 Feb 2021 07:34:43 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id q5QSYBhhbmsT; Thu, 11 Feb 2021 07:34:43 +0100 (CET) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 4Dbn0z1d1Zz9v06P; Thu, 11 Feb 2021 07:34:43 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 099738B815; Thu, 11 Feb 2021 07:34:44 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id AveMarLnpIeC; Thu, 11 Feb 2021 07:34:43 +0100 (CET) Received: from po16121vm.idsi0.si.c-s.fr (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id B115A8B771; Thu, 11 Feb 2021 07:34:43 +0100 (CET) Received: by po16121vm.idsi0.si.c-s.fr (Postfix, from userid 0) id 89DBB67377; Thu, 11 Feb 2021 06:34:43 +0000 (UTC) Message-Id: From: Christophe Leroy Subject: [PATCH] powerpc/traps: Declare unrecoverable_exception() as __noreturn To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , npiggin@gmail.com Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Date: Thu, 11 Feb 2021 06:34:43 +0000 (UTC) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org unrecoverable_exception() is never expected to return, most callers have an infiniteloop in case it returns. Ensure it really never returns by terminating it with a BUG(), and declare it __no_return. It always GCC to really simplify functions calling it. In the exemple below, it avoids the stack frame in the likely fast path and avoids code duplication for the exit. With this patch: 00000348 : 348: 81 43 00 84 lwz r10,132(r3) 34c: 71 48 00 02 andi. r8,r10,2 350: 41 82 00 2c beq 37c 354: 71 4a 40 00 andi. r10,r10,16384 358: 40 82 00 20 bne 378 35c: 80 62 00 70 lwz r3,112(r2) 360: 74 63 00 01 andis. r3,r3,1 364: 40 82 00 28 bne 38c 368: 7d 40 00 a6 mfmsr r10 36c: 7c 11 13 a6 mtspr 81,r0 370: 7c 12 13 a6 mtspr 82,r0 374: 4e 80 00 20 blr 378: 48 00 00 00 b 378 37c: 94 21 ff f0 stwu r1,-16(r1) 380: 7c 08 02 a6 mflr r0 384: 90 01 00 14 stw r0,20(r1) 388: 48 00 00 01 bl 388 388: R_PPC_REL24 unrecoverable_exception 38c: 38 e2 00 70 addi r7,r2,112 390: 3d 00 00 01 lis r8,1 394: 7c c0 38 28 lwarx r6,0,r7 398: 7c c6 40 78 andc r6,r6,r8 39c: 7c c0 39 2d stwcx. r6,0,r7 3a0: 40 a2 ff f4 bne 394 3a4: 38 60 00 01 li r3,1 3a8: 4b ff ff c0 b 368 Without this patch: 00000348 : 348: 94 21 ff f0 stwu r1,-16(r1) 34c: 93 e1 00 0c stw r31,12(r1) 350: 7c 7f 1b 78 mr r31,r3 354: 81 23 00 84 lwz r9,132(r3) 358: 71 2a 00 02 andi. r10,r9,2 35c: 41 82 00 34 beq 390 360: 71 29 40 00 andi. r9,r9,16384 364: 40 82 00 28 bne 38c 368: 80 62 00 70 lwz r3,112(r2) 36c: 74 63 00 01 andis. r3,r3,1 370: 40 82 00 3c bne 3ac 374: 7d 20 00 a6 mfmsr r9 378: 7c 11 13 a6 mtspr 81,r0 37c: 7c 12 13 a6 mtspr 82,r0 380: 83 e1 00 0c lwz r31,12(r1) 384: 38 21 00 10 addi r1,r1,16 388: 4e 80 00 20 blr 38c: 48 00 00 00 b 38c 390: 7c 08 02 a6 mflr r0 394: 90 01 00 14 stw r0,20(r1) 398: 48 00 00 01 bl 398 398: R_PPC_REL24 unrecoverable_exception 39c: 80 01 00 14 lwz r0,20(r1) 3a0: 81 3f 00 84 lwz r9,132(r31) 3a4: 7c 08 03 a6 mtlr r0 3a8: 4b ff ff b8 b 360 3ac: 39 02 00 70 addi r8,r2,112 3b0: 3d 40 00 01 lis r10,1 3b4: 7c e0 40 28 lwarx r7,0,r8 3b8: 7c e7 50 78 andc r7,r7,r10 3bc: 7c e0 41 2d stwcx. r7,0,r8 3c0: 40 a2 ff f4 bne 3b4 3c4: 38 60 00 01 li r3,1 3c8: 4b ff ff ac b 374 Signed-off-by: Christophe Leroy --- arch/powerpc/include/asm/interrupt.h | 2 +- arch/powerpc/kernel/interrupt.c | 1 - arch/powerpc/kernel/traps.c | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/include/asm/interrupt.h b/arch/powerpc/include/asm/interrupt.h index dcff30e3919b..fa8bfb91f8df 100644 --- a/arch/powerpc/include/asm/interrupt.h +++ b/arch/powerpc/include/asm/interrupt.h @@ -411,7 +411,7 @@ DECLARE_INTERRUPT_HANDLER(altivec_assist_exception); DECLARE_INTERRUPT_HANDLER(CacheLockingException); DECLARE_INTERRUPT_HANDLER(SPEFloatingPointException); DECLARE_INTERRUPT_HANDLER(SPEFloatingPointRoundException); -DECLARE_INTERRUPT_HANDLER(unrecoverable_exception); +DECLARE_INTERRUPT_HANDLER(unrecoverable_exception) __noreturn; DECLARE_INTERRUPT_HANDLER(WatchdogException); DECLARE_INTERRUPT_HANDLER(kernel_bad_stack); diff --git a/arch/powerpc/kernel/interrupt.c b/arch/powerpc/kernel/interrupt.c index eca3be36c18c..7e7106641ca9 100644 --- a/arch/powerpc/kernel/interrupt.c +++ b/arch/powerpc/kernel/interrupt.c @@ -440,7 +440,6 @@ notrace unsigned long interrupt_exit_user_prepare(struct pt_regs *regs, unsigned return ret; } -void unrecoverable_exception(struct pt_regs *regs); void preempt_schedule_irq(void); notrace unsigned long interrupt_exit_kernel_prepare(struct pt_regs *regs, unsigned long msr) diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 2afa05ad21c8..1ff776e9e8e3 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -2173,6 +2173,8 @@ DEFINE_INTERRUPT_HANDLER(unrecoverable_exception) pr_emerg("Unrecoverable exception %lx at %lx (msr=%lx)\n", regs->trap, regs->nip, regs->msr); die("Unrecoverable exception", regs, SIGABRT); + /* die() should not return */ + BUG(); } NOKPROBE_SYMBOL(unrecoverable_exception); -- 2.25.0