diff options
author | Jordan Crouse <jordan.crouse@amd.com> | 2008-05-07 20:43:15 +0000 |
---|---|---|
committer | Jordan Crouse <jordan.crouse@amd.com> | 2008-05-07 20:43:15 +0000 |
commit | aa6e378c4e411ffbb7affb8bead096d281a12cf0 (patch) | |
tree | d0e858345141a1136bcbd5f6f6e2b233699bdd7a /payloads/coreinfo/lar_module.c | |
parent | 681ec27e2c64763bba02ef816d41b6b366559f03 (diff) |
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>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3289 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'payloads/coreinfo/lar_module.c')
-rw-r--r-- | payloads/coreinfo/lar_module.c | 163 |
1 files changed, 163 insertions, 0 deletions
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 + + + + |