Avoid early use of xen_kpm_sync(); locks are not available at this time. trunk
authorbouyer <bouyer@NetBSD.org>
Tue, 21 Feb 2012 19:10:13 +0000
branchtrunk
changeset 209384 7f8f8c3ff9c4
parent 209383 44ca654afa2c
child 209385 8f0eb04cfe4f
Avoid early use of xen_kpm_sync(); locks are not available at this time. Don't call cpu_init() twice. Makes LOCKDEBUG kernels boot again
sys/arch/x86/x86/pmap.c
sys/arch/xen/x86/cpu.c
--- a/sys/arch/x86/x86/pmap.c	Tue Feb 21 18:38:32 2012 +0000
+++ b/sys/arch/x86/x86/pmap.c	Tue Feb 21 19:10:13 2012 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.166 2012/02/20 20:49:12 bouyer Exp $	*/
+/*	$NetBSD: pmap.c,v 1.167 2012/02/21 19:10:13 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
@@ -171,7 +171,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.166 2012/02/20 20:49:12 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.167 2012/02/21 19:10:13 bouyer Exp $");
 
 #include "opt_user_ldt.h"
 #include "opt_lockdebug.h"
@@ -4183,14 +4183,30 @@
 			pte = pmap_pa2pte(pa) | PG_k | PG_V | PG_RW;
 #ifdef XEN
 			xpq_queue_pte_update(xpmap_ptetomach(&pdep[i]), pte);
-			if (level == PTP_LEVELS) {
 #if defined(PAE) || defined(__x86_64__)
-				if (i >= PDIR_SLOT_KERN) {
+			if (level == PTP_LEVELS && i >= PDIR_SLOT_KERN) {
+				if (__predict_true(
+				    cpu_info_primary.ci_flags & CPUF_PRESENT)) {
 					/* update per-cpu PMDs on all cpus */
 					xen_kpm_sync(pmap_kernel(), i);
+				} else {
+					/*
+					 * too early; update primary CPU
+					 * PMD only (without locks)
+					 */
+#ifdef PAE
+					pd_entry_t *cpu_pdep =
+					    &cpu_info_primary.ci_kpm_pdir[l2tol2(i)];
+#endif
+#ifdef __x86_64__
+					pd_entry_t *cpu_pdep =
+						&cpu_info_primary.ci_kpm_pdir[i];
+#endif
+					xpq_queue_pte_update(
+					    xpmap_ptetomach(cpu_pdep), pte);
 				}
+			}
 #endif /* PAE || __x86_64__ */
-			}
 #else /* XEN */
 			pdep[i] = pte;
 #endif /* XEN */
@@ -4199,7 +4215,7 @@
 			nkptp[level - 1]++;
 			va += nbpd[level - 1];
 		}
-		pmap_pte_flush();
+		xpq_flush_queue();
 	}
 #ifdef XEN
 	splx(s);
--- a/sys/arch/xen/x86/cpu.c	Tue Feb 21 18:38:32 2012 +0000
+++ b/sys/arch/xen/x86/cpu.c	Tue Feb 21 19:10:13 2012 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.81 2012/02/17 18:40:20 bouyer Exp $	*/
+/*	$NetBSD: cpu.c,v 1.82 2012/02/21 19:10:13 bouyer Exp $	*/
 /* NetBSD: cpu.c,v 1.18 2004/02/20 17:35:01 yamt Exp  */
 
 /*-
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.81 2012/02/17 18:40:20 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.82 2012/02/21 19:10:13 bouyer Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -487,7 +487,6 @@
 	case CPU_ROLE_BP:
 		atomic_or_32(&ci->ci_flags, CPUF_BSP);
 		cpu_identify(ci);
-		cpu_init(ci);
 #if 0
 		x86_errata();
 #endif