improve vmm api

This commit is contained in:
nub31
2025-09-06 18:13:33 +02:00
parent 02f0ba9aad
commit b15c037b16
3 changed files with 48 additions and 17 deletions

View File

@@ -15,7 +15,7 @@
extern u64 pml4[];
static u64 create_pte(u64 physical_address)
static u64 create_pte(u64 physical_address, u32 flags)
{
if (physical_address & (PAGE_SIZE - 1))
{
@@ -23,10 +23,10 @@ static u64 create_pte(u64 physical_address)
panic("Failed to create PTE");
}
return (physical_address & PTE_MASK) | PTE_PRESENT | PTE_WRITABLE | PTE_PS;
return (physical_address & PTE_MASK) | (flags | PTE_PRESENT);
}
void vmm_map(u64 physical_address, u64 virtual_address)
void vmm_map(u64 physical_address, u64 virtual_address, u32 flags)
{
u64 pml4_idx = PML4_INDEX(virtual_address);
u64 pdpt_idx = PDPT_INDEX(virtual_address);
@@ -58,7 +58,7 @@ void vmm_map(u64 physical_address, u64 virtual_address)
panic("Failed to map virtual to physical page");
}
pd_physical_address[pd_idx] = create_pte(physical_address);
pd_physical_address[pd_idx] = create_pte(physical_address, flags);
}
u64 vmm_unmap(u64 virtual_address)
@@ -97,20 +97,39 @@ u64 vmm_unmap(u64 virtual_address)
return physical_address;
}
void* vmm_alloc(u64 virtual_address)
u64 vmm_alloc_address(u64 page_count)
{
u64 physical_address = pmm_alloc();
if (!physical_address)
panic("not implemented");
}
u64 vmm_free_address(u64 virtual_address, u64 page_count)
{
panic("not implemented");
}
void* vmm_alloc(u64 page_count)
{
u64 virtual_address = vmm_alloc_address(page_count);
for (size_t i = 0; i < page_count; i++)
{
panic("Out of physical memory");
u64 physical_address = pmm_alloc();
if (!physical_address)
{
panic("Out of physical memory");
}
vmm_map(physical_address, virtual_address + (i * PAGE_SIZE), PTE_WRITABLE | PTE_PS);
}
vmm_map(physical_address, virtual_address);
return (void*)virtual_address;
}
void vmm_free(u64 virtual_address)
void vmm_free(u64 virtual_address, u64 page_count)
{
u64 physical_address = vmm_unmap(virtual_address);
pmm_free(physical_address);
for (size_t i = 0; i < page_count; i++)
{
u64 physical_address = vmm_unmap(virtual_address + (i * PAGE_SIZE));
pmm_free(physical_address);
}
}