/* * Copyright (c) 2026, Chloe M. * Provided under the BSD-3 clause. * * Description: Virtual memory management * Author: Chloe M. */ #include #include #include /* Use to safely convert page size */ #define PAGE_SIZE(PS) \ ((PS) >= NELEM(PageSizeTable)) \ ? PageSizeTable[PAGESIZE_4K] \ : PageSizeTable[(PS)] /* Page size table */ static USIZE PageSizeTable[] = { [PAGESIZE_4K] = 0x1000 }; PT_STATUS MmUnmapRange(MMU_VAS *Vas, const MM_RANGE *Range, MMU_PAGESIZE PageSize) { PT_STATUS Status; UPTR Off = 0; UPTR VirtualBase; USIZE Gran; if (Vas == NULL || Range == NULL) { return STATUS_INVALID_PARAM; } /* Align down the base addresses */ VirtualBase = ALIGN_DOWN(Range->VirtualBase, PAGESIZE); Gran = PAGE_SIZE(PageSize); for (Off = 0; Off < Range->Length; Off += Gran) { Status = HalMmuUnmapPage( Vas, VirtualBase + Off, PageSize ); if (PT_ERROR(Status)) { return Status; } } return STATUS_SUCCESS; } PT_STATUS MmMapRange(MMU_VAS *Vas, const MM_RANGE *Range, MM_PROT Prot, MMU_PAGESIZE PageSize) { PT_STATUS Status; UPTR Off = 0; UPTR VirtualBase; UPTR PhysicalBase; USIZE Gran; if (Vas == NULL || Range == NULL) { return STATUS_INVALID_PARAM; } /* Align down the base addresses */ VirtualBase = ALIGN_DOWN(Range->VirtualBase, PAGESIZE); PhysicalBase = ALIGN_DOWN(Range->PhysicalBase, PAGESIZE); Gran = PAGE_SIZE(PageSize); for (Off = 0; Off < Range->Length; Off += Gran) { Status = HalMmuMapPage( Vas, VirtualBase + Off, PhysicalBase + Off, Prot, PageSize ); if (PT_ERROR(Status)) { MmUnmapRange(Vas, Range, PageSize); return Status; } } return STATUS_SUCCESS; }