Files
mango/arch/x86_64/e820.c
2024-11-02 11:31:51 +00:00

60 lines
1.4 KiB
C

#include "mango/types.h"
#include <mango/memblock.h>
#include <mango/printk.h>
#include <mango/util.h>
#include <arch/e820.h>
void e820_scan(multiboot_memory_map_t *mmap, size_t len)
{
size_t mem_total = 0, mem_reserved = 0;
multiboot_memory_map_t *entry = NULL;
for (size_t i = 0; i < len; i += sizeof *entry) {
entry = (void *)((char *)mmap + i);
int reserved = 1;
const char *type = "unknown";
switch (entry->type) {
case MULTIBOOT_MEMORY_AVAILABLE:
type = "available";
reserved = 0;
break;
case MULTIBOOT_MEMORY_RESERVED:
type = "reserved";
break;
case MULTIBOOT_MEMORY_ACPI_RECLAIMABLE:
type = "acpi";
break;
case MULTIBOOT_MEMORY_NVS:
type = "nvs";
break;
case MULTIBOOT_MEMORY_BADRAM:
type = "bad";
break;
default:
break;
}
printk("e820: [mem 0x%016llx-0x%016llx] %s",
entry->addr, entry->addr + entry->len - 1, type);
memblock_add(entry->addr, entry->len);
if (reserved) {
memblock_reserve(entry->addr, entry->len);
mem_reserved += entry->len;
}
mem_total += entry->len;
}
/* reserve a page at 0x8000 for use by the ACPI AP trampoline code */
memblock_reserve(0x8000, 0x1000);
char str_mem_total[64], str_mem_reserved[64];
data_size_to_string(mem_total, str_mem_total, sizeof str_mem_total);
data_size_to_string(mem_reserved, str_mem_reserved, sizeof str_mem_reserved);
printk("e820: total memory: %s, hw reserved: %s", str_mem_total, str_mem_reserved);
}