coreinfo: Add a module for browsing the boot LAR
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. -- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
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
participants (2)
-
Jordan Crouse -
Peter Stuge