Module Name: src Committed By: matt Date: Wed Apr 15 15:45:06 UTC 2015
Modified Files: src/sys/arch/arm/cortex: gic.c src/sys/arch/arm/pic: pic.c picvar.h Log Message: Add separate IPI routines for IPI_AST and IPI_KPREEMPT. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/arch/arm/cortex/gic.c cvs rdiff -u -r1.33 -r1.34 src/sys/arch/arm/pic/pic.c cvs rdiff -u -r1.14 -r1.15 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/cortex/gic.c diff -u src/sys/arch/arm/cortex/gic.c:1.18 src/sys/arch/arm/cortex/gic.c:1.19 --- src/sys/arch/arm/cortex/gic.c:1.18 Sat Apr 11 16:47:47 2015 +++ src/sys/arch/arm/cortex/gic.c Wed Apr 15 15:45:06 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: gic.c,v 1.18 2015/04/11 16:47:47 matt Exp $ */ +/* $NetBSD: gic.c,v 1.19 2015/04/15 15:45:06 matt Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -34,7 +34,7 @@ #define _INTR_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gic.c,v 1.18 2015/04/11 16:47:47 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gic.c,v 1.19 2015/04/15 15:45:06 matt Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -611,7 +611,7 @@ armgic_attach(device_t parent, device_t #endif #ifdef MULTIPROCESSOR intr_establish(ARMGIC_SGI_IPIBASE + IPI_AST, IPL_VM, - IST_MPSAFE | IST_EDGE, pic_ipi_nop, (void *)-1); + IST_MPSAFE | IST_EDGE, pic_ipi_ast, (void *)-1); intr_establish(ARMGIC_SGI_IPIBASE + IPI_XCALL, IPL_VM, IST_MPSAFE | IST_EDGE, pic_ipi_xcall, (void *)-1); intr_establish(ARMGIC_SGI_IPIBASE + IPI_GENERIC, IPL_VM, @@ -626,7 +626,7 @@ armgic_attach(device_t parent, device_t #endif #ifdef __HAVE_PREEMPTION intr_establish(ARMGIC_SGI_IPIBASE + IPI_KPREEMPT, IPL_VM, - IST_MPSAFE | IST_EDGE, pic_ipi_nop, (void *)-1); + IST_MPSAFE | IST_EDGE, pic_ipi_kpreempt, (void *)-1); #endif armgic_cpu_init(&sc->sc_pic, curcpu()); #endif Index: src/sys/arch/arm/pic/pic.c diff -u src/sys/arch/arm/pic/pic.c:1.33 src/sys/arch/arm/pic/pic.c:1.34 --- src/sys/arch/arm/pic/pic.c:1.33 Tue Apr 14 22:36:54 2015 +++ src/sys/arch/arm/pic/pic.c Wed Apr 15 15:45:06 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pic.c,v 1.33 2015/04/14 22:36:54 jmcneill Exp $ */ +/* $NetBSD: pic.c,v 1.34 2015/04/15 15:45:06 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -33,7 +33,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.33 2015/04/14 22:36:54 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.34 2015/04/15 15:45:06 matt Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -118,6 +118,13 @@ pic_set_priority(struct cpu_info *ci, in #ifdef MULTIPROCESSOR int +pic_ipi_ast(void *arg) +{ + setsoftast(curcpu()); + return 1; +} + +int pic_ipi_nop(void *arg) { /* do nothing */ @@ -146,7 +153,16 @@ pic_ipi_ddb(void *arg) kdb_trap(-1, arg); return 1; } + +#ifdef __HAVE_PREEMPTION +int +pic_ipi_kpreempt(void *arg) +{ + atomic_or_uint(&curcpu()->ci_astpending, __BIT(1)); + return 1; +} #endif +#endif /* MULTIPROCESSOR */ void intr_cpu_init(struct cpu_info *ci) Index: src/sys/arch/arm/pic/picvar.h diff -u src/sys/arch/arm/pic/picvar.h:1.14 src/sys/arch/arm/pic/picvar.h:1.15 --- src/sys/arch/arm/pic/picvar.h:1.14 Sat Apr 11 16:47:47 2015 +++ src/sys/arch/arm/pic/picvar.h Wed Apr 15 15:45:06 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: picvar.h,v 1.14 2015/04/11 16:47:47 matt Exp $ */ +/* $NetBSD: picvar.h,v 1.15 2015/04/15 15:45:06 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -172,11 +172,13 @@ void pic_set_priority(struct cpu_info *, void pic_add(struct pic_softc *, int); void pic_do_pending_int(void); #ifdef MULTIPROCESSOR -int pic_ipi_nop(void *); // IPI_KPREEMPT tto +int pic_ipi_ast(void *); +int pic_ipi_nop(void *); int pic_ipi_xcall(void *); int pic_ipi_generic(void *); int pic_ipi_shootdown(void *); int pic_ipi_ddb(void *); +int pic_ipi_kpreempt(void *); #endif #ifdef __HAVE_PIC_FAST_SOFTINTS int pic_handle_softint(void *);