summaryrefslogtreecommitdiff
path: root/payloads/coreinfo/multiboot_module.c
diff options
context:
space:
mode:
authorJordan Crouse <jordan@cosmicpenguin.net>2008-11-11 19:53:42 +0000
committerJordan Crouse <jordan.crouse@amd.com>2008-11-11 19:53:42 +0000
commit5cb4d9d663d2ed5b8225dbbb00507637016d3fc4 (patch)
tree4407169053b81a93b5255d6c3d2a97c81f01402d /payloads/coreinfo/multiboot_module.c
parent6c6e4333c4ef8a86e70e14fcff57a5747339b165 (diff)
[PATCH] coreinfo: Add multiboot parsing support
Rename the "coreboot" menu "firmware", and add a module to parse the multiboot table. For now, just parse memory, but it can be expanded as needed. Signed-off-by: Jordan Crouse <jordan@cosmicpenguin.net> Acked-by: Peter Stuge <peter@stuge.se> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3744 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'payloads/coreinfo/multiboot_module.c')
-rw-r--r--payloads/coreinfo/multiboot_module.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/payloads/coreinfo/multiboot_module.c b/payloads/coreinfo/multiboot_module.c
new file mode 100644
index 0000000000..164049dc29
--- /dev/null
+++ b/payloads/coreinfo/multiboot_module.c
@@ -0,0 +1,121 @@
+/*
+ * This file is part of the coreinfo project.
+ *
+ * Copyright (C) 2008 Jordan Crouse <jordan@cosmicpenguin.net>
+ *
+ * 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 <multiboot_tables.h>
+#include "coreinfo.h"
+
+#ifdef CONFIG_MODULE_MULTIBOOT
+
+#define MAX_MEMORY_COUNT 10
+
+static struct {
+ int mem_count;
+
+ struct {
+ u64 start;
+ u64 size;
+ int type;
+ } range[MAX_MEMORY_COUNT];
+} cb_info;
+
+static int tables_good = 0;
+
+int multiboot_module_redraw(WINDOW *win)
+{
+ int row = 2;
+ int i;
+
+ print_module_title(win, "Multiboot Tables");
+
+ if (tables_good == 0) {
+ mvwprintw(win, row++, 1, "No multiboot tables were found");
+ return 0;
+ }
+
+ row++;
+ mvwprintw(win, row++, 1, "-- Memory Map --");
+
+ for (i = 0; i < cb_info.mem_count; i++) {
+
+ if (cb_info.range[i].type == 1)
+ mvwprintw(win, row++, 3, " RAM: ");
+ else
+ mvwprintw(win, row++, 3, "Reserved: ");
+
+ wprintw(win, "%16.16llx - %16.16llx",
+ cb_info.range[i].start,
+ cb_info.range[i].start + cb_info.range[i].size - 1);
+ }
+
+ return 0;
+}
+
+static void parse_memory(struct multiboot_header *table)
+{
+ u8 *start = (u8 *) phys_to_virt(table->mmap_addr);
+ u8 *ptr = start;
+ int i = 0;
+
+ cb_info.mem_count = 0;
+
+ while(ptr < (start + table->mmap_length)) {
+ struct multiboot_mmap *mmap = (struct multiboot_mmap *) ptr;
+
+ cb_info.range[i].start = mmap->addr;
+ cb_info.range[i].size = mmap->length;
+ cb_info.range[i].type = mmap->type;
+
+ if (++cb_info.mem_count == MAX_MEMORY_COUNT)
+ return;
+
+ ptr += (mmap->size + sizeof(mmap->size));
+ i++;
+ }
+}
+
+static void parse_header(unsigned long addr)
+{
+ struct multiboot_header *table = (struct multiboot_header *) addr;
+
+ if (table->flags & MULTIBOOT_FLAGS_MMAP)
+ parse_memory(table);
+}
+
+static int multiboot_module_init(void)
+{
+ unsigned long mbaddr;
+ tables_good = sysinfo_have_multiboot(&mbaddr);
+
+ parse_header(mbaddr);
+
+ return tables_good ? 0 : -1;
+}
+
+struct coreinfo_module multiboot_module = {
+ .name = "Multiboot",
+ .init = multiboot_module_init,
+ .redraw = multiboot_module_redraw,
+};
+
+#else
+
+struct coreinfo_module multiboot_module = {
+};
+
+#endif