Luna/kernel/src/memory/UserVM.h

47 lines
1.1 KiB
C
Raw Normal View History

#pragma once
#include <luna/LinkedList.h>
#include <luna/OwnedPtr.h>
#include <luna/Result.h>
class VMRegion : LinkedListNode<VMRegion>
{
public:
u64 start;
u64 end;
usize count;
bool used { true };
bool persistent { false };
};
class UserVM
{
public:
UserVM();
~UserVM();
Result<u64> alloc_region(usize count, bool persistent = false);
Result<bool> test_and_alloc_region(u64 address, usize count)
{
return set_region(address, count, true);
}
Result<bool> free_region(u64 address, usize count)
{
return set_region(address, count, false);
}
static Result<OwnedPtr<UserVM>> try_create();
2023-03-18 22:45:48 +00:00
Result<OwnedPtr<UserVM>> clone();
private:
Result<bool> set_region(u64 address, usize count, bool used);
Result<void> create_default_region();
Result<void> create_null_region();
void try_merge_region_with_neighbors(VMRegion* region);
void merge_contiguous_regions(VMRegion* a, VMRegion* b);
Result<VMRegion*> split_region(VMRegion* parent, u64 boundary);
LinkedList<VMRegion> m_regions;
};