60 lines
1.4 KiB
C
60 lines
1.4 KiB
C
#include "socks/types.h"
|
|
#include <socks/memblock.h>
|
|
#include <socks/printk.h>
|
|
#include <socks/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);
|
|
}
|