x86: Pretend to be core 0 in smp_main()
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 7 Nov 2016 12:48:55 +0000 (07:48 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 29 Nov 2016 16:27:40 +0000 (11:27 -0500)
This is the function that all non-core 0 cores call during boot.  They
need to get a kernel stack, among other things, that requires the memory
allocator.  The allocator, in general, will need to know a core id, but
core_id() isn't ready yet for other cores.  Since the entire machine is
single threaded at this point, we can pretend to be core 0.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
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
 }