x86: Pretend to be core 0 in smp_main()
[akaros.git] / kern / arch / x86 / smp_boot.c
index 2418310..a72f943 100644 (file)
@@ -229,6 +229,11 @@ uintptr_t smp_main(void)
        cprintf("Num_Cores: %d\n\n", num_cores);
        */
 
+       /* We need to fake being core 0 for our memory allocations to work nicely.
+        * This is safe since the entire machine is single threaded while we are in
+        * this function. */
+       write_msr(MSR_GS_BASE, (uintptr_t)&per_cpu_info[0]);
+
        // Get a per-core kernel stack
        uintptr_t my_stack_top = get_kstack();
 
@@ -266,6 +271,9 @@ uintptr_t smp_main(void)
 
        apiconline();
 
+       /* Stop pretending to be core 0.  We'll get our own coreid shortly and set
+        * gs properly (smp_final_core_init()) */
+       write_msr(MSR_GS_BASE, 0);
 
        return my_stack_top; // will be loaded in smp_entry.S
 }