Module Name:    src
Committed By:   jmcneill
Date:           Mon Aug 30 23:20:00 UTC 2021

Modified Files:
        src/sys/arch/aarch64/aarch64: trap.c vectors.S
        src/sys/arch/aarch64/include: machdep.h
        src/sys/arch/arm/fdt: arm_fdt.c arm_fdtvar.h fdt_intr.h

Log Message:
Add FIQ support.


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/sys/arch/aarch64/aarch64/trap.c
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/aarch64/aarch64/vectors.S
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/aarch64/include/machdep.h
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/fdt/arm_fdt.c \
    src/sys/arch/arm/fdt/arm_fdtvar.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/fdt/fdt_intr.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/aarch64/trap.c
diff -u src/sys/arch/aarch64/aarch64/trap.c:1.46 src/sys/arch/aarch64/aarch64/trap.c:1.47
--- src/sys/arch/aarch64/aarch64/trap.c:1.46	Wed Apr 14 05:43:09 2021
+++ src/sys/arch/aarch64/aarch64/trap.c	Mon Aug 30 23:20:00 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.46 2021/04/14 05:43:09 ryo Exp $ */
+/* $NetBSD: trap.c,v 1.47 2021/08/30 23:20:00 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.46 2021/04/14 05:43:09 ryo Exp $");
+__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.47 2021/08/30 23:20:00 jmcneill Exp $");
 
 #include "opt_arm_intr_impl.h"
 #include "opt_compat_netbsd32.h"
@@ -504,7 +504,7 @@ trap_el0_sync(struct trapframe *tf)
 }
 
 void
-interrupt(struct trapframe *tf)
+cpu_irq(struct trapframe *tf)
 {
 	struct cpu_info * const ci = curcpu();
 
@@ -535,6 +535,33 @@ interrupt(struct trapframe *tf)
 	cpu_dosoftints();
 }
 
+void
+cpu_fiq(struct trapframe *tf)
+{
+	struct cpu_info * const ci = curcpu();
+
+#ifdef STACKCHECKS
+	struct lwp *l = curlwp;
+	void *sp = (void *)reg_sp_read();
+	if (l->l_addr >= sp) {
+		panic("lwp/interrupt stack overflow detected."
+		    " lwp=%p, sp=%p, l_addr=%p", l, sp, l->l_addr);
+	}
+#endif
+
+	/* disable trace */
+	reg_mdscr_el1_write(reg_mdscr_el1_read() & ~MDSCR_SS);
+
+	/* enable traps */
+	daif_enable(DAIF_D|DAIF_A);
+
+	ci->ci_intr_depth++;
+	ARM_FIQ_HANDLER(tf);
+	ci->ci_intr_depth--;
+
+	cpu_dosoftints();
+}
+
 #ifdef COMPAT_NETBSD32
 
 /*

Index: src/sys/arch/aarch64/aarch64/vectors.S
diff -u src/sys/arch/aarch64/aarch64/vectors.S:1.22 src/sys/arch/aarch64/aarch64/vectors.S:1.23
--- src/sys/arch/aarch64/aarch64/vectors.S:1.22	Tue Mar  9 16:44:27 2021
+++ src/sys/arch/aarch64/aarch64/vectors.S	Mon Aug 30 23:20:00 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: vectors.S,v 1.22 2021/03/09 16:44:27 ryo Exp $	*/
+/*	$NetBSD: vectors.S,v 1.23 2021/08/30 23:20:00 jmcneill Exp $	*/
 
 #include <aarch64/asm.h>
 #include <aarch64/locore.h>
@@ -10,7 +10,7 @@
 #include "opt_ddb.h"
 #include "opt_dtrace.h"
 
-RCSID("$NetBSD: vectors.S,v 1.22 2021/03/09 16:44:27 ryo Exp $")
+RCSID("$NetBSD: vectors.S,v 1.23 2021/08/30 23:20:00 jmcneill Exp $")
 
 	ARMV8_DEFINE_OPTIONS
 
@@ -130,18 +130,18 @@ vector_func	el1t_fiq_handler,   1, trap_
 vector_func	el1t_error_handler, 1, trap_el1t_error
 
 vector_func	el1h_sync_handler,  1, trap_el1h_sync
-vector_func	el1h_intr_handler,  1, interrupt
-vector_func	el1h_fiq_handler,   1, trap_el1h_fiq
+vector_func	el1h_intr_handler,  1, cpu_irq
+vector_func	el1h_fiq_handler,   1, cpu_fiq
 vector_func	el1h_error_handler, 1, trap_el1h_error
 
 vector_func	el0_sync_handler,  0, trap_el0_sync
-vector_func	el0_intr_handler,  0, interrupt
-vector_func	el0_fiq_handler,   0, trap_el0_fiq
+vector_func	el0_intr_handler,  0, cpu_irq
+vector_func	el0_fiq_handler,   0, cpu_fiq
 vector_func	el0_error_handler, 0, trap_el0_error
 
 vector_func	el0_32sync_handler,  0, trap_el0_32sync, ro
-vector_func	el0_32intr_handler,  0, interrupt, ro
-vector_func	el0_32fiq_handler,   0, trap_el0_32fiq, ro
+vector_func	el0_32intr_handler,  0, cpu_irq, ro
+vector_func	el0_32fiq_handler,   0, cpu_fiq, ro
 vector_func	el0_32error_handler, 0, trap_el0_32error, ro
 
 /*

Index: src/sys/arch/aarch64/include/machdep.h
diff -u src/sys/arch/aarch64/include/machdep.h:1.17 src/sys/arch/aarch64/include/machdep.h:1.18
--- src/sys/arch/aarch64/include/machdep.h:1.17	Sun Sep  6 17:38:10 2020
+++ src/sys/arch/aarch64/include/machdep.h	Mon Aug 30 23:20:00 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.h,v 1.17 2020/09/06 17:38:10 ryo Exp $	*/
+/*	$NetBSD: machdep.h,v 1.18 2021/08/30 23:20:00 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -111,7 +111,8 @@ void trap_el0_error(struct trapframe *);
 void trap_el0_32sync(struct trapframe *);
 void trap_el0_32fiq(struct trapframe *);
 void trap_el0_32error(struct trapframe *);
-void interrupt(struct trapframe *);
+void cpu_irq(struct trapframe *);
+void cpu_fiq(struct trapframe *);
 
 /* cpu_onfault */
 int cpu_set_onfault(struct faultbuf *) __returns_twice;

Index: src/sys/arch/arm/fdt/arm_fdt.c
diff -u src/sys/arch/arm/fdt/arm_fdt.c:1.17 src/sys/arch/arm/fdt/arm_fdt.c:1.18
--- src/sys/arch/arm/fdt/arm_fdt.c:1.17	Sat Aug  7 16:18:43 2021
+++ src/sys/arch/arm/fdt/arm_fdt.c	Mon Aug 30 23:20:00 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_fdt.c,v 1.17 2021/08/07 16:18:43 thorpej Exp $ */
+/* $NetBSD: arm_fdt.c,v 1.18 2021/08/30 23:20:00 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca>
@@ -31,7 +31,7 @@
 #include "opt_modular.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm_fdt.c,v 1.17 2021/08/07 16:18:43 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm_fdt.c,v 1.18 2021/08/30 23:20:00 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -48,6 +48,8 @@ __KERNEL_RCSID(0, "$NetBSD: arm_fdt.c,v 
 
 #include <arm/fdt/arm_fdtvar.h>
 
+#include <arm/locore.h>
+
 #ifdef EFI_RUNTIME
 #include <arm/arm/efi_runtime.h>
 #include <dev/clock_subr.h>
@@ -57,6 +59,7 @@ static int	arm_fdt_match(device_t, cfdat
 static void	arm_fdt_attach(device_t, device_t, void *);
 
 static void	arm_fdt_irq_default_handler(void *);
+static void	arm_fdt_fiq_default_handler(void *);
 
 #ifdef EFI_RUNTIME
 static void	arm_fdt_efi_init(device_t);
@@ -79,6 +82,7 @@ static TAILQ_HEAD(, arm_fdt_cpu_hatch_cb
     TAILQ_HEAD_INITIALIZER(arm_fdt_cpu_hatch_cbs);
 
 static void (*_arm_fdt_irq_handler)(void *) = arm_fdt_irq_default_handler;
+static void (*_arm_fdt_fiq_handler)(void *) = arm_fdt_fiq_default_handler;
 static void (*_arm_fdt_timer_init)(void) = NULL;
 
 int
@@ -96,6 +100,8 @@ arm_fdt_attach(device_t parent, device_t
 	aprint_naive("\n");
 	aprint_normal("\n");
 
+	DISABLE_INTERRUPT();
+
 #ifdef EFI_RUNTIME
 	arm_fdt_efi_init(self);
 #endif
@@ -174,7 +180,13 @@ arm_fdt_cpu_hatch(struct cpu_info *ci)
 static void
 arm_fdt_irq_default_handler(void *frame)
 {
-	panic("missing interrupt controller driver");
+	panic("No IRQ handler installed");
+}
+
+static void
+arm_fdt_fiq_default_handler(void *frame)
+{
+	panic("No FIQ handler installed");
 }
 
 void
@@ -185,12 +197,25 @@ arm_fdt_irq_set_handler(void (*irq_handl
 }
 
 void
+arm_fdt_fiq_set_handler(void (*fiq_handler)(void *))
+{
+	KASSERT(_arm_fdt_fiq_handler == arm_fdt_fiq_default_handler);
+	_arm_fdt_fiq_handler = fiq_handler;
+}
+
+void
 arm_fdt_irq_handler(void *tf)
 {
 	_arm_fdt_irq_handler(tf);
 }
 
 void
+arm_fdt_fiq_handler(void *tf)
+{
+	_arm_fdt_fiq_handler(tf);
+}
+
+void
 arm_fdt_timer_register(void (*timerfn)(void))
 {
 	if (_arm_fdt_timer_init != NULL) {
@@ -232,6 +257,7 @@ cpu_initclocks(void)
 	if (_arm_fdt_timer_init == NULL)
 		panic("cpu_initclocks: no timer registered");
 	_arm_fdt_timer_init();
+	ENABLE_INTERRUPT();
 }
 #endif
 
Index: src/sys/arch/arm/fdt/arm_fdtvar.h
diff -u src/sys/arch/arm/fdt/arm_fdtvar.h:1.17 src/sys/arch/arm/fdt/arm_fdtvar.h:1.18
--- src/sys/arch/arm/fdt/arm_fdtvar.h:1.17	Sun Jun 21 17:25:03 2020
+++ src/sys/arch/arm/fdt/arm_fdtvar.h	Mon Aug 30 23:20:00 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_fdtvar.h,v 1.17 2020/06/21 17:25:03 jmcneill Exp $ */
+/* $NetBSD: arm_fdtvar.h,v 1.18 2021/08/30 23:20:00 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca>
@@ -94,6 +94,8 @@ void	arm_fdt_timer_register(void (*)(voi
 
 void	arm_fdt_irq_set_handler(void (*)(void *));
 void	arm_fdt_irq_handler(void *);
+void	arm_fdt_fiq_set_handler(void (*)(void *));
+void	arm_fdt_fiq_handler(void *);
 
 void	arm_fdt_memory_dump(paddr_t);
 

Index: src/sys/arch/arm/fdt/fdt_intr.h
diff -u src/sys/arch/arm/fdt/fdt_intr.h:1.5 src/sys/arch/arm/fdt/fdt_intr.h:1.6
--- src/sys/arch/arm/fdt/fdt_intr.h:1.5	Fri Nov  9 23:35:06 2018
+++ src/sys/arch/arm/fdt/fdt_intr.h	Mon Aug 30 23:20:00 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_intr.h,v 1.5 2018/11/09 23:35:06 jmcneill Exp $ */
+/* $NetBSD: fdt_intr.h,v 1.6 2021/08/30 23:20:00 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -30,6 +30,7 @@
 #define _ARM_FDT_INTR_H
 
 #define	ARM_IRQ_HANDLER		_C_LABEL(arm_fdt_irq_handler)
+#define	ARM_FIQ_HANDLER		_C_LABEL(arm_fdt_fiq_handler)
 
 #ifndef _LOCORE
 
@@ -41,6 +42,8 @@
 
 void	arm_fdt_irq_set_handler(void (*)(void *));
 void	arm_fdt_irq_handler(void *);
+void	arm_fdt_fiq_set_handler(void (*)(void *));
+void	arm_fdt_fiq_handler(void *);
 
 #include <arm/pic/picvar.h>
 

Reply via email to