From aa6e378c4e411ffbb7affb8bead096d281a12cf0 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 7 May 2008 20:43:15 +0000 Subject: coreinfo: Add a module for browsing the boot LAR Signed-off-by: Jordan Crouse Acked-by: Peter Stuge git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3289 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- payloads/coreinfo/lar_module.c | 163 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 payloads/coreinfo/lar_module.c (limited to 'payloads/coreinfo/lar_module.c') diff --git a/payloads/coreinfo/lar_module.c b/payloads/coreinfo/lar_module.c new file mode 100644 index 0000000000..d8ef3cbf4a --- /dev/null +++ b/payloads/coreinfo/lar_module.c @@ -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 + + + + -- cgit v1.2.3