[coreboot] global_vars
Kevin O'Connor
kevin at koconnor.net
Tue Sep 9 03:18:11 CEST 2008
Hi,
I was looking through the v3 code and came across this:
void *bottom_of_stack(void)
{
/* -4 because CONFIG_CARBASE + CONFIG_CARSIZE - 4 is initial %esp */
return (void *)(CONFIG_CARBASE + CONFIG_CARSIZE - 4);
}
struct global_vars *global_vars(void)
{
return *(struct global_vars **)(bottom_of_stack() - sizeof(struct global_var\
s *));
}
[...]
void __attribute__((stdcall)) stage1_main(u32 bist, u32 init_detected)
{
struct global_vars globvars;
If I understand the code correctly, the global_vars() function is
trying to get at the stack variable globvars declared in stage1_main.
It's not valid to do that - the compiler is free to re-order stack
variables, change them, or otherwise do funky things.
A better way to do this would be to have some assembler code prior to
stage1_main() reserve the space for globvars.
-Kevin
More information about the coreboot
mailing list