ptos: mm: Add high-level page mapping interface
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -10,6 +10,10 @@
|
|||||||
#define _MM_VM_H_ 1
|
#define _MM_VM_H_ 1
|
||||||
|
|
||||||
#include <ke/bpal.h>
|
#include <ke/bpal.h>
|
||||||
|
#include <hal/vas.h>
|
||||||
|
#include <hal/mmu.h>
|
||||||
|
#include <ptapi/ptmm.h>
|
||||||
|
#include <ptdef.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Virtual memory allocation region. This is outside the
|
* Virtual memory allocation region. This is outside the
|
||||||
@@ -28,4 +32,39 @@
|
|||||||
#define VMA_TO_PMA(VMA) \
|
#define VMA_TO_PMA(VMA) \
|
||||||
(UPTR)PTR_NOFFSET(VMA, KeBpalLoadBase())
|
(UPTR)PTR_NOFFSET(VMA, KeBpalLoadBase())
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Represents a virtual memory range
|
||||||
|
*
|
||||||
|
* @VirtualBase: Virtual address base
|
||||||
|
* @PhysicalBase: Physical address base
|
||||||
|
* @Length: Length of memory range
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
UPTR VirtualBase;
|
||||||
|
UPTR PhysicalBase;
|
||||||
|
USIZE Length;
|
||||||
|
} MM_RANGE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unmap a virtual memory range
|
||||||
|
*
|
||||||
|
* @Vas: Virtual address space to unmap
|
||||||
|
* @Range: Range to unmap
|
||||||
|
* @PageSize: Page size to unmap
|
||||||
|
*/
|
||||||
|
PT_STATUS MmUnmapRange(MMU_VAS *Vas, const MM_RANGE *Range, MMU_PAGESIZE PageSize);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Map a virtual memory range
|
||||||
|
*
|
||||||
|
* @Vas: Virtual address space to map within
|
||||||
|
* @Range: Range to map
|
||||||
|
* @Prot: Protection flags to map with
|
||||||
|
* @PageSize: Page size to map
|
||||||
|
*/
|
||||||
|
PT_STATUS MmMapRange(
|
||||||
|
MMU_VAS *Vas, const MM_RANGE *Range,
|
||||||
|
MM_PROT Prot, MMU_PAGESIZE PageSize
|
||||||
|
);
|
||||||
|
|
||||||
#endif /* !_MM_VM_H_ */
|
#endif /* !_MM_VM_H_ */
|
||||||
|
|||||||
@@ -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