summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--payloads/coreinfo/Kconfig6
-rw-r--r--payloads/coreinfo/Makefile2
-rw-r--r--payloads/coreinfo/coreinfo.c12
-rw-r--r--payloads/coreinfo/multiboot_module.c121
4 files changed, 136 insertions, 5 deletions
diff --git a/payloads/coreinfo/Kconfig b/payloads/coreinfo/Kconfig
index 0cca33c016..26ff6ad719 100644
--- a/payloads/coreinfo/Kconfig
+++ b/payloads/coreinfo/Kconfig
@@ -70,6 +70,12 @@ config MODULE_COREBOOT
help
This option will increase the ELF file size by ca. 2250 bytes.
+config MODULE_MULTIBOOT
+ bool "Enable the multiboot module"
+ default y
+ help
+ This option will increase the ELF file size by ca. 1792 bytes.
+
config MODULE_CPUINFO
bool "Enable the cpuinfo module"
default y
diff --git a/payloads/coreinfo/Makefile b/payloads/coreinfo/Makefile
index 077aaa2276..2fc1d8cc66 100644
--- a/payloads/coreinfo/Makefile
+++ b/payloads/coreinfo/Makefile
@@ -53,7 +53,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 ramdump_module.o lar_module.o \
- coreinfo.o
+ multiboot_module.o coreinfo.o
OBJS = $(patsubst %,$(obj)/%,$(OBJECTS))
TARGET = $(obj)/coreinfo.elf
diff --git a/payloads/coreinfo/coreinfo.c b/payloads/coreinfo/coreinfo.c
index 3d8f42b99a..befe988c2d 100644
--- a/payloads/coreinfo/coreinfo.c
+++ b/payloads/coreinfo/coreinfo.c
@@ -27,6 +27,7 @@
extern struct coreinfo_module cpuinfo_module;
extern struct coreinfo_module pci_module;
extern struct coreinfo_module coreboot_module;
+extern struct coreinfo_module multiboot_module;
extern struct coreinfo_module nvram_module;
extern struct coreinfo_module bootlog_module;
extern struct coreinfo_module ramdump_module;
@@ -47,10 +48,13 @@ struct coreinfo_module *system_modules[] = {
#endif
};
-struct coreinfo_module *coreboot_modules[] = {
+struct coreinfo_module *firmware_modules[] = {
#ifdef CONFIG_MODULE_COREBOOT
&coreboot_module,
#endif
+#ifdef CONFIG_MODULE_MULTIBOOT
+ &multiboot_module,
+#endif
#ifdef CONFIG_MODULE_BOOTLOG
&bootlog_module,
#endif
@@ -71,9 +75,9 @@ struct coreinfo_cat {
.count = ARRAY_SIZE(system_modules),
},
{
- .name = "Coreboot",
- .modules = coreboot_modules,
- .count = ARRAY_SIZE(coreboot_modules),
+ .name = "Firmware",
+ .modules = firmware_modules,
+ .count = ARRAY_SIZE(firmware_modules),
}
};
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