Here is a coreinfo module implementing a LAR browser. This uses the submenu patch I sent out earlier today. A good example of how the LAR walking code works.
On Fri, Apr 25, 2008 at 05:25:24PM -0600, Jordan Crouse wrote:
coreinfo: Add a module for browsing the boot LAR
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Acked-by: Peter Stuge peter@stuge.se
Index: coreinfo/Kconfig
--- coreinfo.orig/Kconfig 2008-04-25 10:08:02.000000000 -0600 +++ coreinfo/Kconfig 2008-04-25 10:17:41.000000000 -0600 @@ -68,5 +68,9 @@ bool "Enable the coreboot bootlog module" default y
+config MODULE_LAR
- bool "Enable the coreboot LAR module"
- default y
endmenu
Index: coreinfo/Makefile
--- coreinfo.orig/Makefile 2008-04-25 10:08:02.000000000 -0600 +++ coreinfo/Makefile 2008-04-25 17:24:38.000000000 -0600 @@ -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 bootlog_module.o coreinfo.o
nvram_module.o bootlog_module.o lar_module.o coreinfo.o
OBJS = $(patsubst %,$(obj)/%,$(OBJECTS)) TARGET = $(obj)/coreinfo.elf
Index: coreinfo/coreinfo.c
--- coreinfo.orig/coreinfo.c 2008-04-25 10:09:34.000000000 -0600 +++ coreinfo/coreinfo.c 2008-04-25 17:22:21.000000000 -0600 @@ -27,6 +27,7 @@ extern struct coreinfo_module coreboot_module; extern struct coreinfo_module nvram_module; extern struct coreinfo_module bootlog_module; +extern struct coreinfo_module lar_module;
struct coreinfo_module *system_modules[] = { #ifdef CONFIG_MODULE_CPUINFO @@ -47,6 +48,9 @@ #ifdef CONFIG_MODULE_BOOTLOG &bootlog_module, #endif +#ifdef CONFIG_MODULE_LAR
- &lar_module
+#endif };
struct coreinfo_cat { @@ -90,7 +94,7 @@ char menu[80]; char *ptr = menu;
- wmove(stdscr, 22, 0);
wmove(stdscr, SCREEN_Y - 2, 0);
for (j = 0; j < SCREEN_X; j++) waddch(stdscr, ' ');
@@ -101,7 +105,7 @@ for (i = 0; i < cat->count; i++) ptr += sprintf(ptr, "[%c: %s] ", 'A' + i, cat->modules[i]->name);
- mvprintw(22, 0, menu);
- mvprintw(SCREEN_Y - 2, 0, menu);
}
static void print_menu(void) @@ -110,7 +114,7 @@ char menu[80]; char *ptr = menu;
- wmove(stdscr, 23, 0);
wmove(stdscr, SCREEN_Y - 1, 0);
for (j = 0; j < SCREEN_X; j++) waddch(stdscr, ' ');
@@ -118,10 +122,10 @@ for (i = 0; i < ARRAY_SIZE(categories); i++) ptr += sprintf(ptr, "F%d: %s ", i + 1, categories[i].name);
- mvprintw(23, 0, menu);
- mvprintw(SCREEN_Y - 1, 0, menu);
#ifdef CONFIG_SHOW_DATE_TIME
- mvprintw(23, 59, "%02d/%02d/20%02d - %02d:%02d:%02d",
- mvprintw(SCREEN_Y - 1, 59, "%02d/%02d/20%02d - %02d:%02d:%02d", bcd2dec(nvram_read(NVRAM_RTC_MONTH)), bcd2dec(nvram_read(NVRAM_RTC_DAY)), bcd2dec(nvram_read(NVRAM_RTC_YEAR)),
@@ -243,12 +247,12 @@ init_pair(2, COLOR_BLACK, COLOR_WHITE); init_pair(3, COLOR_WHITE, COLOR_WHITE);
- modwin = newwin(22, 80, 1, 0);
modwin = newwin(SCREEN_Y-3, SCREEN_X, 1, 0);
wattrset(stdscr, COLOR_PAIR(1) | A_BOLD); wattrset(modwin, COLOR_PAIR(2));
- for (i = 0; i < 23; i++) {
for (i = 0; i < SCREEN_Y - 1; i++) { wmove(modwin, i - 1, 0);
for (j = 0; j < SCREEN_X; j++)
Index: coreinfo/lar_module.c
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ coreinfo/lar_module.c 2008-04-25 10:17:41.000000000 -0600 @@ -0,0 +1,163 @@ +/*
- This file is part of the coreinfo project.
- Copyright (C) 2008 Advanced Micro Devices, Inc.
- 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_LAR
+static struct LAR *lar; +static int lcount; +static char **lnames;
+static int lar_module_init(void) +{
- int index = 0;
- struct larent *larent;
- lar = openlar(NULL);
- if (lar == NULL)
return 0;
- while((larent = readlar(lar)))
lcount++;
- lnames = malloc(lcount * sizeof(char *));
- if (lnames == NULL)
return 0;
- rewindlar(lar);
- while((larent = readlar(lar)))
lnames[index++] = strdup((const char *) larent->name);
- return 0;
+}
+static int selected;
+static int lar_module_redraw(WINDOW *win) +{
- int i;
- int row = 2;
- struct larstat stat;
- print_module_title(win, "LAR Listing");
- if (lar == 0) {
mvwprintw(win, 11, 61/2, "Bad or missing LAR");
return 0;
- }
- /* Draw a line down the middle */
- for(i = 2; i < 20; i++) {
wmove(win, i, 30);
waddch(win, '\263');
- }
- /* Draw the names down the left side */
- for(i = 0; i < lcount; i++) {
if (i == selected)
wattrset(win, COLOR_PAIR(3) | A_BOLD);
else
wattrset(win, COLOR_PAIR(2));
mvwprintw(win, 2 + i, 1, "%.25s", lnames[i]);
- }
- /* Get the information for the LAR */
- if (larstat(lar, lnames[selected], &stat)) {
printf("larstat failed\n");
return 0;
- }
- wattrset(win, COLOR_PAIR(2));
- mvwprintw(win, row++, 32, "Offset: 0x%x", stat.offset);
- if (stat.compression) {
switch(stat.compression) {
case ALGO_LZMA:
mvwprintw(win, row++, 32, "Compression: LZMA");
break;
case ALGO_NRV2B:
mvwprintw(win, row++, 32, "Compression: NRV2B");
break;
case ALGO_ZEROES:
mvwprintw(win, row++, 32, "Compression: zeroes");
break;
}
mvwprintw(win, row++, 32, "Compressed length: %d", stat.len);
mvwprintw(win, row++, 32, "Compressed checksum: 0x%x", stat.compchecksum);
- }
- mvwprintw(win, row++, 32, "Length: %d", stat.reallen);
- mvwprintw(win, row++, 32, "Checksum: 0x%x", stat.checksum);
- mvwprintw(win, row++, 32, "Load Address: 0x%llx", stat.loadaddress);
- mvwprintw(win, row++, 32, "Entry Point: 0x%llx", stat.entry);
- return 0;
+}
+static int lar_module_handle(int key) +{
- int ret = 0;
- if (lar == NULL)
return 0;
- switch (key) {
- case KEY_DOWN:
if (selected + 1 < lcount) {
selected++;
ret = 1;
}
break;
- case KEY_UP:
if (selected > 0) {
selected--;
ret = 1;
}
break;
- }
- return ret;
+}
+struct coreinfo_module lar_module = {
- .name = "LAR",
- .init = lar_module_init,
- .redraw = lar_module_redraw,
- .handle = lar_module_handle
+}; +#else
+struct coreinfo_module lar_module = { +};
+#endif
On 26/04/08 01:36 +0200, Peter Stuge wrote:
On Fri, Apr 25, 2008 at 05:25:24PM -0600, Jordan Crouse wrote:
coreinfo: Add a module for browsing the boot LAR
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Acked-by: Peter Stuge peter@stuge.se
r3289. Thanks. My coreinfo queue is empty. :)
Jordan