From 2a06fd18ce807e4d3459aab5d5b4c3be34ea80aa Mon Sep 17 00:00:00 2001 From: "Chloe M." Date: Mon, 13 Jul 2026 04:17:25 +0000 Subject: [PATCH] ptos: mm: Protect PFDs with lock Signed-off-by: Chloe M. --- service/ptos/mm/pm.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/service/ptos/mm/pm.c b/service/ptos/mm/pm.c index 80eba98..26cd33d 100644 --- a/service/ptos/mm/pm.c +++ b/service/ptos/mm/pm.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -54,14 +55,16 @@ typedef struct _MM_PFD { * descriptors and marks the start and end of a physical * memory freelist. * - * @First: First entry in freelist - * @Last: Last entry in freelist + * @First: First entry in freelist + * @Last: Last entry in freelist + * @Lock: Protects this list * * TODO: Add a lock to this structure */ typedef struct { MM_PFD *First; MM_PFD *Last; + SPINLOCK Lock; } MM_PFD_LIST; /* Standard usable memory list */ @@ -222,7 +225,10 @@ MmRequestFrame(VOID) MM_PFD *Pfd; UPTR PhysicalBase; + KeSpinLockAcquire(&AvlList.Lock, true); Pfd = PmPfdListPop(&AvlList); + KeSpinLockRelease(&AvlList.Lock); + if (Pfd == NULL) { return PFN_ERROR; } @@ -242,14 +248,17 @@ MmReclaimFrame(MM_PFN Pfn) return; } + KeSpinLockAcquire(&AvlList.Lock, true); PhysicalBase = PFN_TO_ADDRESS(Pfn); Pfd = (VOID *)PMA_TO_VMA(PhysicalBase); PmPfdListAppend(&AvlList, Pfd); + KeSpinLockRelease(&AvlList.Lock); } VOID MmPmInit(VOID) { + KeSpinLockInit(&AvlList.Lock, "pmm.avllock"); DTRACE("probing physical memory...\n"); PmProbe(); }