summaryrefslogtreecommitdiff
path: root/arch/x86/machine/cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/machine/cpu.c')
-rw-r--r--arch/x86/machine/cpu.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/machine/cpu.c b/arch/x86/machine/cpu.c
index a5a62499..0d1a9f38 100644
--- a/arch/x86/machine/cpu.c
+++ b/arch/x86/machine/cpu.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2011, 2012 Richard Braun.
+ * Copyright (c) 2010, 2011, 2012, 2013 Richard Braun.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -79,6 +79,11 @@ static unsigned int cpu_boot_array_size __initdata;
unsigned int cpu_array_size;
/*
+ * Barrier for processor synchronization on kernel entry.
+ */
+static unsigned int cpu_mp_synced __initdata;
+
+/*
* Interrupt descriptor table.
*/
static struct cpu_gate_desc cpu_idt[CPU_IDT_SIZE] __aligned(8);
@@ -555,6 +560,12 @@ cpu_mp_setup(void)
}
void __init
+cpu_mp_sync(void)
+{
+ cpu_mp_synced = 1;
+}
+
+void __init
cpu_ap_setup(void)
{
cpu_init(&cpu_array[boot_ap_id]);
@@ -565,7 +576,7 @@ cpu_ap_setup(void)
void __init
cpu_ap_sync(void)
{
- while (cpu_count() == 1)
+ while (!cpu_mp_synced)
cpu_pause();
}