From a5cae885d3f714897ae175cc8643fbbd5573dc22 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 18 Jun 2025 17:53:06 +0200 Subject: feat: Implemented `HalPagingMgr` for AArch64. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/ARM64/HalPagingMgr.cc | 46 +++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) (limited to 'dev/kernel') diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc index faad6778..953cee3b 100644 --- a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc +++ b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc @@ -13,15 +13,57 @@ namespace Kernel::HAL { typedef UInt32 PageTableIndex; +EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address) { + if (!virtual_address) return 0; + + UInt64 ttbr0_val = 0; + + asm volatile("mrs %0, ttbr0_el1" : "=r"(ttbr0_val)); + volatile UInt64* l1_table = reinterpret_cast(ttbr0_val); + + UInt64 l1_idx = (reinterpret_cast(virtual_address) >> 39) & 0x1FF; + UInt64 l2_idx = (reinterpret_cast(virtual_address) >> 30) & 0x1FF; + UInt64 l3_idx = (reinterpret_cast(virtual_address) >> 21) & 0x1FF; + + if (!l1_table[l1_idx]) return 0; + + volatile UInt64* l2_table = reinterpret_cast(l1_table[l1_idx] & ~0xFFFUL); + + if (!l2_table[l2_idx]) return 0; + + volatile UInt64* l3_table = reinterpret_cast(l2_table[l2_idx] & ~0xFFFUL); + + if (!l3_table[l3_idx]) return 0; + + return (l3_table[l3_idx] & ~0xFFFUL); +} + /// @brief Maps or allocates a page from virtual_address. /// @param virtual_address a valid virtual address. /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manipulation process. EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) { - if (!virtual_address || !flags) return kErrorInvalidData; + if (!virtual_address || !flags || !physical_address) return kErrorInvalidData; + + UInt64 ttbr0_val = 0; + + asm volatile("mrs %0, ttbr0_el1" : "=r"(ttbr0_val)); + volatile UInt64* l1_table = reinterpret_cast(ttbr0_val); + + UInt64 l1_idx = (reinterpret_cast(virtual_address) >> 39) & 0x1FF; + UInt64 l2_idx = (reinterpret_cast(virtual_address) >> 30) & 0x1FF; + UInt64 l3_idx = (reinterpret_cast(virtual_address) >> 21) & 0x1FF; + + if (!l1_table[l1_idx]) return kErrorInvalidData; + + volatile UInt64* l2_table = reinterpret_cast(l1_table[l1_idx] & ~0xFFFUL); + + if (!l2_table[l2_idx]) return kErrorInvalidData; + + volatile UInt64* l3_table = reinterpret_cast(l2_table[l2_idx] & ~0xFFFUL); - NE_UNUSED(physical_address); + l3_table[l3_idx] = (reinterpret_cast(physical_address) & ~0xFFFUL) | flags; return kErrorSuccess; } -- cgit v1.2.3