diff options
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); |
