Module Name:    src
Committed By:   cliff
Date:           Sat Feb  5 06:07:39 UTC 2011

Modified Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: ipifuncs.c

Log Message:
- add support for MP ddb
- add IPI halt func


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/sys/arch/mips/mips/ipifuncs.c

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/mips/mips/ipifuncs.c
diff -u src/sys/arch/mips/mips/ipifuncs.c:1.1.2.4 src/sys/arch/mips/mips/ipifuncs.c:1.1.2.5
--- src/sys/arch/mips/mips/ipifuncs.c:1.1.2.4	Wed Dec 22 05:57:48 2010
+++ src/sys/arch/mips/mips/ipifuncs.c	Sat Feb  5 06:07:38 2011
@@ -27,9 +27,11 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "opt_ddb.h"
+
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.1.2.4 2010/12/22 05:57:48 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.1.2.5 2011/02/05 06:07:38 cliff Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -38,6 +40,13 @@
 #include <uvm/uvm_extern.h>
 
 #include <mips/cache.h>
+#ifdef DDB
+#include <mips/db_machdep.h>
+#endif
+
+
+static void ipi_halt(void) __attribute__((__noreturn__));
+
 
 static const char * const ipi_names[] = {
 	[IPI_NOP]	= "ipi nop",
@@ -46,6 +55,8 @@
 	[IPI_FPSAVE]	= "ipi fpsave",
 	[IPI_SYNCICACHE]	= "ipi isync",
 	[IPI_KPREEMPT]	= "ipi kpreempt",
+	[IPI_SUSPEND]	= "ipi suspend",
+	[IPI_HALT]	= "ipi halt",
 };
 
 static void
@@ -89,6 +100,22 @@
 }
 #endif
 
+/*
+ * Process cpu stop-self event.
+ * XXX could maybe add/use locoresw halt function?
+ */
+static void
+ipi_halt(void)
+{
+	int index = cpu_index(curcpu());
+	printf("cpu%d: shutting down\n", index);
+	CPUSET_ADD(cpus_halted, index);
+	splhigh();
+	for (;;)
+		;
+	/* NOTREACHED */
+}
+
 void
 ipi_process(struct cpu_info *ci, uint64_t ipi_mask)
 {
@@ -114,12 +141,14 @@
 		ci->ci_evcnt_per_ipi[IPI_NOP].ev_count++;
 		ipi_syncicache(ci);
 	}
-#ifdef IPI_HALT
+	if (ipi_mask & __BIT(IPI_SUSPEND)) {
+		ci->ci_evcnt_per_ipi[IPI_SUSPEND].ev_count++;
+		cpu_pause(NULL);
+	}
 	if (ipi_mask & __BIT(IPI_HALT)) {
-		ci->ci_evcnt_per_ipi[IPI_NOP].ev_count++;
+		ci->ci_evcnt_per_ipi[IPI_HALT].ev_count++;
 		ipi_halt();
 	}
-#endif
 }
 
 void

Reply via email to