From patchwork Fri Sep 12 17:23:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Russell King - ARM Linux X-Patchwork-Id: 4896661 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id BE9A9BEEA5 for ; Fri, 12 Sep 2014 17:26:02 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CD214200E8 for ; Fri, 12 Sep 2014 17:26:01 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C4662200E6 for ; Fri, 12 Sep 2014 17:26:00 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1XSUZy-00070a-D9; Fri, 12 Sep 2014 17:24:14 +0000 Received: from pandora.arm.linux.org.uk ([2001:4d48:ad52:3201:214:fdff:fe10:1be6]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1XSUZu-0006sF-Ed for linux-arm-kernel@lists.infradead.org; Fri, 12 Sep 2014 17:24:11 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=arm.linux.org.uk; s=pandora-2014; h=Sender:In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=SN0hzOQ66WMRQOKNP/lRPjJWtT79TvMzgtdcXZZ00As=; b=KFLUhmXRxkmEfv7E9BbT1LzgHYSWDO1r4Jyu1jlS1NGnJKoF90J61vlyohZXeQwdoAKEEjbUWJerga/tEF2BSAPjfCTvmo4OcmjHf4XhdlRMVwPuk7ejNPwLSuBhdJ8XlGQNMCD333l5o8Hy6VdwdUBbqZAXjxoZ4GKelCIF+/4=; Received: from n2100.arm.linux.org.uk ([2002:4e20:1eda:1:214:fdff:fe10:4f86]:33082) by pandora.arm.linux.org.uk with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XSUZR-0006Zk-IX; Fri, 12 Sep 2014 18:23:41 +0100 Received: from linux by n2100.arm.linux.org.uk with local (Exim 4.76) (envelope-from ) id 1XSUZO-0000oS-4N; Fri, 12 Sep 2014 18:23:38 +0100 Date: Fri, 12 Sep 2014 18:23:37 +0100 From: Russell King - ARM Linux To: Daniel Thompson Subject: Re: [PATCH 3.17-rc4 v5 2/6] arm: fiq: Replace default FIQ handler Message-ID: <20140912172337.GQ12361@n2100.arm.linux.org.uk> References: <1410272111-30516-1-git-send-email-daniel.thompson@linaro.org> <1410435078-28462-1-git-send-email-daniel.thompson@linaro.org> <1410435078-28462-3-git-send-email-daniel.thompson@linaro.org> <20140912171404.GO12361@n2100.arm.linux.org.uk> <20140912171908.GP12361@n2100.arm.linux.org.uk> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20140912171908.GP12361@n2100.arm.linux.org.uk> User-Agent: Mutt/1.5.19 (2009-01-05) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140912_102410_847265_23981343 X-CRM114-Status: GOOD ( 28.37 ) X-Spam-Score: -2.3 (--) Cc: linaro-kernel@lists.linaro.org, patches@linaro.org, Catalin Marinas , linux-kernel@vger.kernel.org, John Stultz , Thomas Gleixner , Sumit Semwal , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_NONE,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Fri, Sep 12, 2014 at 06:19:08PM +0100, Russell King - ARM Linux wrote: > On Fri, Sep 12, 2014 at 06:14:04PM +0100, Russell King - ARM Linux wrote: > > On Thu, Sep 11, 2014 at 12:31:14PM +0100, Daniel Thompson wrote: > > > This patch introduces a new default FIQ handler that is structured in a > > > similar way to the existing ARM exception handler and result in the FIQ > > > being handled by C code running on the SVC stack (despite this code run > > > in the FIQ handler is subject to severe limitations with respect to > > > locking making normal interaction with the kernel impossible). > > > > > > This default handler allows concepts that on x86 would be handled using > > > NMIs to be realized on ARM. > > > > Okay, lastly... I sent you my version of this change, which contained > > the changes I've detailed in the previous three emails, which are absent > > from your version. > > > > However, you've taken on board the "trace" thing to svc_entry, and > > renamed it to "call_trace". > > > > Now if I add this to usr_entry, "call_trace" doesn't make any sense, > > nor does the .if/.endif placement because it's not just trace_hardirqs_off > > which needs to be disabled there, but also ct_user_exit as well. > > > > I'm beginning to wonder why I tried to be nice here... it would've been > > a lot faster for me to take your patch, make my own changes and commit > > that instead. > > > > Frustrated. > > And another thing you're missing are the updates to arch/arm/kernel/fiq.c > to ensure that the FIQ registers are preserved when we restore this new > default FIQ handler. Right, here's my remaining delta from your patch addressing all the points from the last five emails. If you have any disagreements with any of these changes, then please discuss rather than choosing to ignore them. 107e32b0b4ef5fa4191c9fc8415ca172b886e958 diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 0c70fee9a7c9..3f6293ce0f2d 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -146,7 +146,7 @@ ENDPROC(__und_invalid) #define SPFIX(code...) #endif - .macro svc_entry, stack_hole=0, call_trace=1 + .macro svc_entry, stack_hole=0, trace=1 UNWIND(.fnstart ) UNWIND(.save {r0 - pc} ) sub sp, sp, #(S_FRAME_SIZE + \stack_hole - 4) @@ -182,11 +182,11 @@ ENDPROC(__und_invalid) @ stmia r7, {r2 - r6} + .if \trace #ifdef CONFIG_TRACE_IRQFLAGS - .if \call_trace bl trace_hardirqs_off - .endif #endif + .endif .endm .align 5 @@ -298,7 +298,7 @@ ENDPROC(__pabt_svc) .align 5 __fiq_svc: - svc_entry 0, 0 + svc_entry trace=0 mov r0, sp @ struct pt_regs *regs bl handle_fiq_as_nmi svc_exit_via_fiq @@ -326,7 +326,7 @@ ENDPROC(__fiq_svc) @ .align 5 __fiq_abt: - svc_entry 0, 0 + svc_entry trace=0 ARM( msr cpsr_c, #ABT_MODE | PSR_I_BIT | PSR_F_BIT ) THUMB( mov r0, #ABT_MODE | PSR_I_BIT | PSR_F_BIT ) @@ -353,7 +353,7 @@ __fiq_abt: svc_exit_via_fiq UNWIND(.fnend ) -ENDPROC(__fiq_svc) +ENDPROC(__fiq_abt) /* * User mode handlers @@ -365,7 +365,7 @@ ENDPROC(__fiq_svc) #error "sizeof(struct pt_regs) must be a multiple of 8" #endif - .macro usr_entry + .macro usr_entry, trace=1 UNWIND(.fnstart ) UNWIND(.cantunwind ) @ don't unwind the user space sub sp, sp, #S_FRAME_SIZE @@ -402,10 +402,12 @@ ENDPROC(__fiq_svc) @ zero_fp + .if \trace #ifdef CONFIG_IRQSOFF_TRACER bl trace_hardirqs_off #endif ct_user_exit save = 0 + .endif .endm .macro kuser_cmpxchg_check @@ -736,13 +738,13 @@ ENDPROC(ret_from_exception) .align 5 __fiq_usr: - usr_entry + usr_entry trace=0 kuser_cmpxchg_check mov r0, sp @ struct pt_regs *regs bl handle_fiq_as_nmi get_thread_info tsk - mov why, #0 - b ret_to_user_from_irq + restore_user_regs fast = 0, offset = 0 + UNWIND(.cantunwind ) UNWIND(.fnend ) ENDPROC(__fiq_usr) diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index 918875d96d5d..1743049c433b 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c @@ -53,6 +53,7 @@ }) static unsigned long no_fiq_insn; +static struct pt_regs def_fiq_regs; /* Default reacquire function * - we always relinquish FIQ control @@ -60,8 +61,15 @@ static unsigned long no_fiq_insn; */ static int fiq_def_op(void *ref, int relinquish) { - if (!relinquish) + if (!relinquish) { + /* Restore default handler and registers */ + local_fiq_disable(); + set_fiq_regs(&dfl_fiq_regs); set_fiq_handler(&no_fiq_insn, sizeof(no_fiq_insn)); + local_fiq_enable(); + + /* FIXME: notify irq controller to standard enable FIQs */ + } return 0; } @@ -151,5 +159,6 @@ void __init init_FIQ(int start) { unsigned offset = FIQ_OFFSET; no_fiq_insn = *(unsigned long *)(0xffff0000 + offset); + get_fiq_regs(&dfl_fiq_regs); fiq_start = start; }