Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp7950687pxb; Fri, 19 Feb 2021 03:44:06 -0800 (PST) X-Google-Smtp-Source: ABdhPJwT7oWlkCZcInvjXXsHCnoeP3LA4umGMoh9X6HWxJOnQNMX0ixfHPZmhZ1HlXsqSybsGGob X-Received: by 2002:a17:906:4094:: with SMTP id u20mr5553046ejj.525.1613735045884; Fri, 19 Feb 2021 03:44:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613735045; cv=none; d=google.com; s=arc-20160816; b=GZ3HvYsnP5I3Y3qE7wfcKFwQF/Lx/1oohxNlHCTgrQ9wUZQ3ntpZnkU9liEu3UBPfA lELFqulSyUJW8SIyQYcrybWIs5r0iwL/eLjLP86TwLX7hwjxz4DCu25NkZFCYqcgf0j/ zU+vh3KiqeKFIRyx9zAhfSgzvgINhqZr/0DFonjbfOreAtePrY/YtG8GODBSIHOuvXYn Mmnlgp2EwUsiHIEgY2Nb2XSlMADBD2c48xBtqOtuRD1M/0598hRX4HQRD3o2EbVHz4XH mDJIu6AAgS2i7Mc2ns0VD0rey1b8DiZWS8X5Js9TkQJlki3wmuf4CdX89Q8Lg2JG54sx 8qmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=PRK4yN/zBidldsPU6/DmGypsP/q1dNoOugAbh7p5N/M=; b=Z6MzBPXfz8OdjMavbCW8t9sXJQ43t9A1Z2hbKdSks+tOajw+7p0O2l1Y8nO7wZEJVd knahQXbTgS3gjEZUJ3g7mPI+kBeWLc33o4cxHdz0hzvqIOuusVV5HJB2UNnxGCX0Q6GR UFlJBtty4eF0fb4m2IDYRbEpCR2/Hrd0WykdUkueEBO4x3lul4T7At5Wg6g3Ie5pSNJi c28KJHR6NaaT3Ww1oxWJQKqdEatPx4B1Lt9WMXhe/N5f9Rl/xpEfJwxFa+2H9VT6aUxK jRep8GYVRTE1adOFMJIDdWnOlVYAFQbjB1NhpSzFQnuq5TWyAotch8dJu5pBTCedCCqB ommQ== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bs1si6085014edb.502.2021.02.19.03.43.42; Fri, 19 Feb 2021 03:44:05 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230472AbhBSLlm (ORCPT + 99 others); Fri, 19 Feb 2021 06:41:42 -0500 Received: from foss.arm.com ([217.140.110.172]:34262 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230431AbhBSLko (ORCPT ); Fri, 19 Feb 2021 06:40:44 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 91A2013D5; Fri, 19 Feb 2021 03:39:48 -0800 (PST) Received: from lakrids.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 5B6F93F694; Fri, 19 Feb 2021 03:39:47 -0800 (PST) From: Mark Rutland To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: catalin.marinas@arm.com, james.morse@arm.com, marcan@marcan.st, mark.rutland@arm.com, maz@kernel.org, tglx@linutronix.de, will@kernel.org Subject: [PATCH 6/8] arm64: entry: factor irq triage logic into macros Date: Fri, 19 Feb 2021 11:39:02 +0000 Message-Id: <20210219113904.41736-7-mark.rutland@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210219113904.41736-1-mark.rutland@arm.com> References: <20210219113904.41736-1-mark.rutland@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marc Zyngier In subsequent patches we'll allow an FIQ handler to be registered, and FIQ exceptions will need to be triaged very similarly to IRQ exceptions. So that we can reuse the existing logic, this patch factors the IRQ triage logic out into macros that can be reused for FIQ. The macros are named to follow the elX_foo_handler scheme used by the C exception handlers. For consistency with other top-level exception handlers, the kernel_entry/kernel_exit logic is not moved into the macros. As FIQ will use a different C handler, this handler name is provided as an argument to the macros. There should be no functional change as a result of this patch. Signed-off-by: Marc Zyngier [Mark: rework macros, commit message, rebase before DAIF rework] Signed-off-by: Mark Rutland Cc: Catalin Marinas Cc: Hector Martin Cc: James Morse Cc: Thomas Gleixner Cc: Will Deacon --- arch/arm64/kernel/entry.S | 80 +++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index c9bae73f2621..acc677672277 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -491,8 +491,8 @@ tsk .req x28 // current thread_info /* * Interrupt handling. */ - .macro irq_handler - ldr_l x1, handle_arch_irq + .macro irq_handler, handler:req + ldr_l x1, \handler mov x0, sp irq_stack_entry blr x1 @@ -531,6 +531,45 @@ alternative_endif #endif .endm + .macro el1_interrupt_handler, handler:req + gic_prio_irq_setup pmr=x20, tmp=x1 + enable_da_f + + mov x0, sp + bl enter_el1_irq_or_nmi + + irq_handler \handler + +#ifdef CONFIG_PREEMPTION + ldr x24, [tsk, #TSK_TI_PREEMPT] // get preempt count +alternative_if ARM64_HAS_IRQ_PRIO_MASKING + /* + * DA_F were cleared at start of handling. If anything is set in DAIF, + * we come back from an NMI, so skip preemption + */ + mrs x0, daif + orr x24, x24, x0 +alternative_else_nop_endif + cbnz x24, 1f // preempt count != 0 || NMI return path + bl arm64_preempt_schedule_irq // irq en/disable is done inside +1: +#endif + + mov x0, sp + bl exit_el1_irq_or_nmi + .endm + + .macro el0_interrupt_handler, handler:req + gic_prio_irq_setup pmr=x20, tmp=x0 + user_exit_irqoff + enable_da_f + + tbz x22, #55, 1f + bl do_el0_irq_bp_hardening +1: + irq_handler \handler + .endm + .text /* @@ -660,32 +699,7 @@ SYM_CODE_END(el1_sync) .align 6 SYM_CODE_START_LOCAL_NOALIGN(el1_irq) kernel_entry 1 - gic_prio_irq_setup pmr=x20, tmp=x1 - enable_da_f - - mov x0, sp - bl enter_el1_irq_or_nmi - - irq_handler - -#ifdef CONFIG_PREEMPTION - ldr x24, [tsk, #TSK_TI_PREEMPT] // get preempt count -alternative_if ARM64_HAS_IRQ_PRIO_MASKING - /* - * DA_F were cleared at start of handling. If anything is set in DAIF, - * we come back from an NMI, so skip preemption - */ - mrs x0, daif - orr x24, x24, x0 -alternative_else_nop_endif - cbnz x24, 1f // preempt count != 0 || NMI return path - bl arm64_preempt_schedule_irq // irq en/disable is done inside -1: -#endif - - mov x0, sp - bl exit_el1_irq_or_nmi - + el1_interrupt_handler handle_arch_irq kernel_exit 1 SYM_CODE_END(el1_irq) @@ -725,15 +739,7 @@ SYM_CODE_END(el0_error_compat) SYM_CODE_START_LOCAL_NOALIGN(el0_irq) kernel_entry 0 el0_irq_naked: - gic_prio_irq_setup pmr=x20, tmp=x0 - user_exit_irqoff - enable_da_f - - tbz x22, #55, 1f - bl do_el0_irq_bp_hardening -1: - irq_handler - + el0_interrupt_handler handle_arch_irq b ret_to_user SYM_CODE_END(el0_irq) -- 2.11.0