1 /* 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 7 */ 8 9 /* INCLUDES *******************************************************************/ 10 11 #include <ntoskrnl.h> 12 #define NDEBUG 13 #include <debug.h> 14 15 #define MODULE_INVOLVED_IN_ARM3 16 #include <mm/ARM3/miarm.h> 17 18 /* FUNCTIONS *****************************************************************/ 19 20 /* 21 * @unimplemented 22 */ 23 NTSTATUS 24 NTAPI 25 MmAddPhysicalMemory (IN PPHYSICAL_ADDRESS StartAddress, 26 IN OUT PLARGE_INTEGER NumberOfBytes) 27 { 28 UNIMPLEMENTED; 29 return STATUS_NOT_IMPLEMENTED; 30 } 31 32 /* 33 * @unimplemented 34 */ 35 NTSTATUS 36 NTAPI 37 MmMarkPhysicalMemoryAsBad(IN PPHYSICAL_ADDRESS StartAddress, 38 IN OUT PLARGE_INTEGER NumberOfBytes) 39 { 40 UNIMPLEMENTED; 41 return STATUS_NOT_IMPLEMENTED; 42 } 43 44 /* 45 * @unimplemented 46 */ 47 NTSTATUS 48 NTAPI 49 MmMarkPhysicalMemoryAsGood(IN PPHYSICAL_ADDRESS StartAddress, 50 IN OUT PLARGE_INTEGER NumberOfBytes) 51 { 52 UNIMPLEMENTED; 53 return STATUS_NOT_IMPLEMENTED; 54 } 55 56 /* 57 * @unimplemented 58 */ 59 NTSTATUS 60 NTAPI 61 MmRemovePhysicalMemory(IN PPHYSICAL_ADDRESS StartAddress, 62 IN OUT PLARGE_INTEGER NumberOfBytes) 63 { 64 UNIMPLEMENTED; 65 return STATUS_NOT_IMPLEMENTED; 66 } 67 68 /* 69 * @implemented 70 */ 71 PPHYSICAL_MEMORY_RANGE 72 NTAPI 73 MmGetPhysicalMemoryRanges(VOID) 74 { 75 ULONG Size, i; 76 PPHYSICAL_MEMORY_RANGE Entry, Buffer; 77 KIRQL OldIrql; 78 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); 79 80 // 81 // Calculate how much memory we'll need 82 // 83 Size = sizeof(PHYSICAL_MEMORY_RANGE) * (MmPhysicalMemoryBlock->NumberOfRuns + 1); 84 85 // 86 // Allocate a copy 87 // 88 Entry = Buffer = ExAllocatePoolWithTag(NonPagedPool, Size, 'hPmM'); 89 if (!Buffer) return NULL; 90 91 // 92 // Lock the PFN database 93 // 94 OldIrql = MiAcquirePfnLock(); 95 96 // 97 // Make sure it hasn't changed before we had acquired the lock 98 // 99 ASSERT(Size == (sizeof(PHYSICAL_MEMORY_RANGE) * 100 (MmPhysicalMemoryBlock->NumberOfRuns + 1))); 101 102 // 103 // Now loop our block 104 // 105 for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++) 106 { 107 // 108 // Copy the data, but format it into bytes 109 // 110 Entry->BaseAddress.QuadPart = MmPhysicalMemoryBlock->Run[i].BasePage << PAGE_SHIFT; 111 Entry->NumberOfBytes.QuadPart = MmPhysicalMemoryBlock->Run[i].PageCount << PAGE_SHIFT; 112 Entry++; 113 } 114 115 // 116 // Last entry is empty 117 // 118 Entry->BaseAddress.QuadPart = 0; 119 Entry->NumberOfBytes.QuadPart = 0; 120 121 // 122 // Release the lock and return 123 // 124 MiReleasePfnLock(OldIrql); 125 return Buffer; 126 } 127