ptos: mm: Add high-level page mapping interface
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright (c) 2026, Chloe M.
|
||||
* Provided under the BSD-3 clause.
|
||||
*
|
||||
* Description: Virtual memory management
|
||||
* Author: Chloe M.
|
||||
*/
|
||||
|
||||
#include <mm/vm.h>
|
||||
#include <hal/page.h>
|
||||
#include <ptdef.h>
|
||||
|
||||
/* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user