2023-01-13 18:05:20 +00:00
|
|
|
#pragma once
|
2023-06-17 23:48:36 +00:00
|
|
|
#include <luna/LinkedList.h>
|
2023-01-13 18:05:20 +00:00
|
|
|
#include <luna/OwnedPtr.h>
|
|
|
|
#include <luna/Result.h>
|
|
|
|
|
2023-06-17 23:48:36 +00:00
|
|
|
class VMRegion : LinkedListNode<VMRegion>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
u64 start;
|
|
|
|
u64 end;
|
|
|
|
usize count;
|
|
|
|
bool used { true };
|
|
|
|
bool persistent { false };
|
|
|
|
};
|
|
|
|
|
2023-01-13 18:05:20 +00:00
|
|
|
class UserVM
|
|
|
|
{
|
|
|
|
public:
|
2023-06-17 23:48:36 +00:00
|
|
|
UserVM();
|
2023-01-13 18:05:20 +00:00
|
|
|
~UserVM();
|
|
|
|
|
2023-06-17 23:48:36 +00:00
|
|
|
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);
|
|
|
|
}
|
2023-01-13 18:05:20 +00:00
|
|
|
|
2023-06-17 23:48:36 +00:00
|
|
|
Result<bool> free_region(u64 address, usize count)
|
|
|
|
{
|
|
|
|
return set_region(address, count, false);
|
|
|
|
}
|
2023-01-13 18:05:20 +00:00
|
|
|
|
|
|
|
static Result<OwnedPtr<UserVM>> try_create();
|
|
|
|
|
2023-03-18 22:45:48 +00:00
|
|
|
Result<OwnedPtr<UserVM>> clone();
|
|
|
|
|
2023-01-13 18:05:20 +00:00
|
|
|
private:
|
2023-06-17 23:48:36 +00:00
|
|
|
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;
|
2023-01-13 18:05:20 +00:00
|
|
|
};
|