diff options
Diffstat (limited to 'HALKit/AMD64/HalPageAlloc.cpp')
| -rw-r--r-- | HALKit/AMD64/HalPageAlloc.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/HALKit/AMD64/HalPageAlloc.cpp b/HALKit/AMD64/HalPageAlloc.cpp new file mode 100644 index 00000000..3c57dc04 --- /dev/null +++ b/HALKit/AMD64/HalPageAlloc.cpp @@ -0,0 +1,61 @@ +/* + * ======================================================== + * + * hCore + * Copyright Mahrouss Logic, all rights reserved. + * + * ======================================================== + */ + +#include <HALKit/AMD64/HalPageAlloc.hpp> +#include <NewKit/Defines.hpp> +#include <NewKit/Panic.hpp> + +// this files handles paging. + +static hCore::UIntPtr kPagePtr = 0x0900000; +static hCore::SizeT kPageCnt = 0UL; + +namespace hCore +{ + namespace HAL + { + static auto hal_try_alloc_new_page(SizeT sz, Boolean rw, Boolean user) -> PageTable64* + { + char *ptr = &(reinterpret_cast<char*>(kPagePtr))[kPageCnt + 1]; + + PageTable64 *pte = reinterpret_cast<PageTable64*>(ptr); + pte->Rw = rw; + pte->User = user; + pte->Present = true; + + return pte; + } + + auto hal_alloc_page(SizeT sz, Boolean rw, Boolean user) -> PageTable64* + { + for (SizeT i = 0; i < kPageCnt; ++i) + { + PageTable64 *pte = (reinterpret_cast<PageTable64*>(&kPagePtr) + i); + + if (!pte->Present) { + pte->User = user; + pte->Rw = rw; + pte->Present = true; + + return pte; + } + } + + return hal_try_alloc_new_page(sz, rw, user); + } + + auto hal_create_page(Boolean rw, Boolean user) -> UIntPtr + { + PageTable64 *new_pte = hal_alloc_page(sizeof(PageTable64), rw, user); + MUST_PASS(new_pte); + + return reinterpret_cast<UIntPtr>(new_pte); + } + } // namespace HAL +} // namespace hCore |
