Files
mango/arch/x86_64/e820.c
Max Wash 6019c9307d kernel: separate headers into kernel and user headers
all kernel headers have been moved from include/mango to include/kernel
and include definitions that are only relevant to kernel-space.

any definitions that are relevant to both kernel- and user-space
(i.e. type definitions, syscall IDs) have been moved to
include/mango within libmango.
2026-02-19 18:54:48 +00:00

60 lines
1.4 KiB
C

#include <arch/e820.h>
#include <kernel/memblock.h>
#include <kernel/printk.h>
#include <kernel/types.h>
#include <kernel/util.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);
}