Module Name: src Committed By: matt Date: Thu Mar 13 23:47:53 UTC 2014
Modified Files: src/sys/arch/arm/pic: pic.c picvar.h Log Message: Support MPSAFE interrupts. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/arch/arm/pic/pic.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/pic/picvar.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/arm/pic/pic.c diff -u src/sys/arch/arm/pic/pic.c:1.20 src/sys/arch/arm/pic/pic.c:1.21 --- src/sys/arch/arm/pic/pic.c:1.20 Mon Mar 3 08:50:48 2014 +++ src/sys/arch/arm/pic/pic.c Thu Mar 13 23:47:53 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pic.c,v 1.20 2014/03/03 08:50:48 matt Exp $ */ +/* $NetBSD: pic.c,v 1.21 2014/03/13 23:47:53 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -27,10 +27,13 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.20 2014/03/03 08:50:48 matt Exp $"); #define _INTR_PRIVATE +#include "opt_ddb.h" + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.21 2014/03/13 23:47:53 matt Exp $"); + #include <sys/param.h> #include <sys/atomic.h> #include <sys/cpu.h> @@ -43,6 +46,10 @@ __KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.20 #include <arm/armreg.h> #include <arm/cpufunc.h> +#ifdef DDB +#include <arm/db_machdep.h> +#endif + #include <arm/pic/picvar.h> static uint32_t @@ -100,6 +107,16 @@ pic_ipi_xcall(void *arg) return 1; } +#ifdef DDB +int +pic_ipi_ddb(void *arg) +{ + printf("%s: %s: tf=%p\n", __func__, curcpu()->ci_cpuname, arg); + kdb_trap(-1, arg); + return 1; +} +#endif + void intr_cpu_init(struct cpu_info *ci) { @@ -269,7 +286,11 @@ pic_dispatch(struct intrsource *is, void #ifdef MULTIPROCESSOR if (!is->is_mpsafe) { KERNEL_LOCK(1, NULL); + const u_int ci_blcnt __diagused = curcpu()->ci_biglock_count; + const u_int l_blcnt __diagused = curlwp->l_blcnt; (void)(*func)(arg); + KASSERT(ci_blcnt == curcpu()->ci_biglock_count); + KASSERT(l_blcnt == curlwp->l_blcnt); KERNEL_UNLOCK_ONE(NULL); } else #endif @@ -613,11 +634,11 @@ pic_establish_intr(struct pic_softc *pic is->is_pic = pic; is->is_irq = irq; is->is_ipl = ipl; - is->is_type = type; + is->is_type = type & 0xff; is->is_func = func; is->is_arg = arg; #ifdef MULTIPROCESSOR - is->is_mpsafe = false; + is->is_mpsafe = (type & IST_MPSAFE); #endif if (pic->pic_ops->pic_source_name) Index: src/sys/arch/arm/pic/picvar.h diff -u src/sys/arch/arm/pic/picvar.h:1.8 src/sys/arch/arm/pic/picvar.h:1.9 --- src/sys/arch/arm/pic/picvar.h:1.8 Mon Mar 3 08:50:48 2014 +++ src/sys/arch/arm/pic/picvar.h Thu Mar 13 23:47:53 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: picvar.h,v 1.8 2014/03/03 08:50:48 matt Exp $ */ +/* $NetBSD: picvar.h,v 1.9 2014/03/13 23:47:53 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -47,11 +47,13 @@ struct cpu_info; #define IPI_AST 0 /* just get an interrupt */ #define IPI_XCALL 1 /* xcall */ #define IPI_NOP 2 /* just get an interrupt (armv6) */ -#ifndef __HAVE_PREEMPTION -#define NIPI 3 +#define IPI_SHOOTDOWN 3 /* cause a tlb shootdown */ +#define IPI_DDB 4 /* enter DDB */ +#ifdef __HAVE_PREEMPTION +#define IPI_KPREEMPT 5 /* cause a preemption */ +#define NIPI 6 #else -#define IPI_KPREEMPT 4 /* cause a preemption */ -#define NIPI 4 +#define NIPI 5 #endif int pic_handle_intr(void *); @@ -158,6 +160,8 @@ void pic_do_pending_int(void); #ifdef MULTIPROCESSOR int pic_ipi_nop(void *); int pic_ipi_xcall(void *); +int pic_ipi_shootdown(void *); +int pic_ipi_ddb(void *); #endif #ifdef __HAVE_PIC_FAST_SOFTINTS int pic_handle_softint(void *);