vm: refactor page_array and functions into a separate source file

This commit is contained in:
2023-02-07 21:18:08 +00:00
parent b13907f3bc
commit 4edc7e308e
5 changed files with 97 additions and 47 deletions

View File

@@ -4,12 +4,6 @@
#include <socks/vm.h>
#include <socks/libc/string.h>
/* array of pages, one for each physical page frame present in RAM */
static vm_page_t *page_array = NULL;
/* number of pages stored in page_array */
static size_t page_array_count = 0;
/* Pre-calculated page order -> size conversion table */
static size_t page_order_bytes[] = {
[VM_PAGE_4K] = 0x1000,
@@ -64,47 +58,14 @@ void *vm_phys_to_virt(phys_addr_t p)
return (void *)(VM_PAGEMAP_BASE + p);
}
void vm_page_init_array()
{
size_t pmem_size = 0;
memblock_iter_t it;
for_each_free_mem_range (&it, 0x0, UINTPTR_MAX) {
if (pmem_size < it.it_limit + 1) {
pmem_size = it.it_limit + 1;
}
}
size_t nr_pages = pmem_size / VM_PAGE_SIZE;
if (pmem_size % VM_PAGE_SIZE) {
nr_pages++;
}
page_array = memblock_alloc(sizeof(vm_page_t) * nr_pages, 8);
page_array_count = nr_pages;
size_t nr_reserved = nr_pages;
for (size_t i = 0; i < nr_pages; i++) {
page_array[i].p_flags = VM_PAGE_RESERVED;
}
for_each_free_mem_range(&it, 0x0, UINTPTR_MAX) {
for (uintptr_t i = it.it_base; i < it.it_limit; i += VM_PAGE_SIZE) {
size_t pfn = i / VM_PAGE_SIZE;
page_array[pfn].p_flags = 0;
nr_reserved--;
}
}
printk("vm: page array has %zu pages, %zu reserved", nr_pages, nr_reserved);
}
vm_page_t *vm_page_get(phys_addr_t addr)
{
size_t pfn = addr / VM_PAGE_SIZE;
return pfn < page_array_count ? &page_array[pfn] : NULL;
switch (vm_memory_model()) {
case VM_MODEL_FLAT:
return vm_page_get_flat(addr);
default:
return NULL;
}
}
phys_addr_t vm_page_get_paddr(vm_page_t *pg)
@@ -119,7 +80,12 @@ void *vm_page_get_vaddr(vm_page_t *pg)
size_t vm_page_get_pfn(vm_page_t *pg)
{
return ((uintptr_t)pg - (uintptr_t)page_array) / sizeof *pg;
switch (vm_memory_model()) {
case VM_MODEL_FLAT:
return vm_page_get_pfn_flat(pg);
default:
return 0;
}
}
size_t vm_page_order_to_bytes(vm_page_order_t order)