Add support for a 'bootlog' module to coreinfo.
authorUwe Hermann <uwe@hermann-uwe.de>
Tue, 22 Apr 2008 20:19:53 +0000 (20:19 +0000)
committerUwe Hermann <uwe@hermann-uwe.de>
Tue, 22 Apr 2008 20:19:53 +0000 (20:19 +0000)
It displays the coreboot 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>
Acked-by: Jordan Crouse <jordan.crouse@amd.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3247 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

payloads/coreinfo/Kconfig
payloads/coreinfo/Makefile
payloads/coreinfo/bootlog_module.c [new file with mode: 0644]
payloads/coreinfo/coreinfo.c

index b0754dedc3e88a8196e0fa52d0b92fb0fdd9c0f7..37bfa6bd3656081c6c228a5aa0561fc91b04ef8f 100644 (file)
@@ -64,5 +64,9 @@ config MODULE_NVRAM
        help
          This option will increase the ELF file size by ca. 350 bytes.
 
+config MODULE_BOOTLOG
+       bool "Enable the coreboot bootlog module"
+       default y
+
 endmenu
 
index ac36fd9173196fad62666c278e1145620dfd6a85..d8d7f759568f6769d6549bee2c94e8c21f9b86be 100644 (file)
@@ -51,7 +51,7 @@ AS = $(LIBPAYLOAD_DIR)/bin/lpas
 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 bootlog_module.o coreinfo.o
 OBJS    = $(patsubst %,$(obj)/%,$(OBJECTS))
 TARGET  = $(obj)/coreinfo.elf
 
diff --git a/payloads/coreinfo/bootlog_module.c b/payloads/coreinfo/bootlog_module.c
new file mode 100644 (file)
index 0000000..74424e2
--- /dev/null
@@ -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_BOOTLOG
+
+#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 bootlog_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 bootlog_module_redraw(WINDOW *win)
+{
+       int x = 0, y = 0;
+       char *tmp = buf + cursor;
+
+       print_module_title(win, "Coreboot Bootlog");
+
+       /* 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 bootlog_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 bootlog_module = {
+       .name = "Bootlog",
+       .init = bootlog_module_init,
+       .redraw = bootlog_module_redraw,
+       .handle = bootlog_module_handle,
+};
+
+#else
+
+struct coreinfo_module bootlog_module = {
+};
+
+#endif
index 40c4d07cba1172239cb01177182212ae24cf5e56..13a08f24a2f1f45eb53afb2fa73013fa2d0c1e34 100644 (file)
@@ -26,6 +26,7 @@ extern struct coreinfo_module cpuinfo_module;
 extern struct coreinfo_module pci_module;
 extern struct coreinfo_module coreboot_module;
 extern struct coreinfo_module nvram_module;
+extern struct coreinfo_module bootlog_module;
 
 struct coreinfo_module *modules[] = {
 #ifdef CONFIG_MODULE_CPUINFO
@@ -40,6 +41,9 @@ struct coreinfo_module *modules[] = {
 #ifdef CONFIG_MODULE_NVRAM
        &nvram_module,
 #endif
+#ifdef CONFIG_MODULE_BOOTLOG
+       &bootlog_module,
+#endif
 };
 
 static WINDOW *modwin;