Module Name:    src
Committed By:   riz
Date:           Thu May 17 18:17:33 UTC 2012

Modified Files:
        src/sys/arch/x86/x86 [netbsd-6]: cpu_ucode_amd.c

Log Message:
Pull up following revision(s) (requested by cegger in ticket #248):
        sys/arch/x86/x86/cpu_ucode_amd.c: revision 1.2
fix crash when booting with -x.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.1.2.1 src/sys/arch/x86/x86/cpu_ucode_amd.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/x86/x86/cpu_ucode_amd.c
diff -u src/sys/arch/x86/x86/cpu_ucode_amd.c:1.1 src/sys/arch/x86/x86/cpu_ucode_amd.c:1.1.2.1
--- src/sys/arch/x86/x86/cpu_ucode_amd.c:1.1	Fri Jan 13 16:05:15 2012
+++ src/sys/arch/x86/x86/cpu_ucode_amd.c	Thu May 17 18:17:32 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu_ucode_amd.c,v 1.1 2012/01/13 16:05:15 cegger Exp $ */
+/* $NetBSD: cpu_ucode_amd.c,v 1.1.2.1 2012/05/17 18:17:32 riz Exp $ */
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_ucode_amd.c,v 1.1 2012/01/13 16:05:15 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_ucode_amd.c,v 1.1.2.1 2012/05/17 18:17:32 riz Exp $");
 
 #include "opt_xen.h"
 #include "opt_cpu_ucode.h"
@@ -150,12 +150,14 @@ cpu_apply_cb(void *arg0, void *arg1)
 	struct microcode_amd mc_amd;
 	struct mc_buf mc;
 	device_t dev;
+	int s;
 
 	memcpy(&mc, arg1, sizeof(mc));
 	mc_amd.mpb = mc.mc_amd->mpb;
 	mc_amd.mpb_size = mc.mc_amd->mpb_size;
 
 	dev = curcpu()->ci_dev;
+	s = splhigh();
 
 	do {
 		uint64_t patchlevel;
@@ -168,7 +170,7 @@ cpu_apply_cb(void *arg0, void *arg1)
 
 		hdr = (struct microcode_amd_header *)mc_amd.mpb;
 		if (hdr->ah_processor_rev_id != mc.mc_equiv_cpuid) {
-			aprint_debug_dev(dev, "ucode: patch does not"
+			aprint_debug_dev(dev, "ucode: patch does not "
 			    "match this cpu "
 			    "(patch is for cpu id %x, cpu id is %x)\n",
 			    hdr->ah_processor_rev_id, mc.mc_equiv_cpuid);
@@ -196,6 +198,16 @@ cpu_apply_cb(void *arg0, void *arg1)
 		}
 
 next:
+		/* Check for race:
+		 * When we booted with -x a cpu might already finished
+		 * (why doesn't xc_wait() wait for *all* cpus?)
+		 * and sc->sc_blob is already freed.
+		 * In this case the calculation below touches
+		 * non-allocated memory and results in a crash.
+		 */
+		if (sc->sc_blob == NULL)
+			break;
+
 		mc.mc_buf += mc.mc_mpbuf->mpb_len +
 		    sizeof(mc.mc_mpbuf->mpb_type) +
 		    sizeof(mc.mc_mpbuf->mpb_len);
@@ -211,6 +223,7 @@ next:
 out:
 	if (error)
 		((struct mc_buf *)(arg1))->mc_error = error;
+	splx(s);
 }
 
 int
@@ -277,7 +290,7 @@ cpu_ucode_amd_apply(struct cpu_ucode_sof
 
 	/* Apply it on all cpus */
 	mc.mc_error = 0;
-	where = xc_broadcast(XC_HIGHPRI, cpu_apply_cb, sc, &mc);
+	where = xc_broadcast(0, cpu_apply_cb, sc, &mc);
 
 	/* Wait for completion */
 	xc_wait(where);

Reply via email to