diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2026-02-19 08:14:48 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2026-02-19 08:14:48 +0100 |
| commit | f0acad6f3206079d804b2f59aace0dc32dbeb6dc (patch) | |
| tree | 44116f2771ebf146ec016337ba07d0320575dae3 /src/kernel/HALKit/ARM64/HalPagingMgr.cc | |
| parent | 41117a33aa0dde66b8964b4bc0de0082fcd40667 (diff) | |
kernel: lots of tweaks and improvements, WIP: ASN, FileMgr support for OpenHeFS.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/kernel/HALKit/ARM64/HalPagingMgr.cc')
| -rw-r--r-- | src/kernel/HALKit/ARM64/HalPagingMgr.cc | 81 |
1 files changed, 0 insertions, 81 deletions
diff --git a/src/kernel/HALKit/ARM64/HalPagingMgr.cc b/src/kernel/HALKit/ARM64/HalPagingMgr.cc deleted file mode 100644 index 0fe4d759..00000000 --- a/src/kernel/HALKit/ARM64/HalPagingMgr.cc +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (see LICENSE file) -// Official repository: https://github.com/nekernel-org/nekernel - -#include <HALKit/ARM64/Paging.h> -#include <HALKit/ARM64/Processor.h> - -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<volatile UInt64*>(ttbr0_val); - - UInt64 l1_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 39) & 0x1FF; - UInt64 l2_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 30) & 0x1FF; - UInt64 l3_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 21) & 0x1FF; - - if (!l1_table[l1_idx]) return 0; - - volatile UInt64* l2_table = reinterpret_cast<volatile UInt64*>(l1_table[l1_idx] & ~0xFFFUL); - - if (!l2_table[l2_idx]) return 0; - - volatile UInt64* l3_table = reinterpret_cast<volatile UInt64*>(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, - UInt32 level) { - 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<volatile UInt64*>(ttbr0_val); - - UInt64 l1_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 39) & 0x1FF; - UInt64 l2_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 30) & 0x1FF; - UInt64 l3_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 21) & 0x1FF; - - if (!l1_table[l1_idx]) return kErrorInvalidData; - - volatile UInt64* l2_table = reinterpret_cast<volatile UInt64*>(l1_table[l1_idx] & ~0xFFFUL); - - if (!l2_table[l2_idx]) return kErrorInvalidData; - - volatile UInt64* l3_table = reinterpret_cast<volatile UInt64*>(l2_table[l2_idx] & ~0xFFFUL); - - l3_table[l3_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; - - switch (level) { - case 2: { - l3_table[l3_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; - return kErrorSuccess; - } - case 1: { - l1_table[l1_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; - return kErrorSuccess; - } - case 0: { - l1_table[l1_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; - return kErrorSuccess; - } - } - - return kErrorInvalidData; -} -} // namespace Kernel::HAL |
