2022-11-13 14:29:15 +01:00
|
|
|
#pragma once
|
2023-05-07 21:37:01 +02:00
|
|
|
#include "arch/MMU.h"
|
2022-12-04 12:42:43 +01:00
|
|
|
#include <luna/Result.h>
|
2023-03-29 17:28:22 +02:00
|
|
|
#include <luna/String.h>
|
2022-12-04 12:42:43 +01:00
|
|
|
#include <luna/Types.h>
|
2022-11-13 14:29:15 +01:00
|
|
|
|
|
|
|
namespace MemoryManager
|
|
|
|
{
|
2023-05-07 21:38:38 +02:00
|
|
|
constexpr int DEFAULT_ACCESS = 0;
|
|
|
|
|
2022-11-13 14:29:15 +01:00
|
|
|
void init();
|
|
|
|
|
2022-11-16 20:02:04 +01:00
|
|
|
Result<void> protect_kernel_sections();
|
|
|
|
|
2022-11-19 22:27:08 +01:00
|
|
|
Result<u64> alloc_frame();
|
|
|
|
Result<void> free_frame(u64 frame);
|
2023-03-16 23:02:53 +01:00
|
|
|
Result<void> free_frames(u64 address, usize count);
|
2022-11-13 14:29:15 +01:00
|
|
|
|
2022-11-19 22:27:08 +01:00
|
|
|
void lock_frame(u64 frame);
|
2022-12-07 10:55:47 +01:00
|
|
|
void lock_frames(u64 frames, usize count);
|
2022-11-13 16:56:03 +01:00
|
|
|
|
2022-11-16 20:30:34 +01:00
|
|
|
Result<void> remap(u64 address, usize count, int flags);
|
|
|
|
Result<void> remap_unaligned(u64 address, usize count, int flags);
|
2022-11-16 20:02:04 +01:00
|
|
|
|
2023-05-07 21:37:01 +02:00
|
|
|
bool validate_page_access(u64 address, int flags);
|
|
|
|
bool validate_page_default_access(u64 address);
|
2022-11-19 18:38:47 +01:00
|
|
|
|
2023-03-29 17:28:22 +02:00
|
|
|
Result<String> strdup_from_user(u64 address);
|
2023-01-05 22:39:09 +01:00
|
|
|
|
2023-05-07 21:37:01 +02:00
|
|
|
bool validate_access(const void* mem, usize size, int flags);
|
|
|
|
|
2023-05-07 21:42:03 +02:00
|
|
|
inline bool validate_user_write(void* user, usize size)
|
2023-05-07 21:37:01 +02:00
|
|
|
{
|
|
|
|
return validate_access(user, size, MMU::ReadWrite | MMU::User);
|
|
|
|
}
|
|
|
|
|
2023-05-07 21:42:03 +02:00
|
|
|
inline bool validate_user_read(const void* user, usize size)
|
2023-05-07 21:37:01 +02:00
|
|
|
{
|
|
|
|
return validate_access(user, size, MMU::User);
|
|
|
|
}
|
2023-01-07 01:39:33 +01:00
|
|
|
|
|
|
|
template <typename T> bool validate_user_write_typed(T* user)
|
|
|
|
{
|
|
|
|
return validate_user_write(user, sizeof(T));
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T> bool validate_user_read_typed(const T* user)
|
|
|
|
{
|
|
|
|
return validate_user_read(user, sizeof(T));
|
|
|
|
}
|
|
|
|
|
2023-01-07 00:17:16 +01:00
|
|
|
bool copy_to_user(void* user, const void* kernel, usize size);
|
|
|
|
|
|
|
|
template <typename T> bool copy_to_user_typed(T* user, const T* kernel)
|
|
|
|
{
|
|
|
|
return copy_to_user(user, kernel, sizeof(T));
|
|
|
|
}
|
|
|
|
|
2023-01-11 19:25:28 +01:00
|
|
|
bool copy_from_user(const void* user, void* kernel, usize size);
|
|
|
|
|
|
|
|
template <typename T> bool copy_from_user_typed(const T* user, T* kernel)
|
|
|
|
{
|
|
|
|
return copy_from_user(user, kernel, sizeof(T));
|
|
|
|
}
|
|
|
|
|
2022-11-19 22:32:48 +01:00
|
|
|
Result<void> map_frames_at(u64 virt, u64 phys, usize count, int flags);
|
2023-02-27 12:47:17 +01:00
|
|
|
Result<void> map_huge_frames_at(u64 virt, u64 phys, usize count, int flags);
|
2022-11-19 22:28:45 +01:00
|
|
|
|
|
|
|
Result<u64> alloc_at(u64 virt, usize count, int flags);
|
2023-04-17 20:11:07 +02:00
|
|
|
Result<u64> alloc_at_zeroed(u64, usize count, int flags);
|
2022-12-16 19:36:38 +01:00
|
|
|
Result<u64> alloc_for_kernel(usize count, int flags);
|
2022-11-19 22:28:45 +01:00
|
|
|
|
2022-12-23 11:30:49 +01:00
|
|
|
Result<u64> get_kernel_mapping_for_frames(u64 phys, usize count, int flags);
|
|
|
|
|
2022-11-19 22:28:45 +01:00
|
|
|
Result<void> unmap_owned(u64 virt, usize count);
|
2022-12-16 19:36:38 +01:00
|
|
|
Result<void> unmap_owned_and_free_vm(u64 virt, usize count);
|
2022-11-19 22:28:45 +01:00
|
|
|
Result<void> unmap_weak(u64 virt, usize count);
|
2023-01-05 21:50:06 +01:00
|
|
|
Result<void> unmap_weak_and_free_vm(u64 virt, usize count);
|
2022-11-19 22:28:45 +01:00
|
|
|
|
2023-02-27 12:47:17 +01:00
|
|
|
Result<void> unmap_weak_huge(u64 virt, usize count);
|
|
|
|
|
2022-12-07 10:55:47 +01:00
|
|
|
usize free();
|
|
|
|
usize used();
|
|
|
|
usize reserved();
|
|
|
|
usize total();
|
2023-01-02 13:07:29 +01:00
|
|
|
}
|