Author: hailfinger Date: 2008-08-14 11:25:58 +0200 (Thu, 14 Aug 2008) New Revision: 760
Modified: coreboot-v3/arch/x86/stage1.c coreboot-v3/include/arch/x86/cpu.h coreboot-v3/include/console.h coreboot-v3/lib/console.c Log: Introduce a generic global variable storage mechanism and switch the printk buffer management to it.
Build tested and boot tested and result tested on Qemu.
Adding a new global variable is not as easy as it looks, but the comments in the code should be good enough to tell you how.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net Acked-by: Ronald G. Minnich rminnich@gmail.com
Modified: coreboot-v3/arch/x86/stage1.c =================================================================== --- coreboot-v3/arch/x86/stage1.c 2008-08-14 01:40:31 UTC (rev 759) +++ coreboot-v3/arch/x86/stage1.c 2008-08-14 09:25:58 UTC (rev 760) @@ -70,12 +70,21 @@
}
+/* + * The name is slightly misleading because this is the initial stack pointer, + * not the address of the first element on the stack. + */ void *bottom_of_stack(void) { - /* -4-4 because CONFIG_CARBASE + CONFIG_CARSIZE - 4 is initial %esp */ - return (void *)(CONFIG_CARBASE + CONFIG_CARSIZE - 4 - 4); + /* -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_vars)); +} + void dump_mem_range(int msg_level, unsigned char *buf, int size) { int i;
Modified: coreboot-v3/include/arch/x86/cpu.h =================================================================== --- coreboot-v3/include/arch/x86/cpu.h 2008-08-14 01:40:31 UTC (rev 759) +++ coreboot-v3/include/arch/x86/cpu.h 2008-08-14 09:25:58 UTC (rev 760) @@ -202,6 +202,7 @@ }
SHARED(bottom_of_stack, void *, void); +SHARED(global_vars, struct global_vars *, void);
#ifdef CONFIG_CONSOLE_BUFFER #define PRINTK_BUF_SIZE_CAR (CONFIG_CARSIZE / 2)
Modified: coreboot-v3/include/console.h =================================================================== --- coreboot-v3/include/console.h 2008-08-14 01:40:31 UTC (rev 759) +++ coreboot-v3/include/console.h 2008-08-14 09:25:58 UTC (rev 760) @@ -59,6 +59,18 @@ }; #endif
+/* + * If you change struct global_vars in any way, you have to fix all stage0 asm + * code. The stage0 asm code modification is nontrivial (size of the struct, + * alignment, initialization, order of struct members, initialization). + * Depending on your compiler, real breakage may happen. + */ +struct global_vars { +#ifdef CONFIG_CONSOLE_BUFFER + struct printk_buffer *printk_buffer; +#endif +}; + SHARED_WITH_ATTRIBUTES(printk, int, __attribute__((format (printf, 2, 3))), int msg_level, const char *fmt, ...); SHARED(banner, void, int msg_level, const char *msg);
Modified: coreboot-v3/lib/console.c =================================================================== --- coreboot-v3/lib/console.c 2008-08-14 01:40:31 UTC (rev 759) +++ coreboot-v3/lib/console.c 2008-08-14 09:25:58 UTC (rev 760) @@ -35,13 +35,16 @@ }
#ifdef CONFIG_CONSOLE_BUFFER +struct printk_buffer *printk_buffer_addr(void) +{ + return global_vars()->printk_buffer; +} + void printk_buffer_move(void *newaddr, int newsize) { - struct printk_buffer **p; struct printk_buffer *oldbuf, *newbuf; int copylen; - p = bottom_of_stack(); - oldbuf = *p; + oldbuf = printk_buffer_addr(); newbuf = newaddr; newbuf->len = newsize; newbuf->readoffset = 0; @@ -68,17 +71,10 @@ &oldbuf->buffer[0], copylen); newbuf->writeoffset += copylen; } - *p = newbuf; + global_vars()->printk_buffer = newbuf; return; }
-struct printk_buffer *printk_buffer_addr(void) -{ - struct printk_buffer **p; - p = bottom_of_stack(); - return *p; -} - void printk_buffer_init(void) { struct printk_buffer *buf = printk_buffer_addr();