PERFORCE change 38856 for review

Peter Wemm peter at FreeBSD.org
Tue Sep 30 01:01:48 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=38856

Change 38856 by peter at peter_hammer on 2003/09/30 01:01:35

	Add SMP reset hooks and includes

Affected files ...

.. //depot/projects/hammer/sys/amd64/amd64/machdep.c#54 edit
.. //depot/projects/hammer/sys/amd64/amd64/vm_machdep.c#14 edit

Differences ...

==== //depot/projects/hammer/sys/amd64/amd64/machdep.c#54 (text+ko) ====

@@ -108,6 +108,9 @@
 #include <machine/perfmon.h>
 #endif
 #include <machine/tss.h>
+#ifdef SMP
+#include <machine/smp.h>
+#endif
 
 #include <isa/rtc.h>
 #include <sys/ptrace.h>

==== //depot/projects/hammer/sys/amd64/amd64/vm_machdep.c#14 (text+ko) ====

@@ -59,6 +59,7 @@
 #include <sys/ktr.h>
 #include <sys/mbuf.h>
 #include <sys/mutex.h>
+#include <sys/smp.h>
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
 #include <sys/unistd.h>
@@ -80,6 +81,11 @@
 #include <amd64/isa/isa.h>
 
 static void	cpu_reset_real(void);
+#ifdef SMP
+static void	cpu_reset_proxy(void);
+static u_int	cpu_reset_proxyid;
+static volatile u_int	cpu_reset_proxy_active;
+#endif
 static void	sf_buf_init(void *arg);
 SYSINIT(sock_sf, SI_SUB_MBUF, SI_ORDER_ANY, sf_buf_init, NULL)
 
@@ -334,10 +340,69 @@
  * Force reset the processor by invalidating the entire address space!
  */
 
+#ifdef SMP
+static void
+cpu_reset_proxy()
+{
+
+	cpu_reset_proxy_active = 1;
+	while (cpu_reset_proxy_active == 1)
+		;	 /* Wait for other cpu to see that we've started */
+	stop_cpus((1<<cpu_reset_proxyid));
+	printf("cpu_reset_proxy: Stopped CPU %d\n", cpu_reset_proxyid);
+	DELAY(1000000);
+	cpu_reset_real();
+}
+#endif
+
 void
 cpu_reset()
 {
+#ifdef SMP
+	if (smp_active == 0) {
+		cpu_reset_real();
+		/* NOTREACHED */
+	} else {
+
+		u_int map;
+		int cnt;
+		printf("cpu_reset called on cpu#%d\n", PCPU_GET(cpuid));
+
+		map = PCPU_GET(other_cpus) & ~ stopped_cpus;
+
+		if (map != 0) {
+			printf("cpu_reset: Stopping other CPUs\n");
+			stop_cpus(map);		/* Stop all other CPUs */
+		}
+
+		if (PCPU_GET(cpuid) == 0) {
+			DELAY(1000000);
+			cpu_reset_real();
+			/* NOTREACHED */
+		} else {
+			/* We are not BSP (CPU #0) */
+
+			cpu_reset_proxyid = PCPU_GET(cpuid);
+			cpustop_restartfunc = cpu_reset_proxy;
+			cpu_reset_proxy_active = 0;
+			printf("cpu_reset: Restarting BSP\n");
+			started_cpus = (1<<0);		/* Restart CPU #0 */
+
+			cnt = 0;
+			while (cpu_reset_proxy_active == 0 && cnt < 10000000)
+				cnt++;	/* Wait for BSP to announce restart */
+			if (cpu_reset_proxy_active == 0)
+				printf("cpu_reset: Failed to restart BSP\n");
+			enable_intr();
+			cpu_reset_proxy_active = 2;
+
+			while (1);
+			/* NOTREACHED */
+		}
+	}
+#else
 	cpu_reset_real();
+#endif
 }
 
 static void


More information about the p4-projects mailing list