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>