On 22/04/08 11:10 +0200, Uwe Hermann wrote:
See patch.
Uwe.
http://www.hermann-uwe.de | http://www.holsham-traders.de http://www.crazy-hacks.org | http://www.unmaintained-free-software.org
Add support for a 'Dmesg' module to coreinfo.
It displays the printk buffer in RAM and let's you scroll through it. This feature is only available for coreboot v3 though, as v2 doesn't have a printk-buffer feature, yet.
Signed-off-by: Uwe Hermann uwe@hermann-uwe.de
Wow - thats cute! Acked-by: Jordan Crouse jordan.crouse@amd.com
Index: Kconfig
--- Kconfig (Revision 3245) +++ Kconfig (Arbeitskopie) @@ -64,5 +64,9 @@ help This option will increase the ELF file size by ca. 150 bytes.
+config MODULE_DMESG
- bool "Enable the coreboot dmesg buffer module"
- default y
endmenu
Index: coreinfo.c
--- coreinfo.c (Revision 3245) +++ coreinfo.c (Arbeitskopie) @@ -26,6 +26,7 @@ extern struct coreinfo_module pci_module; extern struct coreinfo_module coreboot_module; extern struct coreinfo_module nvram_module; +extern struct coreinfo_module dmesg_module;
struct coreinfo_module *modules[] = { #ifdef CONFIG_MODULE_CPUINFO @@ -40,6 +41,9 @@ #ifdef CONFIG_MODULE_NVRAM &nvram_module, #endif +#ifdef CONFIG_MODULE_DMESG
- &dmesg_module,
+#endif };
static WINDOW *modwin; Index: dmesg_module.c =================================================================== --- dmesg_module.c (Revision 0) +++ dmesg_module.c (Revision 0) @@ -0,0 +1,143 @@ +/*
- This file is part of the coreinfo project.
- Copyright (C) 2008 Uwe Hermann uwe@hermann-uwe.de
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
+#include "coreinfo.h"
+#ifdef CONFIG_MODULE_DMESG
+#define CONFIG_COREBOOT_PRINTK_BUFFER_ADDR 0x90000 +#define CONFIG_COREBOOT_PRINTK_BUFFER_SIZE 65536
+static char *buf; +static s32 cursor = 0; +static s32 cursor_max;
+static int dmesg_module_init(void) +{
- int i;
- volatile unsigned long *ptr =
(void *)(CONFIG_COREBOOT_PRINTK_BUFFER_ADDR + 16); /* FIXME */
- buf = malloc(CONFIG_COREBOOT_PRINTK_BUFFER_SIZE);
- if (!buf) {
/* TODO */
- }
- memcpy(buf, (char *)ptr, CONFIG_COREBOOT_PRINTK_BUFFER_SIZE);
- cursor_max = CONFIG_COREBOOT_PRINTK_BUFFER_SIZE;
- for (i = 0; i < 20; i++) {
do {
cursor_max--;
} while (*(buf + cursor_max) != '\n');
- }
- cursor_max++; /* Stay _behind_ the newline. */
- /* TODO: Maybe a _cleanup hook where we call free()? */
- return 0;
+}
+static int dmesg_module_redraw(WINDOW *win) +{
- int x = 0, y = 0;
- char *tmp = buf + cursor;
- print_module_title(win, "Coreboot Dmesg Buffer");
- /* FIXME: Handle lines longer than 80 characters. */
- while (y <= 18) {
mvwaddnstr(win, y + 2, x, tmp, 1);
x++;
tmp++;
if (*tmp == '\n') {
y++;
x = 0;
tmp++; /* Skip the newline. */
}
- }
- return 0;
+}
+/* TODO: Simplify code. */ +static int dmesg_module_handle(int key) +{
- int i;
- switch (key) {
- case KEY_DOWN:
if (cursor == cursor_max)
return 0;
while (*(buf + cursor) != '\n')
cursor++;
cursor++; /* Skip the newline. */
break;
- case KEY_UP:
if (cursor == 0)
return 0;
cursor--; /* Skip the newline. */
do {
cursor--;
} while (*(buf + cursor) != '\n');
cursor++; /* Stay _behind_ the newline. */
break;
- case KEY_NPAGE:
if (cursor == cursor_max)
return 0;
for (i = 0; i < 20; i++) {
while (*(buf + cursor) != '\n')
cursor++;
cursor++; /* Skip the newline. */
}
break;
- case KEY_PPAGE:
if (cursor == 0)
return 0;
for (i = 0; i < 20; i++) {
do {
cursor--;
} while (*(buf + cursor) != '\n');
}
cursor++; /* Stay _behind_ the newline. */
break;
- }
- if (cursor > cursor_max)
cursor = cursor_max;
- if (cursor < 0)
cursor = 0;
- return 1;
+}
+struct coreinfo_module dmesg_module = {
- .name = "Dmesg",
- .init = dmesg_module_init,
- .redraw = dmesg_module_redraw,
- .handle = dmesg_module_handle,
+};
+#else
+struct coreinfo_module dmesg_module = { +};
+#endif Index: Makefile =================================================================== --- Makefile (Revision 3245) +++ Makefile (Arbeitskopie) @@ -51,7 +51,7 @@ INCLUDES = -Ibuild CFLAGS := -Wall -Werror -Os $(INCLUDES) OBJECTS = cpuinfo_module.o cpuid.S.o pci_module.o coreboot_module.o \
nvram_module.o coreinfo.o
nvram_module.o dmesg_module.o coreinfo.o
OBJS = $(patsubst %,$(obj)/%,$(OBJECTS)) TARGET = $(obj)/coreinfo.elf
-- coreboot mailing list coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot