[coreboot] r3247 - trunk/payloads/coreinfo

svn at coreboot.org svn at coreboot.org
Tue Apr 22 22:19:54 CEST 2008


Author: uwe
Date: 2008-04-22 22:19:53 +0200 (Tue, 22 Apr 2008)
New Revision: 3247

Added:
   trunk/payloads/coreinfo/bootlog_module.c
Modified:
   trunk/payloads/coreinfo/Kconfig
   trunk/payloads/coreinfo/Makefile
   trunk/payloads/coreinfo/coreinfo.c
Log:
Add support for a 'bootlog' module to coreinfo.
 
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 at hermann-uwe.de>
Acked-by: Jordan Crouse <jordan.crouse at amd.com>



Modified: trunk/payloads/coreinfo/Kconfig
===================================================================
--- trunk/payloads/coreinfo/Kconfig	2008-04-22 16:56:21 UTC (rev 3246)
+++ trunk/payloads/coreinfo/Kconfig	2008-04-22 20:19:53 UTC (rev 3247)
@@ -64,5 +64,9 @@
 	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
 

Modified: trunk/payloads/coreinfo/Makefile
===================================================================
--- trunk/payloads/coreinfo/Makefile	2008-04-22 16:56:21 UTC (rev 3246)
+++ trunk/payloads/coreinfo/Makefile	2008-04-22 20:19:53 UTC (rev 3247)
@@ -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 bootlog_module.o coreinfo.o
 OBJS    = $(patsubst %,$(obj)/%,$(OBJECTS))
 TARGET  = $(obj)/coreinfo.elf
 

Added: trunk/payloads/coreinfo/bootlog_module.c
===================================================================
--- trunk/payloads/coreinfo/bootlog_module.c	                        (rev 0)
+++ trunk/payloads/coreinfo/bootlog_module.c	2008-04-22 20:19:53 UTC (rev 3247)
@@ -0,0 +1,143 @@
+/*
+ * This file is part of the coreinfo project.
+ *
+ * Copyright (C) 2008 Uwe Hermann <uwe at 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

Modified: trunk/payloads/coreinfo/coreinfo.c
===================================================================
--- trunk/payloads/coreinfo/coreinfo.c	2008-04-22 16:56:21 UTC (rev 3246)
+++ trunk/payloads/coreinfo/coreinfo.c	2008-04-22 20:19:53 UTC (rev 3247)
@@ -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 bootlog_module;
 
 struct coreinfo_module *modules[] = {
 #ifdef CONFIG_MODULE_CPUINFO
@@ -40,6 +41,9 @@
 #ifdef CONFIG_MODULE_NVRAM
 	&nvram_module,
 #endif
+#ifdef CONFIG_MODULE_BOOTLOG
+	&bootlog_module,
+#endif
 };
 
 static WINDOW *modwin;





More information about the coreboot mailing list