diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-06-18 17:56:12 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-06-18 17:56:12 +0200 |
| commit | c50ae11abc23c0ea5d79fd7044273685c73990d1 (patch) | |
| tree | e324ffed2ffda2c22c4555b9e28a28ecebdc6b23 /dev/kernel/HALKit/ARM64 | |
| parent | a5cae885d3f714897ae175cc8643fbbd5573dc22 (diff) | |
feat: level based virtual memory mapping for NeKernel's paging system.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/HALKit/ARM64')
| -rw-r--r-- | dev/kernel/HALKit/ARM64/HalPagingMgr.cc | 20 | ||||
| -rw-r--r-- | dev/kernel/HALKit/ARM64/Processor.h | 3 |
2 files changed, 20 insertions, 3 deletions
diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc index 953cee3b..b7b0c10e 100644 --- a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc +++ b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc @@ -43,7 +43,8 @@ EXTERN_C UIntPtr mm_get_page_addr(VoidPtr 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) { +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; @@ -65,6 +66,21 @@ EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UI l3_table[l3_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; - return kErrorSuccess; + 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 diff --git a/dev/kernel/HALKit/ARM64/Processor.h b/dev/kernel/HALKit/ARM64/Processor.h index 068b798d..68fe736c 100644 --- a/dev/kernel/HALKit/ARM64/Processor.h +++ b/dev/kernel/HALKit/ARM64/Processor.h @@ -36,7 +36,8 @@ enum { /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manip. -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags); +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level = 2); EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address); |
