Module Name:    src
Committed By:   riastradh
Date:           Mon Feb 14 08:12:48 UTC 2022

Modified Files:
        src/sys/arch/hppa/dev: cpu.c

Log Message:
hppa: Membar audit in cpu.c.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/hppa/dev/cpu.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/hppa/dev/cpu.c
diff -u src/sys/arch/hppa/dev/cpu.c:1.2 src/sys/arch/hppa/dev/cpu.c:1.3
--- src/sys/arch/hppa/dev/cpu.c:1.2	Thu Apr 16 05:44:44 2020
+++ src/sys/arch/hppa/dev/cpu.c	Mon Feb 14 08:12:48 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.2 2020/04/16 05:44:44 skrll Exp $	*/
+/*	$NetBSD: cpu.c,v 1.3 2022/02/14 08:12:48 riastradh Exp $	*/
 
 /*	$OpenBSD: cpu.c,v 1.29 2009/02/08 18:33:28 miod Exp $	*/
 
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.2 2020/04/16 05:44:44 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.3 2022/02/14 08:12:48 riastradh Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -240,11 +240,26 @@ cpu_boot_secondary_processors(void)
 		if (ci->ci_flags & CPUF_PRIMARY)
 			continue;
 
-		/* Release the specified CPU by triggering an EIR{0}. */
+		/*
+		 * Release the specified CPU by triggering an EIR{0}.
+		 *
+		 * The `load-acquire operation' matching this
+		 * store-release is somewhere inside the silicon or
+		 * firmware -- the point is that the store to
+		 * cpu_hatch_info must happen before writing EIR{0};
+		 * there is conceptually some magic inside the silicon
+		 * or firmware that effectively does
+		 *
+		 *	if (atomic_load_acquire(&cpu->io_eir) == 0) {
+		 *		hw_cpu_spinup_trampoline();
+		 *	}
+		 *
+		 * so that hw_cpu_spinup_trampoline correctly sees the
+		 * value we just stored at cpu_hatch_info.
+		 */
 		cpu_hatch_info = ci;
 		cpu = (struct iomod *)(ci->ci_hpa);
-		cpu->io_eir = 0;
-		membar_sync();
+		atomic_store_release(&cpu->io_eir, 0);
 
 		/* Wait for CPU to wake up... */
 		j = 0;
@@ -254,9 +269,12 @@ cpu_boot_secondary_processors(void)
 			printf("failed to hatch cpu %i!\n", ci->ci_cpuid);
 	}
 
-	/* Release secondary CPUs. */
-	start_secondary_cpu = 1;
-	membar_sync();
+	/*
+	 * Release secondary CPUs.
+	 *
+	 * Matches load-acquire in cpu_hatch.
+	 */
+	atomic_store_release(&start_secondary_cpu, 1);
 }
 
 void
@@ -282,8 +300,12 @@ cpu_hatch(void)
 
 	ci->ci_flags |= CPUF_RUNNING;
 
-	/* Wait for additional CPUs to spinup. */
-	while (!start_secondary_cpu)
+	/*
+	 * Wait for additional CPUs to spinup.
+	 *
+	 * Matches store-release in cpu_boot_secondary_processors.
+	 */
+	while (!atomic_load_acquire(&start_secondary_cpu))
 		;
 
 	/* Spin for now */

Reply via email to