summaryrefslogtreecommitdiff
path: root/kernel/mboot/mmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mboot/mmap.c')
-rw-r--r--kernel/mboot/mmap.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/kernel/mboot/mmap.c b/kernel/mboot/mmap.c
index d1d3d9a..96dc54c 100644
--- a/kernel/mboot/mmap.c
+++ b/kernel/mboot/mmap.c
@@ -7,6 +7,12 @@
#define MULTIBOOT_TAG_TYPE_MMAP 6
+#define MULTIBOOT_SEG_TYPE_RESV 0
+#define MULTIBOOT_SEG_TYPE_FREE 1
+#define MULTIBOOT_SEG_TYPE_ACPI 3
+#define MULTIBOOT_SEG_TYPE_HIBR 4
+#define MULTIBOOT_SEG_TYPE_DEFC 5
+
struct multiboot_mmap_entry {
uint64_t addr;
uint64_t len;
@@ -32,14 +38,32 @@ int mboot_get_mmap(struct memory_map *res)
int idx = 0;
uintptr_t i = (uintptr_t)mmap->entries;
- for (; i < (uintptr_t)mmap->entries + mmap->size;
- i += mmap->entry_size, idx++) {
+ for (; i < (uintptr_t)mmap->entries + mmap->size; i += mmap->entry_size) {
if (idx >= N_MMAP_ENTRY)
panic("Too many mmap entries: limit is %d", N_MMAP_ENTRY);
struct multiboot_mmap_entry *seg = (struct multiboot_mmap_entry *)i;
res->entries[idx].addr = seg->addr;
res->entries[idx].len = seg->len;
- res->entries[idx].type = seg->type;
+ switch (seg->type) {
+ case MULTIBOOT_SEG_TYPE_RESV:
+ res->entries[idx].type = SEG_TYPE_RESERVED;
+ break;
+ case MULTIBOOT_SEG_TYPE_FREE:
+ res->entries[idx].type = SEG_TYPE_FREE;
+ break;
+ case MULTIBOOT_SEG_TYPE_ACPI:
+ res->entries[idx].type = SEG_TYPE_ACPI;
+ break;
+ case MULTIBOOT_SEG_TYPE_HIBR:
+ res->entries[idx].type = SEG_TYPE_HIBERNATION;
+ break;
+ case MULTIBOOT_SEG_TYPE_DEFC:
+ res->entries[idx].type = SEG_TYPE_DEFECTIVE;
+ break;
+ default:
+ continue;
+ }
+ idx++;
}
res->entry_count = idx;