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) {