From df1719fbd0d083d7815377df309e0435e7c1f5ab Mon Sep 17 00:00:00 2001 From: "Chloe M." Date: Mon, 22 Jun 2026 06:50:36 +0000 Subject: [PATCH] stos: pmm: Add physical frame allocation Signed-off-by: Chloe M. --- paw/stos/head/mm/pmm.h | 11 +++++++++++ paw/stos/mm/pmm.c | 17 +++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/paw/stos/head/mm/pmm.h b/paw/stos/head/mm/pmm.h index a6c2d0e..b7764bf 100644 --- a/paw/stos/head/mm/pmm.h +++ b/paw/stos/head/mm/pmm.h @@ -11,9 +11,20 @@ #include +/* Page frame number */ +typedef UQUAD MM_PFN; + /* * Initialize the physical memory management */ VOID MmInitPmm(VOID); +/* + * Request a single frame of memory + * + * Returns the page frame number on success, otherwise + * zero on failure e.g., out of memory + */ +MM_PFN MmRequestFrame(VOID); + #endif /* !_MM_PMM_H_ */ diff --git a/paw/stos/mm/pmm.c b/paw/stos/mm/pmm.c index 52297e2..63e9d5b 100644 --- a/paw/stos/mm/pmm.c +++ b/paw/stos/mm/pmm.c @@ -13,6 +13,7 @@ #include #include #include +#include #define LOAD_DELAY 128 @@ -159,6 +160,22 @@ MmLoadUpdate(VOID) LoadIdx %= LoadMax; } +MM_PFN +MmRequestFrame(VOID) +{ + MM_PFD *Pfd; + UPTR Pma; + + Pfd = MmPfdPop(&PfdList); + if (Pfd == NULL) { + return 0; + } + + RtlMemSet(Pfd, 0, PAGESIZE); + Pma = VMA_TO_PMA(Pfd); + return Pma >> LOG2_PAGESIZE; +} + static VOID MmProbeMemory(VOID) {