2 * PROJECT: ReactOS Kernel
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: ntoskrnl/mm/ARM3/dynamic.c
5 * PURPOSE: ARM Memory Manager Dynamic Physical Memory Support
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
15 #define MODULE_INVOLVED_IN_ARM3
16 #include "../ARM3/miarm.h"
18 /* FUNCTIONS *****************************************************************/
25 MmAddPhysicalMemory (IN PPHYSICAL_ADDRESS StartAddress
,
26 IN OUT PLARGE_INTEGER NumberOfBytes
)
29 return STATUS_NOT_IMPLEMENTED
;
37 MmMarkPhysicalMemoryAsBad(IN PPHYSICAL_ADDRESS StartAddress
,
38 IN OUT PLARGE_INTEGER NumberOfBytes
)
41 return STATUS_NOT_IMPLEMENTED
;
49 MmMarkPhysicalMemoryAsGood(IN PPHYSICAL_ADDRESS StartAddress
,
50 IN OUT PLARGE_INTEGER NumberOfBytes
)
53 return STATUS_NOT_IMPLEMENTED
;
61 MmRemovePhysicalMemory(IN PPHYSICAL_ADDRESS StartAddress
,
62 IN OUT PLARGE_INTEGER NumberOfBytes
)
65 return STATUS_NOT_IMPLEMENTED
;
71 PPHYSICAL_MEMORY_RANGE
73 MmGetPhysicalMemoryRanges(VOID
)
76 PPHYSICAL_MEMORY_RANGE Entry
, Buffer
;
78 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL
);
81 // Calculate how much memory we'll need
83 Size
= sizeof(PHYSICAL_MEMORY_RANGE
) * (MmPhysicalMemoryBlock
->NumberOfRuns
+ 1);
88 Entry
= Buffer
= ExAllocatePoolWithTag(NonPagedPool
, Size
, 'hPmM');
89 if (!Buffer
) return NULL
;
92 // Lock the PFN database
94 OldIrql
= KeAcquireQueuedSpinLock(LockQueuePfnLock
);
97 // Make sure it hasn't changed before we had acquired the lock
99 ASSERT(Size
== (sizeof(PHYSICAL_MEMORY_RANGE
) *
100 (MmPhysicalMemoryBlock
->NumberOfRuns
+ 1)));
103 // Now loop our block
105 for (i
= 0; i
< MmPhysicalMemoryBlock
->NumberOfRuns
; i
++)
108 // Copy the data, but format it into bytes
110 Entry
->BaseAddress
.QuadPart
= MmPhysicalMemoryBlock
->Run
[i
].BasePage
<< PAGE_SHIFT
;
111 Entry
->NumberOfBytes
.QuadPart
= MmPhysicalMemoryBlock
->Run
[i
].PageCount
<< PAGE_SHIFT
;
116 // Last entry is empty
118 Entry
->BaseAddress
.QuadPart
= 0;
119 Entry
->NumberOfBytes
.QuadPart
= 0;
122 // Release the lock and return
124 KeReleaseQueuedSpinLock(LockQueuePfnLock
, OldIrql
);