Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3227849pxf; Mon, 15 Mar 2021 04:59:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwZH0dNWgji70uTJ+PqbGqfFZNey1sbfQT9CJefye3eYaZBFhxSyKZ8R9rCLjAVgPD6zlvc X-Received: by 2002:aa7:db15:: with SMTP id t21mr29559278eds.145.1615809570506; Mon, 15 Mar 2021 04:59:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1615809570; cv=none; d=google.com; s=arc-20160816; b=OboGygkACRQ/JmHOt9reE57F1yJiTmO1cXyw+9sNKiX5m3XVnXGD0kaecOjkGN7gC0 aeVqL3S5l9VHG3TkkzsLrhjiw9P9RCqMlVtgVknlxNKO1TIWS3nzOuKpVcl0ymExgUJg Pko/fA1wKcbXEKUbjLfmqgHb+pIf/8U1GRScqFGp8aE9VJdoNYxxXa61GHqAwcPq/Ejm Vp6i0Duc+/B6i1il85mclmrIWfq5bfQC/gzJE8o/jXtqZYkGsszs8Jtlx93MCYXJ+V3a PuKlRSn7nkyV3K9DtclM7bd6nr52/Zh8doVdO/D6PjqtS4GMs8OUmxODUvXW4nYKpiAY ANPw== 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=0A1wOTEQYrMkqyw61L86T5K/lCGrcDqUFpP/M+xXr/M=; b=Gg57wx18sWfufNappx8gt+/uXhTB8nGgfL3dM3JoNA07ga+mSPYqOfP4YK/IvJ81ll aWOPSKwi462HWDp3KFkFfXQdeIzy8Lbbz/qdk37CHXGYh4o+qbNArxN8q/WKoF56VcBn soCXi4vczNNmrVcOht5Lx+rzqeRQ/wG9XzMiwbaclKdHNonhZBPNuFZp0NzL2q3+YF77 z283wqMHbbpTa2GS1uDH9BpqMIIEfOMzP+WpN2+2R8V24sYjAujw4ElyVp3E+zE7P5yd PjywZ1g/nx5Ka7ZshobICqa5BhZyE+lxGdIcdTrmoq4ngjcpAQEQUYCvqu4lm6SmuVki wtWg== 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 a9si10555459edr.332.2021.03.15.04.59.08; Mon, 15 Mar 2021 04:59:30 -0700 (PDT) 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 S229921AbhCOL5T (ORCPT + 99 others); Mon, 15 Mar 2021 07:57:19 -0400 Received: from foss.arm.com ([217.140.110.172]:35082 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230211AbhCOL4r (ORCPT ); Mon, 15 Mar 2021 07:56:47 -0400 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 865AC12FC; Mon, 15 Mar 2021 04:56:46 -0700 (PDT) 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 4FFEC3F792; Mon, 15 Mar 2021 04:56:45 -0700 (PDT) From: Mark Rutland To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, will@kernel.org, catalin.marinas@arm.com Cc: james.morse@arm.com, marcan@marcan.st, mark.rutland@arm.com, maz@kernel.org, tglx@linutronix.de Subject: [PATCHv3 4/6] arm64: entry: factor irq triage logic into macros Date: Mon, 15 Mar 2021 11:56:27 +0000 Message-Id: <20210315115629.57191-5-mark.rutland@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210315115629.57191-1-mark.rutland@arm.com> References: <20210315115629.57191-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 Tested-by: Hector Martin Cc: Catalin Marinas 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 a31a0a713c85..e235b0e4e468 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