Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch Add FIQ support.



details:   https://anonhg.NetBSD.org/src/rev/1e35364173ab
branches:  trunk
changeset: 1023270:1e35364173ab
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Mon Aug 30 23:20:00 2021 +0000

description:
Add FIQ support.

diffstat:

 sys/arch/aarch64/aarch64/trap.c    |  33 ++++++++++++++++++++++++++++++---
 sys/arch/aarch64/aarch64/vectors.S |  16 ++++++++--------
 sys/arch/aarch64/include/machdep.h |   5 +++--
 sys/arch/arm/fdt/arm_fdt.c         |  32 +++++++++++++++++++++++++++++---
 sys/arch/arm/fdt/arm_fdtvar.h      |   4 +++-
 sys/arch/arm/fdt/fdt_intr.h        |   5 ++++-
 6 files changed, 77 insertions(+), 18 deletions(-)

diffs (268 lines):

diff -r 78b20d8857b6 -r 1e35364173ab sys/arch/aarch64/aarch64/trap.c
--- a/sys/arch/aarch64/aarch64/trap.c   Mon Aug 30 23:16:17 2021 +0000
+++ b/sys/arch/aarch64/aarch64/trap.c   Mon Aug 30 23:20:00 2021 +0000
@@ -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 @@
 }
 
 void
-interrupt(struct trapframe *tf)
+cpu_irq(struct trapframe *tf)
 {
        struct cpu_info * const ci = curcpu();
 
@@ -535,6 +535,33 @@
        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
 
 /*
diff -r 78b20d8857b6 -r 1e35364173ab sys/arch/aarch64/aarch64/vectors.S
--- a/sys/arch/aarch64/aarch64/vectors.S        Mon Aug 30 23:16:17 2021 +0000
+++ b/sys/arch/aarch64/aarch64/vectors.S        Mon Aug 30 23:20:00 2021 +0000
@@ -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_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
 
 /*
diff -r 78b20d8857b6 -r 1e35364173ab sys/arch/aarch64/include/machdep.h
--- a/sys/arch/aarch64/include/machdep.h        Mon Aug 30 23:16:17 2021 +0000
+++ b/sys/arch/aarch64/include/machdep.h        Mon Aug 30 23:20:00 2021 +0000
@@ -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 <ryo%nerv.org@localhost>
@@ -111,7 +111,8 @@
 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;
diff -r 78b20d8857b6 -r 1e35364173ab sys/arch/arm/fdt/arm_fdt.c
--- a/sys/arch/arm/fdt/arm_fdt.c        Mon Aug 30 23:16:17 2021 +0000
+++ b/sys/arch/arm/fdt/arm_fdt.c        Mon Aug 30 23:20:00 2021 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -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 @@
 
 #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 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 @@
     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 @@
        aprint_naive("\n");
        aprint_normal("\n");
 
+       DISABLE_INTERRUPT();
+
 #ifdef EFI_RUNTIME
        arm_fdt_efi_init(self);
 #endif
@@ -174,7 +180,13 @@
 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 @@
 }
 
 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 @@
        if (_arm_fdt_timer_init == NULL)
                panic("cpu_initclocks: no timer registered");
        _arm_fdt_timer_init();
+       ENABLE_INTERRUPT();
 }
 #endif
 
diff -r 78b20d8857b6 -r 1e35364173ab sys/arch/arm/fdt/arm_fdtvar.h
--- a/sys/arch/arm/fdt/arm_fdtvar.h     Mon Aug 30 23:16:17 2021 +0000
+++ b/sys/arch/arm/fdt/arm_fdtvar.h     Mon Aug 30 23:20:00 2021 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -94,6 +94,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 *);
 
 void   arm_fdt_memory_dump(paddr_t);
 
diff -r 78b20d8857b6 -r 1e35364173ab sys/arch/arm/fdt/fdt_intr.h
--- a/sys/arch/arm/fdt/fdt_intr.h       Mon Aug 30 23:16:17 2021 +0000
+++ b/sys/arch/arm/fdt/fdt_intr.h       Mon Aug 30 23:20:00 2021 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -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>
 



Home | Main Index | Thread Index | Old Index