Clone a tag rather than SeaBIOS stable branch HEAD
[coreboot.git] / payloads / coreinfo / lar_module.c
1 /*
2  * This file is part of the coreinfo project.
3  *
4  * Copyright (C) 2008 Advanced Micro Devices, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
18  */
19
20 #include "coreinfo.h"
21
22 #ifdef CONFIG_MODULE_LAR
23
24 static struct LAR *lar;
25 static int lcount, selected;
26 static char **lnames;
27 static const char *compression_table[4] = {"none", "LZMA", "NRV2B", "zeroes"};
28
29 static int lar_module_init(void)
30 {
31         int index = 0;
32         struct larent *larent;
33
34         lar = openlar(NULL);
35
36         if (lar == NULL)
37                 return 0;
38
39         while ((larent = readlar(lar)))
40                 lcount++;
41
42         lnames = malloc(lcount * sizeof(char *));
43
44         if (lnames == NULL)
45                 return 0;
46
47         rewindlar(lar);
48
49         while ((larent = readlar(lar)))
50                 lnames[index++] = strdup((const char *) larent->name);
51
52         return 0;
53 }
54
55 static int lar_module_redraw(WINDOW *win)
56 {
57         int i, row = 2;
58         struct larstat stat;
59
60         print_module_title(win, "LAR Listing");
61
62         if (lar == 0) {
63                 mvwprintw(win, 11, 61 / 2, "Bad or missing LAR");
64                 return 0;
65         }
66
67         /* Draw a line down the middle. */
68         for (i = 2; i < 21; i++)
69                 mvwaddch(win, i, 30, ACS_VLINE);
70
71         /* Draw the names down the left side. */
72         for (i = 0; i < lcount; i++) {
73                 if (i == selected)
74                         wattrset(win, COLOR_PAIR(3) | A_BOLD);
75                 else
76                         wattrset(win, COLOR_PAIR(2));
77
78                 mvwprintw(win, 2 + i, 1, "%.25s", lnames[i]);
79         }
80
81         /* Get the information for the LAR. */
82         if (larstat(lar, lnames[selected], &stat)) {
83                 printf("larstat failed\n");
84                 return 0;
85         }
86
87         wattrset(win, COLOR_PAIR(2));
88
89         mvwprintw(win, row++, 32, "Offset: 0x%x", stat.offset);
90
91         if (stat.compression) {
92                 mvwprintw(win, row++, 32, "Compression: %s",
93                           compression_table[stat.compression]);
94                 mvwprintw(win, row++, 32, "Compressed length: %d", stat.len);
95                 mvwprintw(win, row++, 32, "Compressed checksum: 0x%x",
96                           stat.compchecksum);
97         }
98
99         mvwprintw(win, row++, 32, "Length: %d", stat.reallen);
100         mvwprintw(win, row++, 32, "Checksum: 0x%x", stat.checksum);
101         mvwprintw(win, row++, 32, "Load address: 0x%llx", stat.loadaddress);
102         mvwprintw(win, row++, 32, "Entry point: 0x%llx", stat.entry);
103
104         return 0;
105 }
106
107 static int lar_module_handle(int key)
108 {
109         int ret = 0;
110
111         if (lar == NULL)
112                 return 0;
113
114         switch (key) {
115         case KEY_DOWN:
116                 if (selected + 1 < lcount) {
117                         selected++;
118                         ret = 1;
119                 }
120                 break;
121         case KEY_UP:
122                 if (selected > 0) {
123                         selected--;
124                         ret = 1;
125                 }
126                 break;
127         }
128
129         return ret;
130 }
131
132 struct coreinfo_module lar_module = {
133         .name = "LAR",
134         .init = lar_module_init,
135         .redraw = lar_module_redraw,
136         .handle = lar_module_handle
137 };
138
139 #else
140
141 struct coreinfo_module lar_module = {
142 };
143
144 #endif