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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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>