[coreboot] [RFC] v3: keep global variables in BSP stack only
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Thu Oct 9 03:55:46 CEST 2008
Currently v3 allocates a global variable struct on the stack for each
processor in stage1_main(). We only have 1k AP stack size for Fam10, but
struct global_vars is ~3.6k, so all AP stacks will smash each other. Bad.
The idea is to have a special stage1_main_bsp() which allocates struct
global_vars and initializes it.
The BSP calls stage1_main_bsp() from stage0, all APs call stage1_main().
stage1_main_bsp() will call stage1_main(), so all processors end up in
stage1_main() eventually.
The following snippet illustrates the changes to arch/x86/stage1.c and
the changes for an UP configuration of i586/stage0.S.
Index: arch/x86/i586/stage0.S
===================================================================
--- arch/x86/i586/stage0.S (Revision 909)
+++ arch/x86/i586/stage0.S (Arbeitskopie)
@@ -345,7 +345,7 @@
pushl $0
/* First parameter: bist */
pushl %eax
- call stage1_main
+ call stage1_main_bsp
/* We will not go back. */
fixed_mtrr_msr:
Index: arch/x86/stage1.c
===================================================================
--- arch/x86/stage1.c (Revision 909)
+++ arch/x86/stage1.c (Arbeitskopie)
@@ -143,6 +143,20 @@
return ret;
}
+void __attribute__((stdcall)) stage1_main(u32 bist, u32 init_detected);
+
+void __attribute__((stdcall)) stage1_main_bsp(u32 bist, u32 init_detected)
+{
+ struct global_vars globvars;
+
+ /* Initialize global variables before we can think of using them.
+ */
+ global_vars_init(&globvars);
+ globvars.init_detected = init_detected;
+
+ stage1_main(bist, init_detected);
+}
+
/**
* This function is called from assembler code with its argument on the
* stack. Force the compiler to generate always correct code for this case.
@@ -156,7 +170,6 @@
*/
void __attribute__((stdcall)) stage1_main(u32 bist, u32 init_detected)
{
- struct global_vars globvars;
int ret;
struct mem_file archive;
void *entry;
@@ -185,11 +198,6 @@
*/
stop_ap();
- /* Initialize global variables before we can think of using them.
- */
- global_vars_init(&globvars);
- globvars.init_detected = init_detected;
-
hardware_stage1();
//
--
http://www.hailfinger.org/
More information about the coreboot
mailing list