apio
3d157b760c
All checks were successful
continuous-integration/drone/push Build is passing
This way, they can't be modified by mmap() or munmap().
47 lines
1.1 KiB
C++
47 lines
1.1 KiB
C++
#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, bool persistent = false)
|
|
{
|
|
return set_region(address, count, true, persistent);
|
|
}
|
|
|
|
Result<bool> free_region(u64 address, usize count)
|
|
{
|
|
return set_region(address, count, false, false);
|
|
}
|
|
|
|
static Result<OwnedPtr<UserVM>> try_create();
|
|
|
|
Result<OwnedPtr<UserVM>> clone();
|
|
|
|
private:
|
|
Result<bool> set_region(u64 address, usize count, bool used, bool persistent);
|
|
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;
|
|
};
|