PERFORCE change 85512 for review

John Baldwin jhb at FreeBSD.org
Tue Oct 18 11:54:30 PDT 2005


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

Change 85512 by jhb at jhb_slimer on 2005/10/18 18:53:56

	MFi386: cpu reset fixes.

Affected files ...

.. //depot/projects/smpng/sys/amd64/amd64/apic_vector.S#8 edit
.. //depot/projects/smpng/sys/amd64/amd64/mp_machdep.c#25 edit
.. //depot/projects/smpng/sys/amd64/amd64/vm_machdep.c#30 edit
.. //depot/projects/smpng/sys/i386/i386/mp_machdep.c#90 edit

Differences ...

==== //depot/projects/smpng/sys/amd64/amd64/apic_vector.S#8 (text+ko) ====

@@ -297,10 +297,11 @@
 	test	%eax, %eax
 	jnz	2f
 
-	movq	cpustop_restartfunc, %rax
+	xorq	%rax, %rax
+	lock
+	xchgq	cpustop_restartfunc, %rax
 	testq	%rax, %rax
 	jz	2f
-	movq	$0, cpustop_restartfunc	/* One-shot */
 
 	call	*%rax
 2:

==== //depot/projects/smpng/sys/amd64/amd64/mp_machdep.c#25 (text+ko) ====

@@ -1044,6 +1044,7 @@
 ipi_nmi_handler()
 {
 	int cpu  = PCPU_GET(cpuid);
+	void *restartfunc(void);
 
 	if(!(atomic_load_acq_int(&ipi_nmi_pending) & (1 << cpu)))
 		return 1;
@@ -1063,8 +1064,9 @@
 	atomic_clear_int(&started_cpus,1 << cpu);
 	atomic_clear_int(&stopped_cpus,1 << cpu);
 
-	if(cpu == 0 && cpustop_restartfunc != NULL)
-		cpustop_restartfunc();
+	restartfunc = (void (*)(void))atomic_readandclear_long(&cpustop_restartfunc);
+	if (restartfunc != NULL)
+		restartfunc();
 
 	return 0;
 }

==== //depot/projects/smpng/sys/amd64/amd64/vm_machdep.c#30 (text+ko) ====

@@ -389,7 +389,9 @@
 			cpustop_restartfunc = cpu_reset_proxy;
 			cpu_reset_proxy_active = 0;
 			printf("cpu_reset: Restarting BSP\n");
-			started_cpus = (1<<0);		/* Restart CPU #0 */
+
+			/* Restart CPU #0. */
+			atomic_store_rel_int(&started_cpus, 1 << 0);
 
 			cnt = 0;
 			while (cpu_reset_proxy_active == 0 && cnt < 10000000)

==== //depot/projects/smpng/sys/i386/i386/mp_machdep.c#90 (text+ko) ====

@@ -1305,7 +1305,7 @@
 	atomic_clear_int(&started_cpus,1 << cpu);
 	atomic_clear_int(&stopped_cpus,1 << cpu);
 
-	restartfunc = (void (*)(void)atomic_readandclear_int(&cpustop_restartfunc);
+	restartfunc = (void (*)(void))atomic_readandclear_int(&cpustop_restartfunc);
 	if (restartfunc != NULL)
 		restartfunc();
 


More information about the p4-projects mailing list