[coreboot] r760 - in coreboot-v3: arch/x86 include include/arch/x86 lib
svn at coreboot.org
svn at coreboot.org
Thu Aug 14 11:25:59 CEST 2008
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 at gmx.net>
Acked-by: Ronald G. Minnich <rminnich at 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();
More information about the coreboot
mailing list