|
|
@ -380,11 +380,41 @@ public: |
|
|
/// Changes the permissions of a range of addresses, splitting VMAs as necessary. |
|
|
/// Changes the permissions of a range of addresses, splitting VMAs as necessary. |
|
|
ResultCode ReprotectRange(VAddr target, u64 size, VMAPermission new_perms); |
|
|
ResultCode ReprotectRange(VAddr target, u64 size, VMAPermission new_perms); |
|
|
|
|
|
|
|
|
ResultVal<VAddr> HeapAllocate(VAddr target, u64 size, VMAPermission perms); |
|
|
|
|
|
ResultCode HeapFree(VAddr target, u64 size); |
|
|
|
|
|
|
|
|
|
|
|
ResultCode MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size, MemoryState state); |
|
|
ResultCode MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size, MemoryState state); |
|
|
|
|
|
|
|
|
|
|
|
/// Attempts to allocate a heap with the given size. |
|
|
|
|
|
/// |
|
|
|
|
|
/// @param size The size of the heap to allocate in bytes. |
|
|
|
|
|
/// |
|
|
|
|
|
/// @note If a heap is currently allocated, and this is called |
|
|
|
|
|
/// with a size that is equal to the size of the current heap, |
|
|
|
|
|
/// then this function will do nothing and return the current |
|
|
|
|
|
/// heap's starting address, as there's no need to perform |
|
|
|
|
|
/// any additional heap allocation work. |
|
|
|
|
|
/// |
|
|
|
|
|
/// @note If a heap is currently allocated, and this is called |
|
|
|
|
|
/// with a size less than the current heap's size, then |
|
|
|
|
|
/// this function will attempt to shrink the heap. |
|
|
|
|
|
/// |
|
|
|
|
|
/// @note If a heap is currently allocated, and this is called |
|
|
|
|
|
/// with a size larger than the current heap's size, then |
|
|
|
|
|
/// this function will attempt to extend the size of the heap. |
|
|
|
|
|
/// |
|
|
|
|
|
/// @returns A result indicating either success or failure. |
|
|
|
|
|
/// <p> |
|
|
|
|
|
/// If successful, this function will return a result |
|
|
|
|
|
/// containing the starting address to the allocated heap. |
|
|
|
|
|
/// <p> |
|
|
|
|
|
/// If unsuccessful, this function will return a result |
|
|
|
|
|
/// containing an error code. |
|
|
|
|
|
/// |
|
|
|
|
|
/// @pre The given size must lie within the allowable heap |
|
|
|
|
|
/// memory region managed by this VMManager instance. |
|
|
|
|
|
/// Failure to abide by this will result in ERR_OUT_OF_MEMORY |
|
|
|
|
|
/// being returned as the result. |
|
|
|
|
|
/// |
|
|
|
|
|
ResultVal<VAddr> SetHeapSize(u64 size); |
|
|
|
|
|
|
|
|
/// Queries the memory manager for information about the given address. |
|
|
/// Queries the memory manager for information about the given address. |
|
|
/// |
|
|
/// |
|
|
/// @param address The address to query the memory manager about for information. |
|
|
/// @param address The address to query the memory manager about for information. |
|
|
@ -418,9 +448,6 @@ public: |
|
|
/// Gets the total memory usage, used by svcGetInfo |
|
|
/// Gets the total memory usage, used by svcGetInfo |
|
|
u64 GetTotalMemoryUsage() const; |
|
|
u64 GetTotalMemoryUsage() const; |
|
|
|
|
|
|
|
|
/// Gets the total heap usage, used by svcGetInfo |
|
|
|
|
|
u64 GetTotalHeapUsage() const; |
|
|
|
|
|
|
|
|
|
|
|
/// Gets the address space base address |
|
|
/// Gets the address space base address |
|
|
VAddr GetAddressSpaceBaseAddress() const; |
|
|
VAddr GetAddressSpaceBaseAddress() const; |
|
|
|
|
|
|
|
|
@ -469,6 +496,13 @@ public: |
|
|
/// Gets the total size of the heap region in bytes. |
|
|
/// Gets the total size of the heap region in bytes. |
|
|
u64 GetHeapRegionSize() const; |
|
|
u64 GetHeapRegionSize() const; |
|
|
|
|
|
|
|
|
|
|
|
/// Gets the total size of the current heap in bytes. |
|
|
|
|
|
/// |
|
|
|
|
|
/// @note This is the current allocated heap size, not the size |
|
|
|
|
|
/// of the region it's allowed to exist within. |
|
|
|
|
|
/// |
|
|
|
|
|
u64 GetCurrentHeapSize() const; |
|
|
|
|
|
|
|
|
/// Determines whether or not the specified range is within the heap region. |
|
|
/// Determines whether or not the specified range is within the heap region. |
|
|
bool IsWithinHeapRegion(VAddr address, u64 size) const; |
|
|
bool IsWithinHeapRegion(VAddr address, u64 size) const; |
|
|
|
|
|
|
|
|
@ -617,9 +651,6 @@ private: |
|
|
VAddr new_map_region_base = 0; |
|
|
VAddr new_map_region_base = 0; |
|
|
VAddr new_map_region_end = 0; |
|
|
VAddr new_map_region_end = 0; |
|
|
|
|
|
|
|
|
VAddr main_code_region_base = 0; |
|
|
|
|
|
VAddr main_code_region_end = 0; |
|
|
|
|
|
|
|
|
|
|
|
VAddr tls_io_region_base = 0; |
|
|
VAddr tls_io_region_base = 0; |
|
|
VAddr tls_io_region_end = 0; |
|
|
VAddr tls_io_region_end = 0; |
|
|
|
|
|
|
|
|
@ -628,9 +659,9 @@ private: |
|
|
// This makes deallocation and reallocation of holes fast and keeps process memory contiguous |
|
|
// This makes deallocation and reallocation of holes fast and keeps process memory contiguous |
|
|
// in the emulator address space, allowing Memory::GetPointer to be reasonably safe. |
|
|
// in the emulator address space, allowing Memory::GetPointer to be reasonably safe. |
|
|
std::shared_ptr<std::vector<u8>> heap_memory; |
|
|
std::shared_ptr<std::vector<u8>> heap_memory; |
|
|
// The left/right bounds of the address space covered by heap_memory. |
|
|
|
|
|
VAddr heap_start = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// The end of the currently allocated heap. This is not an inclusive |
|
|
|
|
|
// end of the range. This is essentially 'base_address + current_size'. |
|
|
VAddr heap_end = 0; |
|
|
VAddr heap_end = 0; |
|
|
u64 heap_used = 0; |
|
|
|
|
|
}; |
|
|
}; |
|
|
} // namespace Kernel |
|
|
} // namespace Kernel |