[kernel] Pre-allocate cpu_data and pass to APs
In order to avoid cyclic dependencies in the case of page faults while bringing up an AP, pre-allocate the cpu_data structure and related CPU control structures, and pass them to the AP startup code. This also changes the following: - cpu_early_init() was split out of cpu_early_init() to allow early usage of current_cpu() on the BSP before we're ready for the rest of cpu_init(). (These functions were also renamed to follow the preferred area_action naming style.) - isr_handler now zeroes out the IST entry for its vector instead of trying to increment the IST stack pointer - the IST stacks are allocated outside of cpu_init, to also help reduce stack pressue and chance of page faults before APs are ready - share stack areas between AP idle threads so we only waste 1K per additional AP for the unused idle stack
This commit is contained in:
@@ -38,9 +38,16 @@ struct cpu_data
|
||||
|
||||
extern "C" cpu_data * _current_gsbase();
|
||||
|
||||
/// Initialize a CPU and set up its cpu_data structure
|
||||
/// \arg bsp True if the current CPU is the BSP
|
||||
void init_cpu(bool bsp);
|
||||
/// Set up the running CPU. This sets GDT, IDT, and necessary MSRs as well as creating
|
||||
/// the cpu_data structure for this processor.
|
||||
/// \arg cpu The cpu_data structure for this CPU
|
||||
/// \arg bsp True if this CPU is the BSP
|
||||
void cpu_init(cpu_data *cpu, bool bsp);
|
||||
|
||||
/// Do early (before cpu_init) initialization work. Only needs to be called manually for
|
||||
/// the BSP, otherwise cpu_init will call it.
|
||||
/// \arg cpu The cpu_data structure for this CPU
|
||||
void cpu_early_init(cpu_data *cpu);
|
||||
|
||||
/// Get the cpu_data struct for the current executing CPU
|
||||
inline cpu_data & current_cpu() { return *_current_gsbase(); }
|
||||
@@ -49,7 +56,3 @@ inline cpu_data & current_cpu() { return *_current_gsbase(); }
|
||||
/// validated the required features, but still iterate the options and log about them.
|
||||
void cpu_validate();
|
||||
|
||||
/// Set up the running CPU. This sets GDT, IDT, and necessary MSRs as well as creating
|
||||
/// the cpu_data structure for this processor.
|
||||
/// \arg bsp True if this CPU is the BSP
|
||||
void cpu_initialize(bool bsp);
|
||||
|
||||
Reference in New Issue
Block a user