From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE6ABC43334 for ; Thu, 7 Jul 2022 14:41:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235510AbiGGOlo (ORCPT ); Thu, 7 Jul 2022 10:41:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35118 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235982AbiGGOla (ORCPT ); Thu, 7 Jul 2022 10:41:30 -0400 Received: from mout.kundenserver.de (mout.kundenserver.de [217.72.192.74]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9F0EF31DF4 for ; Thu, 7 Jul 2022 07:41:29 -0700 (PDT) Received: from mail-yw1-f174.google.com ([209.85.128.174]) by mrelayeu.kundenserver.de (mreue109 [213.165.67.113]) with ESMTPSA (Nemesis) id 1MA7Su-1oJt652ehm-00BbuM for ; Thu, 07 Jul 2022 16:41:27 +0200 Received: by mail-yw1-f174.google.com with SMTP id 00721157ae682-31c86fe1dddso124494707b3.1 for ; Thu, 07 Jul 2022 07:41:27 -0700 (PDT) X-Gm-Message-State: AJIora/2p63JSg5OpuJ6f2F31WNWvTf5mESUM6zvGnmSgrhz64XwHZuW ZLqS9fZ13SlJ27vYb39oqom4twlcWV7tyeWPlck= X-Google-Smtp-Source: AGRyM1ugCMrUPgxLUvxIRQZLC1zdIj2O+Vxq6ia7yT/fLej4bF43FUE/j7cYL5pmPy3Gz3VGYzGIau7ei5jBYmPiCD0= X-Received: by 2002:a0d:df0f:0:b0:31b:e000:7942 with SMTP id i15-20020a0ddf0f000000b0031be0007942mr50077266ywe.320.1657204886416; Thu, 07 Jul 2022 07:41:26 -0700 (PDT) MIME-Version: 1.0 References: <20220707110511.52129-1-zhengqi.arch@bytedance.com> <20220707110511.52129-3-zhengqi.arch@bytedance.com> <42bfd82c-b3fb-c942-d6f2-ae5adec90a26@bytedance.com> In-Reply-To: <42bfd82c-b3fb-c942-d6f2-ae5adec90a26@bytedance.com> From: Arnd Bergmann Date: Thu, 7 Jul 2022 16:41:08 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [RFC PATCH 2/2] arm64: support HAVE_IRQ_EXIT_ON_IRQ_STACK To: Qi Zheng Cc: Arnd Bergmann , Catalin Marinas , Will Deacon , Linux ARM , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" X-Provags-ID: V03:K1:lYjdV6iRvmKX6gHHIsoRJjfmbtBpvuRfe0a+FzlTlroi9hWEZZF vLvI/I95iGhdYnIR7wRtYdxLCu0vqfz5YeB5OCxi/BAkFgUcNqJmx/Hfp3NkMHXCufR9T6R 7nwFRS4VUDShHEtGGle9AVwYkW8S3Belopo46QXYBhAWzeDAnGAKCdBLlNqIv8OMVyESlnH Z+DTs0lH131ygUrQrZ4vw== X-UI-Out-Filterresults: notjunk:1;V03:K0:h6omgu/DZns=:RLyckYvvWyeEmv1+hHo7ac iFwaeM+arwfyQDYBpnTQoZg0ZrwOKYu5iZWLOseTlb/dGzoEEAIsuuTwhonPzizhl4/SpPgz0 bDqLjyrxaYXcBgDs3Iu1DYlj8O3y3/Y7Upy1kvcjYV+9bCh6MW/Q13ubp3kErX5bzGpgKRajG iT71heKw2HGGgALf5fumyXW8NHiAh+rkt6GQmxrDyPVFgHHBrj3pieuQEaRtSmb8XttTLmynk xk2drbfPWh8ALOYjQSnvIqlW3Fb+R621PvFeuZbdyF/coYgclCWp5/tXQKN7cTwD9c7X9U6+9 PskKSFHRBC3hhxM1bMW8zS/50yV6+39Xk55pwh9D9EVaNUxZb2dVnTMpnBPJ+0uWvya5ajNF0 /VrbzD0Iqm+8TAZy/5x12u7MgV3IlBiSnQ9BvbYQmVhf34zZGgWNjhKuiqWRypw1lHrqSTkNr E+GSVMIScZVReZltMHCLEyFEPA6+A+e9Z1XLsUiVLi1SwLvCPqjswQpmPOhiSJg8HbAh0/SKW qwp5LBmi98+zsAjAfCPlpTjGNerW3p0HGDa3uqikqB8EvOmWPAXVEiO9eZxIfAUZ/bak981ZC ZaOlkPP0+ZrL4Xzc0B+eOd4+irB6dyrRFE5OBPBp8Bi310XX8IZbg8XnwBeT2fdmsYoB46Rl3 XxVK2ahlTudVypma7rtYLqNwUfQl9sfshvj3DQ9nx24SxCv9EO4rmS4jjHd9O5GN6+RIsXQmc 6t1xpWMsc8FbdI4GT13PsCaK2gV0dg/R2yaOV8VouMXFRbxH/IzWZ8qOaGiiOQiQ4uC8fmiGe N4sBSR+v4TLqvxNCA44yL36aIV6L4bDnG1XPprd4rkY/56FSWQKhRgXInOgiX99Md7Q9AA6Kw e0mqgZPE2uzNJP1DfGRQ== Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jul 7, 2022 at 3:38 PM Qi Zheng wrote: > On 2022/7/7 20:49, Arnd Bergmann wrote: > > On Thu, Jul 7, 2022 at 1:05 PM Qi Zheng wrote: > * Restore the SP from the FP, and restore the FP and LR from > the frame > * record. > */ > - mov sp, x29 > +999: mov sp, x29 > ldp x29, x30, [sp], #16 > #ifdef CONFIG_SHADOW_CALL_STACK > ldp scs_sp, xzr, [sp], #16 > > But this also requires a new parameter in do_interrupt_handler. > > I also considered implementing call_on_irq_stack() for nmi and irq > separately, but later think it's unnecessary. What I had in mind was something along the lines of diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c index 56cefd33eb8e..432042b91588 100644 --- a/arch/arm64/kernel/entry-common.c +++ b/arch/arm64/kernel/entry-common.c @@ -270,10 +270,7 @@ static void do_interrupt_handler(struct pt_regs *regs, { struct pt_regs *old_regs = set_irq_regs(regs); - if (on_thread_stack()) - call_on_irq_stack(regs, handler); - else - handler(regs); + handler(regs); set_irq_regs(old_regs); } @@ -473,16 +470,31 @@ static void noinstr el1_interrupt(struct pt_regs *regs, __el1_irq(regs, handler); } -asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs) +static void noinstr el1_irq(struct pt_regs *regs) { el1_interrupt(regs, handle_arch_irq); } -asmlinkage void noinstr el1h_64_fiq_handler(struct pt_regs *regs) +asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs) +{ + if (on_thread_stack()) + call_on_irq_stack(regs, el1_irq); + else + el1_irq(regs); +} + +static void noinstr el1_fiq(struct pt_regs *regs) { el1_interrupt(regs, handle_arch_fiq); } +asmlinkage void noinstr el1h_64_fiq_handler(struct pt_regs *regs) +{ + if (on_thread_stack()) + call_on_irq_stack(regs, el1_fiq); + else + el1_fiq(regs); +} + asmlinkage void noinstr el1h_64_error_handler(struct pt_regs *regs) { unsigned long esr = read_sysreg(esr_el1); @@ -713,7 +731,7 @@ static void noinstr __el0_irq_handler_common(struct pt_regs *regs) asmlinkage void noinstr el0t_64_irq_handler(struct pt_regs *regs) { - __el0_irq_handler_common(regs); + call_on_irq_stack(regs, __el0_irq_handler_common); } static void noinstr __el0_fiq_handler_common(struct pt_regs *regs) @@ -723,7 +741,7 @@ static void noinstr __el0_fiq_handler_common(struct pt_regs *regs) asmlinkage void noinstr el0t_64_fiq_handler(struct pt_regs *regs) { - __el0_fiq_handler_common(regs); + call_on_irq_stack(regs, __el0_fiq_handler_common); } static void noinstr __el0_error_handler_common(struct pt_regs *regs) @@ -807,12 +825,12 @@ asmlinkage void noinstr el0t_32_sync_handler(struct pt_regs *regs) asmlinkage void noinstr el0t_32_irq_handler(struct pt_regs *regs) { - __el0_irq_handler_common(regs); + call_on_irq_stack(regs, __el0_irq_handler_common); } asmlinkage void noinstr el0t_32_fiq_handler(struct pt_regs *regs) { - __el0_fiq_handler_common(regs); + call_on_irq_stack(regs, __el0_fiq_handler_common); } asmlinkage void noinstr el0t_32_error_handler(struct pt_regs *regs) Not sure if that works. Arnd From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 07075C433EF for ; Thu, 7 Jul 2022 14:42:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=51TxSQCtxKuaaWPM9IYvB+yFDolAMxwK2tHPdu2nXAI=; b=0AUGSydGQxqTp+ BQw6h+bvz4YniCIUzYxgLFF/4x9u/kseaZjcfH/q1HIZCmhHtOaa+DFSZ40ZlnR9KeXZnXjW/M0NE /RV15LnDOYPxOUA242a7NrtI/xoFynK7GgKVH8VGkQorg5i/8pLoWfztput4m4UZyiO69JCMAiDin f3ZehaU6r3u8U1aPh9kL7KXq1kQsxnWy0u7+2peIstH7+K0KMZQ8RzTsM9TICc6laRSiywiR4MgJF Kjc6QBsGe/bpGL51DVsOB2SkRU4hiorBkS/eEsS99mdFob0AsuD7/szEjqrnkLRpcqZtqS8EqhurL rfii4S10LZ8IwYZ+LJ6Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9ShC-00GXIR-Tn; Thu, 07 Jul 2022 14:41:35 +0000 Received: from mout.kundenserver.de ([212.227.126.131]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9Sh8-00GXDd-QK for linux-arm-kernel@lists.infradead.org; Thu, 07 Jul 2022 14:41:32 +0000 Received: from mail-yw1-f173.google.com ([209.85.128.173]) by mrelayeu.kundenserver.de (mreue010 [213.165.67.97]) with ESMTPSA (Nemesis) id 1MEVFi-1oOGoH2WiY-00G0W2 for ; Thu, 07 Jul 2022 16:41:27 +0200 Received: by mail-yw1-f173.google.com with SMTP id 00721157ae682-3137316bb69so171735947b3.10 for ; Thu, 07 Jul 2022 07:41:27 -0700 (PDT) X-Gm-Message-State: AJIora9aPOVc8w1XWtAG0AXzFepEnfhtqhERsnmjgEHF4iiEgwX3IIxz CLumxf/Gcw5nU+G506ychury/KGla/oWwhdUi3w= X-Google-Smtp-Source: AGRyM1ugCMrUPgxLUvxIRQZLC1zdIj2O+Vxq6ia7yT/fLej4bF43FUE/j7cYL5pmPy3Gz3VGYzGIau7ei5jBYmPiCD0= X-Received: by 2002:a0d:df0f:0:b0:31b:e000:7942 with SMTP id i15-20020a0ddf0f000000b0031be0007942mr50077266ywe.320.1657204886416; Thu, 07 Jul 2022 07:41:26 -0700 (PDT) MIME-Version: 1.0 References: <20220707110511.52129-1-zhengqi.arch@bytedance.com> <20220707110511.52129-3-zhengqi.arch@bytedance.com> <42bfd82c-b3fb-c942-d6f2-ae5adec90a26@bytedance.com> In-Reply-To: <42bfd82c-b3fb-c942-d6f2-ae5adec90a26@bytedance.com> From: Arnd Bergmann Date: Thu, 7 Jul 2022 16:41:08 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [RFC PATCH 2/2] arm64: support HAVE_IRQ_EXIT_ON_IRQ_STACK To: Qi Zheng Cc: Arnd Bergmann , Catalin Marinas , Will Deacon , Linux ARM , Linux Kernel Mailing List X-Provags-ID: V03:K1:7y6GNI7zQjXsjHb7w3BF12WDM8ORHVE8Fk6+6Wij3/KtfGle+Pw /pMOTze6aruhPjCx7FCF2KaxYMOgIo+OfyY5VK/pjTOotqCqGWIMUyWWwQwfFlW/k+VyDzU UNi/Cthb3fX05WyDQsRZWJP2DXHcRT6H62yawkA4zP1wdkEyvpIXz7VVpU+1ZG50YqIBOho vIFgjQ6OsoL4P8bMQElbQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:PE/uzWKqzWM=:+jpBepKGeQbfxkB9T+cBtg CnvOw3npYaW5V12z3BB8TH2NOksnqMShs5iFf48IDb8osrsvZv+EO0h3El8Fde9SKBytyu9ch +MPTzbpUN7iYhgewcIl8zDQf9DztY7nzNeo1Uq6nkf/bU0V1ZwaOZm8rDMz8lbFnO8UOK2vF0 y4qI2Hx/hiO/xOMQQJjMsJafunYLs1hWdOXMnJdYxw3LGQxXIpziqExEtsxVcrCdGlEy0Vunb Pu72AW5LzT2Eq1THjYdi8/fW18mkFwW7Rx8Ej1zK/Stqwxy68I2u5QAW3z24GG0/t9/IoGsla 53EkBLG17zAVe19QMGTAjEf5PuSjgmz5Qp1KMAm4yLllGBKUVA8IrDFHosdWRmR4cxD9FbGN2 E5qqAeLzYXrJp2P0i80UYj3bNK2khDIUa10UYeTahwjuq3uzJltTjpc+FCMxaL3bfxUlqVXnt wt/XxN3nNssFhKVAFYtQMvRq5bNarqdIhcAHmeYUjLe5wQvmdgX3KV3avkD7l/zidtOWoGLZ7 EwbFgThwhyquCLXdLF0AptdRTwLV3vHwRk6rRyutIyx1Mh8WPQiMtzLVN7NBhYgHl52d7kVng Sjy6zAwNvLiaq1A8F1+hQ9xTc+txxNn1mlIeegV2iv1ih3GIwnEknq2XiI4w0bkhO93B17DU7 z6IwtZmiPwvd7l5dQPf9MOfeqoIYf77076wEV1AF3OL8NVLHRkwUVegHKNOK3hbew3L/MV7dO Hp9fgr6T8NKhoeAfDuOSwNDCmCM0VFmjEVJFLqomz5JubNTtMwH5JwfIU4mE+VROcOWkDyuDy f0nJV/SrZEnrWjy+7uWQ4mWkxi9yNctFd2w5xJ3Fxqi/iFzhe5CE223R7s5GUdPzzSvwpT0xH 5Fc7QwuK9wKTAcgZcWpw== X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220707_074131_171768_8DE5B952 X-CRM114-Status: GOOD ( 16.13 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Thu, Jul 7, 2022 at 3:38 PM Qi Zheng wrote: > On 2022/7/7 20:49, Arnd Bergmann wrote: > > On Thu, Jul 7, 2022 at 1:05 PM Qi Zheng wrote: > * Restore the SP from the FP, and restore the FP and LR from > the frame > * record. > */ > - mov sp, x29 > +999: mov sp, x29 > ldp x29, x30, [sp], #16 > #ifdef CONFIG_SHADOW_CALL_STACK > ldp scs_sp, xzr, [sp], #16 > > But this also requires a new parameter in do_interrupt_handler. > > I also considered implementing call_on_irq_stack() for nmi and irq > separately, but later think it's unnecessary. What I had in mind was something along the lines of diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c index 56cefd33eb8e..432042b91588 100644 --- a/arch/arm64/kernel/entry-common.c +++ b/arch/arm64/kernel/entry-common.c @@ -270,10 +270,7 @@ static void do_interrupt_handler(struct pt_regs *regs, { struct pt_regs *old_regs = set_irq_regs(regs); - if (on_thread_stack()) - call_on_irq_stack(regs, handler); - else - handler(regs); + handler(regs); set_irq_regs(old_regs); } @@ -473,16 +470,31 @@ static void noinstr el1_interrupt(struct pt_regs *regs, __el1_irq(regs, handler); } -asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs) +static void noinstr el1_irq(struct pt_regs *regs) { el1_interrupt(regs, handle_arch_irq); } -asmlinkage void noinstr el1h_64_fiq_handler(struct pt_regs *regs) +asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs) +{ + if (on_thread_stack()) + call_on_irq_stack(regs, el1_irq); + else + el1_irq(regs); +} + +static void noinstr el1_fiq(struct pt_regs *regs) { el1_interrupt(regs, handle_arch_fiq); } +asmlinkage void noinstr el1h_64_fiq_handler(struct pt_regs *regs) +{ + if (on_thread_stack()) + call_on_irq_stack(regs, el1_fiq); + else + el1_fiq(regs); +} + asmlinkage void noinstr el1h_64_error_handler(struct pt_regs *regs) { unsigned long esr = read_sysreg(esr_el1); @@ -713,7 +731,7 @@ static void noinstr __el0_irq_handler_common(struct pt_regs *regs) asmlinkage void noinstr el0t_64_irq_handler(struct pt_regs *regs) { - __el0_irq_handler_common(regs); + call_on_irq_stack(regs, __el0_irq_handler_common); } static void noinstr __el0_fiq_handler_common(struct pt_regs *regs) @@ -723,7 +741,7 @@ static void noinstr __el0_fiq_handler_common(struct pt_regs *regs) asmlinkage void noinstr el0t_64_fiq_handler(struct pt_regs *regs) { - __el0_fiq_handler_common(regs); + call_on_irq_stack(regs, __el0_fiq_handler_common); } static void noinstr __el0_error_handler_common(struct pt_regs *regs) @@ -807,12 +825,12 @@ asmlinkage void noinstr el0t_32_sync_handler(struct pt_regs *regs) asmlinkage void noinstr el0t_32_irq_handler(struct pt_regs *regs) { - __el0_irq_handler_common(regs); + call_on_irq_stack(regs, __el0_irq_handler_common); } asmlinkage void noinstr el0t_32_fiq_handler(struct pt_regs *regs) { - __el0_fiq_handler_common(regs); + call_on_irq_stack(regs, __el0_fiq_handler_common); } asmlinkage void noinstr el0t_32_error_handler(struct pt_regs *regs) Not sure if that works. Arnd _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel