2022-11-13 14:29:15 +01:00
|
|
|
#pragma once
|
2022-12-04 12:42:43 +01:00
|
|
|
#include <luna/Result.h>
|
2022-11-13 14:29:15 +01:00
|
|
|
|
2022-12-05 16:36:41 +01:00
|
|
|
#ifdef ARCH_X86_64
|
|
|
|
#include "arch/x86_64/MMU.h"
|
|
|
|
#else
|
|
|
|
#error "Unknown architecture."
|
|
|
|
#endif
|
2022-11-16 20:37:32 +01:00
|
|
|
|
2023-02-27 12:41:28 +01:00
|
|
|
constexpr u64 PAGES_PER_HUGE_PAGE = ARCH_HUGE_PAGE_SIZE / ARCH_PAGE_SIZE;
|
|
|
|
|
2022-11-13 14:29:15 +01:00
|
|
|
namespace MMU
|
|
|
|
{
|
|
|
|
enum Flags
|
|
|
|
{
|
|
|
|
None = 0,
|
|
|
|
ReadWrite = 1,
|
|
|
|
User = 2,
|
|
|
|
NoExecute = 4,
|
|
|
|
WriteThrough = 8,
|
|
|
|
CacheDisable = 16,
|
|
|
|
};
|
|
|
|
|
2023-02-27 12:41:28 +01:00
|
|
|
enum class UseHugePages
|
|
|
|
{
|
|
|
|
No = 0,
|
|
|
|
Yes = 1
|
|
|
|
};
|
|
|
|
|
2023-02-27 12:51:29 +01:00
|
|
|
u64 translate_physical_address(u64 phys);
|
|
|
|
|
2023-02-27 12:41:28 +01:00
|
|
|
Result<void> map(u64 virt, u64 phys, int flags, UseHugePages use_huge_pages);
|
2022-11-13 14:29:15 +01:00
|
|
|
Result<u64> unmap(u64 virt);
|
|
|
|
Result<u64> get_physical(u64 virt);
|
2022-11-13 15:33:53 +01:00
|
|
|
Result<int> get_flags(u64 virt);
|
|
|
|
Result<void> remap(u64 virt, int flags);
|
2022-11-13 14:29:15 +01:00
|
|
|
|
|
|
|
void switch_page_directory(PageDirectory* dir);
|
|
|
|
PageDirectory* get_page_directory();
|
|
|
|
|
|
|
|
void flush_all();
|
|
|
|
|
2022-11-13 16:51:21 +01:00
|
|
|
Result<PageDirectory*> create_page_directory_for_userspace();
|
2023-01-05 21:50:26 +01:00
|
|
|
Result<void> delete_userspace_page_directory(PageDirectory* directory);
|
2023-03-18 23:45:48 +01:00
|
|
|
Result<PageDirectory*> clone_userspace_page_directory(PageDirectory* directory);
|
2022-11-13 14:29:15 +01:00
|
|
|
void setup_initial_page_directory();
|
2022-12-26 12:57:25 +01:00
|
|
|
|
|
|
|
PageDirectory* kernel_page_directory();
|
2023-01-02 13:07:29 +01:00
|
|
|
}
|