x86_64: initialise memblock using e820
This commit is contained in:
56
arch/x86_64/e820.c
Normal file
56
arch/x86_64/e820.c
Normal file
@@ -0,0 +1,56 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user