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 *);