separating apic init and signalling boot core ready
authorReto Achermann <reto.achermann@inf.ethz.ch>
Fri, 28 Nov 2014 12:15:04 +0000 (13:15 +0100)
committerReto Achermann <reto.achermann@inf.ethz.ch>
Fri, 28 Nov 2014 12:16:44 +0000 (13:16 +0100)
kernel/arch/x86/apic.c
kernel/arch/x86/startup_x86.c
kernel/include/arch/x86/startup_x86.h

index 3e1609a..4366d8e 100644 (file)
@@ -35,12 +35,6 @@ uint8_t apic_id;
  */
 bool apic_bsp = true;
 
-// global pointers used in init_ap.S
-extern uint64_t x86_64_start_ap;
-extern uint64_t x86_64_init_ap_wait;
-extern uint64_t x86_32_start_ap;
-extern uint64_t x86_32_init_ap_wait;
-
 static xapic_t apic;
 
 /**
@@ -107,26 +101,6 @@ void apic_timer_set_divide(xapic_divide_t divide)
 */
 void apic_init(void)
 {
-    //pointer to a variable used as pseudo-lock to synchronize the BSP
-    //and the AP which gets enabled
-#if defined(__k1om__)
-        volatile uint32_t *ap_wait = (volatile uint32_t *)
-            local_phys_to_mem((lpaddr_t)&x86_64_init_ap_wait - ((lpaddr_t)&x86_64_start_ap) +
-                              K1OM_REAL_MODE_LINEAR_OFFSET);
-#elif defined (__x86_64__)
-    volatile uint32_t *ap_wait = (volatile uint32_t *)
-        local_phys_to_mem((lpaddr_t)&x86_64_init_ap_wait - ((lpaddr_t)&x86_64_start_ap) +
-                          X86_64_REAL_MODE_LINEAR_OFFSET);
-#elif defined (__i386__)
-#       if !defined(__scc__)
-    volatile uint32_t *ap_wait = (volatile uint32_t *)
-        local_phys_to_mem((lpaddr_t)&x86_32_init_ap_wait - ((lpaddr_t)&x86_32_start_ap) +
-                          X86_32_REAL_MODE_LINEAR_OFFSET);
-#       endif
-#else
-#error "Architecture not supported"
-#endif
-
 #if !defined(__scc__)
     ia32_apic_base_t apic_base_msr = ia32_apic_base_rd(NULL);
     lpaddr_t apic_phys = ((lpaddr_t)apic_base_msr) & APIC_BASE_ADDRESS_MASK;
@@ -154,7 +128,6 @@ void apic_init(void)
     } else {
         debug(SUBSYS_APIC, "APIC: application processor\n");
         apic_bsp = false;
-        *ap_wait = AP_STARTED;
     }
 #endif
 
index 3ebb949..fd019a8 100644 (file)
@@ -38,6 +38,7 @@
 #include <arch/x86/apic.h>
 #include <target/x86/barrelfish_kpi/coredata_target.h>
 #include <arch/x86/startup_x86.h>
+
 #ifdef __scc__
 #       include <rck.h>
 #endif
@@ -552,6 +553,7 @@ void kernel_startup(void)
         /* spawn init */
         init_dcb = spawn_bsp_init(BSP_INIT_MODULE_PATH, bsp_alloc_phys);
     } else {
+        start_ap_signal();
         // if we have a kernel control block, use it
         if (kcb_current && kcb_current->is_valid) {
             debug(SUBSYS_STARTUP, "have valid kcb, restoring state\n");
index 8d179e2..926da14 100644 (file)
@@ -16,6 +16,7 @@
 #define __STARTUP_X86_H
 
 #include <startup.h>
+#include <arch/x86/start_aps.h>
 
 #define BOOTINFO_BASE           ((lvaddr_t)0x200000)
 #define ARGS_BASE               (BOOTINFO_BASE + BOOTINFO_SIZE)
@@ -40,4 +41,32 @@ struct dcb *spawn_app_init(struct x86_core_data *core_data,
 
 extern struct x86_core_data *glbl_core_data; // XXX: Arch specific
 
+// global pointers used in init_ap.S
+extern uint64_t x86_64_start_ap;
+extern uint64_t x86_64_init_ap_wait;
+extern uint64_t x86_32_start_ap;
+extern uint64_t x86_32_init_ap_wait;
+
+static inline void start_ap_signal(void)
+{
+
+    //pointer to a variable used as pseudo-lock to synchronize the BSP
+    //and the AP which gets enabled
+#if defined(__k1om__) || defined(__x86_64__)
+    volatile uint32_t *ap_wait = (volatile uint32_t *)
+        local_phys_to_mem((lpaddr_t)&x86_64_init_ap_wait - ((lpaddr_t)&x86_64_start_ap) +
+                          X86_64_REAL_MODE_LINEAR_OFFSET);
+#elif defined (__i386__)
+#       if !defined(__scc__)
+    volatile uint32_t *ap_wait = (volatile uint32_t *)
+        local_phys_to_mem((lpaddr_t)&x86_32_init_ap_wait - ((lpaddr_t)&x86_32_start_ap) +
+                          X86_32_REAL_MODE_LINEAR_OFFSET);
+#       endif
+#else
+#error "Architecture not supported"
+#endif
+
+    *ap_wait = AP_STARTED;
+}
+
 #endif // __STARTUP_X86_H