ReactOS  0.4.13-dev-100-gc8611ae
mm.c File Reference
#include "bl.h"
#include "bcd.h"
Include dependency graph for mm.c:

Go to the source code of this file.

Functions

NTSTATUS TrpGenerateMappingTracker (_In_ PVOID VirtualAddress, _In_ ULONG Flags, _In_ LARGE_INTEGER PhysicalAddress, _In_ ULONGLONG Size)
 
NTSTATUS MmTrInitialize (VOID)
 
NTSTATUS BlMmRemoveBadMemory (VOID)
 
NTSTATUS BlMmMapPhysicalAddressEx (_In_ PVOID *VirtualAddress, _In_ ULONG Flags, _In_ ULONGLONG Size, _In_ PHYSICAL_ADDRESS PhysicalAddress)
 
NTSTATUS MmUnmapVirtualAddress (_Inout_ PVOID *VirtualAddress, _Inout_ PULONGLONG Size)
 
NTSTATUS BlMmUnmapVirtualAddressEx (_In_ PVOID VirtualAddress, _In_ ULONGLONG Size)
 
BOOLEAN BlMmTranslateVirtualAddress (_In_ PVOID VirtualAddress, _Out_ PPHYSICAL_ADDRESS PhysicalAddress)
 
NTSTATUS BlpMmInitialize (_In_ PBL_MEMORY_DATA MemoryData, _In_ BL_TRANSLATION_TYPE TranslationType, _In_ PBL_LIBRARY_PARAMETERS LibraryParameters)
 

Variables

BL_TRANSLATION_TYPE MmTranslationType = BlMax
 
BL_TRANSLATION_TYPE MmOriginalTranslationType
 
ULONG MmDescriptorCallTreeCount
 

Function Documentation

◆ BlMmMapPhysicalAddressEx()

NTSTATUS BlMmMapPhysicalAddressEx ( _In_ PVOID VirtualAddress,
_In_ ULONG  Flags,
_In_ ULONGLONG  Size,
_In_ PHYSICAL_ADDRESS  PhysicalAddress 
)

Definition at line 192 of file mm.c.

198 {
200  PVOID MappingAddress;
201  PHYSICAL_ADDRESS MappedAddress;
203  ULONGLONG MapSize;
204  UCHAR CacheAttributes;
205  ULONGLONG BasePage, EndPage, MappedPage, FoundBasePage;
206  ULONGLONG PageOffset, FoundPageCount;
209  ULONG AddPages;
210 
211  /* Increase call depth */
213 
214  /* Check if any parameters are missing */
215  if (!(VirtualAddress) || !(Size))
216  {
218  goto Quickie;
219  }
220 
221  /* Check for fixed allocation without an actual address */
222  if ((Flags & BlMemoryFixed) &&
223  (PhysicalAddress.QuadPart == -1) &&
224  !(*VirtualAddress))
225  {
227  goto Quickie;
228  }
229 
230  /* Check for invalid requirement flag, if one is present */
234  {
236  goto Quickie;
237  }
238 
239  /* Check for invalid cache attribute flags */
240  if (((Flags & BlMemoryValidCacheAttributeMask) - 1) &
242  {
244  goto Quickie;
245  }
246 
247  /* Select an address to map this at */
248  Status = MmSelectMappingAddress(&MappingAddress,
250  Size,
252  Flags,
254  if (!NT_SUCCESS(Status))
255  {
256  goto Quickie;
257  }
258 
259  /* Map the selected address, using the appropriate caching attributes */
260  MappedAddress = PhysicalAddress;
261  MapSize = Size;
262  CacheAttributes = ((Flags & BlMemoryValidCacheAttributeMask) != 0x20) ?
264  Status = MmMapPhysicalAddress(&MappedAddress,
265  &MappingAddress,
266  &MapSize,
267  CacheAttributes);
268  if (!NT_SUCCESS(Status))
269  {
270  goto Quickie;
271  }
272 
273  /* Compute the final address where the mapping was made */
274  MappedBase = (PVOID)(ULONG_PTR)((ULONG_PTR)MappingAddress +
276  MappedAddress.QuadPart);
277  MappedAddress.QuadPart = (ULONG_PTR)MappedBase;
278 
279  /* Check if we're in physical or virtual mode */
280  if (MmTranslationType == BlNone)
281  {
282  /* We are in physical mode -- just return this address directly */
285  goto Quickie;
286  }
287 
288  /* Remove the mapping address from the list of free virtual memory */
291  (ULONG_PTR)MappingAddress >> PAGE_SHIFT,
292  MapSize >> PAGE_SHIFT,
293  NULL);
294  if (NT_SUCCESS(Status))
295  {
296  /* And then add an entry for the fact we mapped it */
298  CacheAttributes,
300  MapSize);
301  }
302 
303  /* Abandon if we didn't update the memory map successfully */
304  if (!NT_SUCCESS(Status))
305  {
306  /* Unmap the virtual address so it can be used later */
307  MmUnmapVirtualAddress(MappingAddress, &MapSize);
308  goto Quickie;
309  }
310 
311  /* Check if no real mapping into RAM was made */
312  if (PhysicalAddress.QuadPart == -1)
313  {
314  /* Then we're done here */
317  goto Quickie;
318  }
319 
320 
321  /* Loop over the entire allocation */
322  BasePage = MappedAddress.QuadPart >> PAGE_SHIFT;
323  EndPage = (MappedAddress.QuadPart + MapSize) >> PAGE_SHIFT;
324  MappedPage = (ULONG_PTR)MappingAddress >> PAGE_SHIFT;
325  do
326  {
327  /* Start with the unmapped allocated list */
331  BasePage);
332  if (!Descriptor)
333  {
334  /* Try persistent next */
338  BasePage);
339  }
340  if (!Descriptor)
341  {
342  /* Try unmapped, unallocated, next */
346  BasePage);
347  }
348  if (!Descriptor)
349  {
350  /* Try reserved next */
354  BasePage);
355  }
356 
357  /* Check if we have a descriptor */
358  if (Descriptor)
359  {
360  /* Remove it from its list */
362 
363  /* Check if it starts before our allocation */
364  FoundBasePage = Descriptor->BasePage;
365  if (FoundBasePage < BasePage)
366  {
367  /* Create a new descriptor to cover the gap before our allocation */
368  PageOffset = BasePage - FoundBasePage;
370  Descriptor->Type,
371  FoundBasePage,
372  0,
373  PageOffset);
374 
375  /* Insert it */
377 
378  /* Adjust ours to ignore that piece */
379  Descriptor->PageCount -= PageOffset;
380  Descriptor->BasePage = BasePage;
381  }
382 
383  /* Check if it goes beyond our allocation */
384  FoundPageCount = Descriptor->PageCount;
385  if (EndPage < (FoundPageCount + Descriptor->BasePage))
386  {
387  /* Create a new descriptor to cover the range after our allocation */
388  PageOffset = EndPage - BasePage;
390  Descriptor->Type,
391  EndPage,
392  0,
393  FoundPageCount -
394  PageOffset);
395 
396  /* Insert it */
398 
399  /* Adjust ours to ignore that piece */
400  Descriptor->PageCount = PageOffset;
401  }
402 
403  /* Update the descriptor to be mapepd at this virtual page */
404  Descriptor->VirtualPage = MappedPage;
405 
406  /* Check if this was one of the regular lists */
407  if ((List != &MmMdlReservedAllocated) &&
409  {
410  /* Was it allocated, or unallocated? */
412  {
413  /* In which case use the unallocated mapped list */
415  }
416  else
417  {
418  /* Insert it into the mapped list */
420  }
421  }
422 
423  /* Add the descriptor that was removed, into the right list */
425 
426  /* Add the pages this descriptor had */
427  AddPages = Descriptor->PageCount;
428  }
429  else
430  {
431  /* Nope, so just add one page */
432  AddPages = 1;
433  }
434 
435  /* Increment the number of pages the descriptor had */
436  MappedPage += AddPages;
437  BasePage += AddPages;
438  }
439  while (BasePage < EndPage);
440 
441  /* We're done -- returned the address */
444 
445 Quickie:
446  /* Cleanup descriptors and reduce depth */
449  return Status;
450 }
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
#define BL_MM_INCLUDE_PERSISTENT_MEMORY
Definition: bl.h:105
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedAllocated
Definition: pagealloc.c:35
NTSTATUS TrpGenerateMappingTracker(_In_ PVOID VirtualAddress, _In_ ULONG Flags, _In_ LARGE_INTEGER PhysicalAddress, _In_ ULONGLONG Size)
Definition: mm.c:24
LONG NTSTATUS
Definition: precomp.h:26
BL_TRANSLATION_TYPE MmTranslationType
Definition: mm.c:17
NTSTATUS MmMdAddDescriptorToList(_In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor, _In_ ULONG Flags)
Definition: descriptor.c:582
NTSTATUS MmSelectMappingAddress(_Out_ PVOID *MappingAddress, _In_ PVOID PreferredAddress, _In_ ULONGLONG Size, _In_ ULONG AllocationAttributes, _In_ ULONG Flags, _In_ PHYSICAL_ADDRESS PhysicalAddress)
Definition: pagealloc.c:1625
#define BL_MM_REMOVE_PHYSICAL_REGION_FLAG
Definition: bl.h:125
#define BL_MM_REMOVE_VIRTUAL_REGION_FLAG
Definition: bl.h:126
BL_MEMORY_DESCRIPTOR_LIST MmMdlReservedAllocated
Definition: pagealloc.c:40
_In_opt_ PSECURITY_DESCRIPTOR _Out_ PSECURITY_DESCRIPTOR * NewDescriptor
Definition: sefuncs.h:29
#define BL_MM_INCLUDE_RESERVED_ALLOCATED
Definition: bl.h:101
int WINAPI EndPage(_In_ HDC)
NTSTATUS MmMdRemoveRegionFromMdlEx(__in PBL_MEMORY_DESCRIPTOR_LIST MdList, __in ULONG Flags, __in ULONGLONG BasePage, __in ULONGLONG PageCount, __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList)
uint32_t ULONG_PTR
Definition: typedefs.h:63
ULONG MmDescriptorCallTreeCount
Definition: mm.c:19
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
VOID MmMdRemoveDescriptorFromList(_In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, _In_ PBL_MEMORY_DESCRIPTOR Entry)
Definition: descriptor.c:338
smooth NULL
Definition: ftsmooth.c:416
void * PVOID
Definition: retypes.h:9
PBL_MEMORY_DESCRIPTOR MmMdInitByteGranularDescriptor(_In_ ULONG Flags, _In_ BL_MEMORY_TYPE Type, _In_ ULONGLONG BasePage, _In_ ULONGLONG VirtualPage, _In_ ULONGLONG PageCount)
Definition: descriptor.c:377
LIST_ENTRY List
Definition: psmgr.c:57
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Definition: bl.h:231
uint64_t ULONGLONG
Definition: typedefs.h:65
VOID MmMdFreeGlobalDescriptors(VOID)
Definition: descriptor.c:1332
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1060
unsigned char UCHAR
Definition: xmlstorage.h:181
#define BL_MM_INCLUDE_UNMAPPED_ALLOCATED
Definition: bl.h:99
#define BL_MM_INCLUDE_UNMAPPED_UNALLOCATED
Definition: bl.h:100
NTSTATUS MmUnmapVirtualAddress(_Inout_ PVOID *VirtualAddress, _Inout_ PULONGLONG Size)
Definition: mm.c:453
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3773
BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedUnallocated
Definition: pagealloc.c:39
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
Status
Definition: gdiplustypes.h:24
PBL_MEMORY_DESCRIPTOR MmMdFindDescriptor(_In_ ULONG WhichList, _In_ ULONG Flags, _In_ ULONGLONG Page)
Definition: descriptor.c:1049
BL_MEMORY_DESCRIPTOR_LIST MmMdlPersistentMemory
Definition: pagealloc.c:43
_Must_inspect_result_ _Outptr_result_bytebuffer_ ViewSize PVOID * MappedBase
Definition: mmfuncs.h:493
BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedAllocated
Definition: pagealloc.c:38
unsigned int ULONG
Definition: retypes.h:1
NTSTATUS MmMapPhysicalAddress(_Inout_ PPHYSICAL_ADDRESS PhysicalAddressPtr, _Inout_ PVOID *VirtualAddressPtr, _Inout_ PULONGLONG SizePtr, _In_ ULONG CacheAttributes)
Definition: mm.c:32
#define ULONG_PTR
Definition: config.h:101
BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedUnallocated
Definition: pagealloc.c:36
return STATUS_SUCCESS
Definition: btrfs.c:2725
BL_MEMORY_DESCRIPTOR_LIST MmMdlFreeVirtual
Definition: pagealloc.c:45
LONGLONG QuadPart
Definition: typedefs.h:112
_In_ PSTORAGE_PROPERTY_ID _Outptr_ PSTORAGE_DESCRIPTOR_HEADER * Descriptor
Definition: classpnp.h:966

Referenced by BlDisplayGetOemBitmap(), BlImgAllocateImageBuffer(), BlUtlGetAcpiTable(), ConsoleEfiGopEnable(), EfipGetRsdt(), EfiVmOpenProtocol(), and MmPapPageAllocatorExtend().

◆ BlMmRemoveBadMemory()

NTSTATUS BlMmRemoveBadMemory ( VOID  )

Definition at line 155 of file mm.c.

158 {
159  BOOLEAN AllowBad;
161  PULONGLONG BadPages;
162  ULONGLONG BadPageCount;
163 
164  /* First check if bad memory access is allowed */
165  AllowBad = FALSE;
168  &AllowBad);
169  if ((NT_SUCCESS(Status)) && (AllowBad))
170  {
171  /* No point checking the list if it is */
172  return STATUS_SUCCESS;
173  }
174 
175  /* Otherwise, check if there's a persisted bad page list */
178  &BadPages,
179  &BadPageCount,
180  TRUE);
181  if (NT_SUCCESS(Status))
182  {
183  EfiPrintf(L"Persistent bad page list not supported\r\n");
184  return STATUS_NOT_IMPLEMENTED;
185  }
186 
187  /* All done here */
188  return STATUS_SUCCESS;
189 }
#define TRUE
Definition: types.h:120
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
LONG NTSTATUS
Definition: precomp.h:26
BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry
Definition: bootlib.c:19
PBL_BCD_OPTION BcdData
Definition: bl.h:868
unsigned char BOOLEAN
NTSTATUS BlGetBootOptionBoolean(_In_ PBL_BCD_OPTION List, _In_ ULONG Type, _Out_ PBOOLEAN Value)
Definition: bcdopt.c:504
NTSTATUS BlpGetBootOptionIntegerList(_In_ PBL_BCD_OPTION List, _In_ ULONG Type, _Out_ PULONGLONG *Value, _Out_ PULONGLONG Count, _In_ BOOLEAN NoCopy)
Definition: bcdopt.c:541
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
uint64_t ULONGLONG
Definition: typedefs.h:65
static const WCHAR L[]
Definition: oid.c:1250
Status
Definition: gdiplustypes.h:24
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
Definition: ntbasedef.h:390
return STATUS_SUCCESS
Definition: btrfs.c:2725

Referenced by BlInitializeLibrary(), and BlpMmInitialize().

◆ BlMmTranslateVirtualAddress()

BOOLEAN BlMmTranslateVirtualAddress ( _In_ PVOID  VirtualAddress,
_Out_ PPHYSICAL_ADDRESS  PhysicalAddress 
)

Definition at line 525 of file mm.c.

529 {
530  /* Make sure arguments are present */
531  if (!(VirtualAddress) || !(PhysicalAddress))
532  {
533  return FALSE;
534  }
535 
536  /* Do the architecture-specific translation */
538 }
BOOLEAN MmArchTranslateVirtualAddress(_In_ PVOID VirtualAddress, _Out_opt_ PPHYSICAL_ADDRESS PhysicalAddress, _Out_opt_ PULONG CachingFlags)
Definition: mm.c:44
smooth NULL
Definition: ftsmooth.c:416
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1060
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3773

Referenced by BlImgUnallocateImageBuffer(), EfiAllocatePages(), EfiConInExSetState(), EfiGetMemoryMap(), EfiGopGetCurrentMode(), EfiGopGetFrameBuffer(), EfiLocateHandleBuffer(), EfiVmOpenProtocol(), ImgpLoadPEImage(), and OslDrawLogo().

◆ BlMmUnmapVirtualAddressEx()

NTSTATUS BlMmUnmapVirtualAddressEx ( _In_ PVOID  VirtualAddress,
_In_ ULONGLONG  Size 
)

Definition at line 487 of file mm.c.

491 {
493 
494  /* Increment call depth */
496 
497  /* Make sure all parameters are there */
498  if ((VirtualAddress) && (Size))
499  {
500  /* Unmap the virtual address */
502 
503  /* Check if we actually had a virtual mapping active */
504  if ((NT_SUCCESS(Status)) && (MmTranslationType != BlNone))
505  {
506  /* We don't support virtual memory yet @TODO */
507  EfiPrintf(L"not yet implemented in %S\r\n", __FUNCTION__);
508  EfiStall(1000000);
510  }
511  }
512  else
513  {
514  /* Fail */
516  }
517 
518  /* Cleanup descriptors and reduce depth */
521  return Status;
522 }
NTSTATUS EfiStall(_In_ ULONG StallTime)
Definition: firmware.c:1003
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
BL_TRANSLATION_TYPE MmTranslationType
Definition: mm.c:17
ULONG MmDescriptorCallTreeCount
Definition: mm.c:19
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Definition: bl.h:231
VOID MmMdFreeGlobalDescriptors(VOID)
Definition: descriptor.c:1332
static const WCHAR L[]
Definition: oid.c:1250
NTSTATUS MmUnmapVirtualAddress(_Inout_ PVOID *VirtualAddress, _Inout_ PULONGLONG Size)
Definition: mm.c:453
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3773
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
Status
Definition: gdiplustypes.h:24
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
#define __FUNCTION__
Definition: types.h:112

Referenced by BlDisplayGetOemBitmap(), BlDisplayInvalidateOemBitmap(), BlDisplayValidOemBitmap(), BlImgLoadImageWithProgress2(), BlImgUnallocateImageBuffer(), BlUtlGetAcpiTable(), ConsoleFirmwareGraphicalDisable(), EfipGetRsdt(), EfiVmOpenProtocol(), EfiVmpFreeInterfaceEntry(), and ImgpLoadPEImage().

◆ BlpMmInitialize()

NTSTATUS BlpMmInitialize ( _In_ PBL_MEMORY_DATA  MemoryData,
_In_ BL_TRANSLATION_TYPE  TranslationType,
_In_ PBL_LIBRARY_PARAMETERS  LibraryParameters 
)

Definition at line 541 of file mm.c.

546 {
548 
549  /* Take a reference */
551 
552  /* Only support valid translation types */
553  if ((TranslationType > BlPae) || (LibraryParameters->TranslationType > BlPae))
554  {
555  /* Bail out */
556  EfiPrintf(L"Invalid translation types present\r\n");
558  goto Quickie;
559  }
560 
561  /* Initialize memory descriptors */
562  MmMdInitialize(0, LibraryParameters);
563 
564  /* Remember the page type we came in with */
565  MmOriginalTranslationType = TranslationType;
566 
567  /* Initialize the physical page allocator */
568  Status = MmPaInitialize(MemoryData,
569  LibraryParameters->MinimumAllocationCount);
570  if (!NT_SUCCESS(Status))
571  {
572  goto Quickie;
573  }
574 
575  /* Initialize the memory tracker */
577  if (!NT_SUCCESS(Status))
578  {
579  EfiPrintf(L"TR Mm init failed: %lx\r\n", Status);
580  //MmArchDestroy();
581  //MmPaDestroy(1);
582  goto Quickie;
583  }
584 
585  /* Initialize paging, large pages, self-mapping, PAE, if needed */
587  MemoryData,
588  TranslationType,
589  LibraryParameters->TranslationType);
590  if (NT_SUCCESS(Status))
591  {
592  /* Save the newly active transation type */
593  MmTranslationType = LibraryParameters->TranslationType;
594 
595  /* Initialize the heap allocator now */
596  Status = MmHaInitialize(LibraryParameters->MinimumHeapSize,
597  LibraryParameters->HeapAllocationAttributes);
598  }
599 
600  /* If Phase 1 init failed, bail out */
601  if (!NT_SUCCESS(Status))
602  {
603  /* Kill everything set setup so far */
604  EfiPrintf(L"Phase 1 Mm init failed: %lx\r\n", Status);
605  //MmPaDestroy(0);
606  //MmTrDestroy();
607  //MmArchDestroy();
608  //MmPaDestroy(1);
609  goto Quickie;
610  }
611 
612  /* Do we have too many descriptors? */
613  if (LibraryParameters->DescriptorCount > 512)
614  {
615  /* Switch to using a dynamic buffer instead */
616  EfiPrintf(L"Warning: too many descriptors\r\n");
618  goto Quickie;
619  //MmMdpSwitchToDynamicDescriptors(LibraryParameters->DescriptorCount);
620  }
621 
622  /* Remove memory that the BCD says is bad */
624 
625  /* Now map all the memory regions as needed */
627  MemoryData,
628  TranslationType,
629  LibraryParameters->TranslationType);
630  if (NT_SUCCESS(Status))
631  {
632  /* Initialize the block allocator */
634  }
635 
636  /* Check if anything in phase 2 failed */
637  if (!NT_SUCCESS(Status))
638  {
639  /* Go back to static descriptors and kill the heap */
640  EfiPrintf(L"Phase 2 Mm init failed: %lx\r\n", Status);
641  //MmMdpSwitchToStaticDescriptors();
642  //HapInitializationStatus = 0;
643  //++MmDescriptorCallTreeCount;
644 
645  /* Destroy the Phase 1 initialization */
646  //MmPaDestroy(0);
647  //MmTrDestroy();
648  //MmArchDestroy();
649  //MmPaDestroy(1);
650  }
651 
652 Quickie:
653  /* Free the memory descriptors and return the initialization state */
656  return Status;
657 }
NTSTATUS BlMmRemoveBadMemory(VOID)
Definition: mm.c:155
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS MmHaInitialize(_In_ ULONG HeapSize, _In_ ULONG HeapAttributes)
Definition: heapalloc.c:538
BL_TRANSLATION_TYPE MmTranslationType
Definition: mm.c:17
NTSTATUS MmArchInitialize(_In_ ULONG Phase, _In_ PBL_MEMORY_DATA MemoryData, _In_ BL_TRANSLATION_TYPE TranslationType, _In_ BL_TRANSLATION_TYPE RequestedTranslationType)
Definition: mm.c:20
NTSTATUS MmTrInitialize(VOID)
Definition: mm.c:84
ULONG MmDescriptorCallTreeCount
Definition: mm.c:19
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS MmBaInitialize(VOID)
Definition: blkalloc.c:271
BL_TRANSLATION_TYPE MmOriginalTranslationType
Definition: mm.c:18
VOID MmMdFreeGlobalDescriptors(VOID)
Definition: descriptor.c:1332
static const WCHAR L[]
Definition: oid.c:1250
Status
Definition: gdiplustypes.h:24
NTSTATUS MmPaInitialize(_In_ PBL_MEMORY_DATA MemoryData, _In_ ULONG MinimumPages)
VOID MmMdInitialize(_In_ ULONG Phase, _In_ PBL_LIBRARY_PARAMETERS LibraryParameters)
Definition: descriptor.c:1384
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
Definition: bl.h:233

Referenced by InitializeLibrary().

◆ MmTrInitialize()

NTSTATUS MmTrInitialize ( VOID  )

Definition at line 84 of file mm.c.

87 {
90  PLIST_ENTRY NextEntry;
91 
92  /* Nothing to track if we're using physical memory */
94  {
95  return STATUS_SUCCESS;
96  }
97 
98  /* Initialize all the virtual lists */
103 
104  /* Initialize a 4GB free descriptor */
107  0,
108  0,
109  ((ULONGLONG)4 * 1024 * 1024 * 1024) >>
110  PAGE_SHIFT);
111  if (!Descriptor)
112  {
114  goto Quickie;
115  }
116 
117  /* Add this 4GB region to the free virtual address space list */
119  Descriptor,
121  if (!NT_SUCCESS(Status))
122  {
124  goto Quickie;
125  }
126 
127  /* Remove any reserved regions of virtual address space */
128  NextEntry = MmMdlReservedAllocated.First->Flink;
129  while (NextEntry != MmMdlReservedAllocated.First)
130  {
131  /* Grab the descriptor and see if it's mapped */
132  Descriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry);
133  if (Descriptor->VirtualPage)
134  {
135  EfiPrintf(L"Need to handle reserved allocation: %llx %llx\r\n",
136  Descriptor->VirtualPage, Descriptor->PageCount);
137  EfiStall(100000);
139  goto Quickie;
140  }
141 
142  /* Next entry */
143  NextEntry = NextEntry->Flink;
144  }
145 
146  /* Set success if we made it */
148 
149 Quickie:
150  /* Return back to caller */
151  return Status;
152 }
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
NTSTATUS EfiStall(_In_ ULONG StallTime)
Definition: firmware.c:1003
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
FORCEINLINE VOID MmMdInitializeListHead(_In_ PBL_MEMORY_DESCRIPTOR_LIST List)
Definition: bl.h:1377
LONG NTSTATUS
Definition: precomp.h:26
BL_TRANSLATION_TYPE MmTranslationType
Definition: mm.c:17
NTSTATUS MmMdAddDescriptorToList(_In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor, _In_ ULONG Flags)
Definition: descriptor.c:582
BL_MEMORY_DESCRIPTOR_LIST MmMdlReservedAllocated
Definition: pagealloc.c:40
#define BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG
Definition: bl.h:90
PLIST_ENTRY First
Definition: bl.h:1008
PBL_MEMORY_DESCRIPTOR MmMdInitByteGranularDescriptor(_In_ ULONG Flags, _In_ BL_MEMORY_TYPE Type, _In_ ULONGLONG BasePage, _In_ ULONGLONG VirtualPage, _In_ ULONGLONG PageCount)
Definition: descriptor.c:377
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Definition: bl.h:231
uint64_t ULONGLONG
Definition: typedefs.h:65
static const WCHAR L[]
Definition: oid.c:1250
Definition: typedefs.h:117
Status
Definition: gdiplustypes.h:24
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
BL_MEMORY_DESCRIPTOR_LIST MmMdlMappingTrackers
Definition: pagealloc.c:46
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
return STATUS_SUCCESS
Definition: btrfs.c:2725
BL_MEMORY_DESCRIPTOR_LIST MmMdlFreeVirtual
Definition: pagealloc.c:45
_In_ PSTORAGE_PROPERTY_ID _Outptr_ PSTORAGE_DESCRIPTOR_HEADER * Descriptor
Definition: classpnp.h:966

Referenced by BlpMmInitialize().

◆ MmUnmapVirtualAddress()

NTSTATUS MmUnmapVirtualAddress ( _Inout_ PVOID VirtualAddress,
_Inout_ PULONGLONG  Size 
)

Definition at line 453 of file mm.c.

457 {
459 
460  /* Make sure parameters were passed in and are valid */
461  if ((VirtualAddress) && (Size) && (*Size <= 0xFFFFFFFF))
462  {
463  /* Nothing to do if translation isn't active */
464  if (MmTranslationType == BlNone)
465  {
467  }
468  else
469  {
470  /* We don't support virtual memory yet @TODO */
471  EfiPrintf(L"unmap not yet implemented in %S\r\n", __FUNCTION__);
472  EfiStall(1000000);
474  }
475  }
476  else
477  {
478  /* Fail */
480  }
481 
482  /* All done */
483  return Status;
484 }
NTSTATUS EfiStall(_In_ ULONG StallTime)
Definition: firmware.c:1003
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
BL_TRANSLATION_TYPE MmTranslationType
Definition: mm.c:17
Definition: bl.h:231
static const WCHAR L[]
Definition: oid.c:1250
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3773
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
Status
Definition: gdiplustypes.h:24
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
return STATUS_SUCCESS
Definition: btrfs.c:2725
#define __FUNCTION__
Definition: types.h:112

Referenced by BlMmMapPhysicalAddressEx(), BlMmUnmapVirtualAddressEx(), and Mmx86MapInitStructure().

◆ TrpGenerateMappingTracker()

NTSTATUS TrpGenerateMappingTracker ( _In_ PVOID  VirtualAddress,
_In_ ULONG  Flags,
_In_ LARGE_INTEGER  PhysicalAddress,
_In_ ULONGLONG  Size 
)

Definition at line 24 of file mm.c.

30 {
31  PBL_MEMORY_DESCRIPTOR Descriptor, NextDescriptor;
32  PLIST_ENTRY ListHead, NextEntry;
33 
34  /* Increment descriptor call count */
36 
37  /* Initialize a descriptor for this allocation */
39  0,
42  Size);
43 
44  /* Loop the current tracker list */
45  ListHead = MmMdlMappingTrackers.First;
46  NextEntry = ListHead->Flink;
47  if (IsListEmpty(ListHead))
48  {
49  /* If it's empty, just add the descriptor at the end */
50  InsertTailList(ListHead, &Descriptor->ListEntry);
51  goto Quickie;
52  }
53 
54  /* Otherwise, go to the last descriptor */
55  NextDescriptor = CONTAINING_RECORD(NextEntry,
57  ListEntry);
58  while (NextDescriptor->VirtualPage < Descriptor->VirtualPage)
59  {
60  /* Keep going... */
61  NextEntry = NextEntry->Flink;
62  NextDescriptor = CONTAINING_RECORD(NextEntry,
64  ListEntry);
65 
66  /* If we hit the end of the list, just add it at the end */
67  if (NextEntry == ListHead)
68  {
69  goto Quickie;
70  }
71 
72  /* Otherwise, add it right after this descriptor */
73  InsertTailList(&NextDescriptor->ListEntry, &Descriptor->ListEntry);
74  }
75 
76 Quickie:
77  /* Release any global descriptors allocated */
80  return STATUS_SUCCESS;
81 }
#define InsertTailList(ListHead, Entry)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
PLIST_ENTRY First
Definition: bl.h:1008
uint32_t ULONG_PTR
Definition: typedefs.h:63
ULONG MmDescriptorCallTreeCount
Definition: mm.c:19
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
PBL_MEMORY_DESCRIPTOR MmMdInitByteGranularDescriptor(_In_ ULONG Flags, _In_ BL_MEMORY_TYPE Type, _In_ ULONGLONG BasePage, _In_ ULONGLONG VirtualPage, _In_ ULONGLONG PageCount)
Definition: descriptor.c:377
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
VOID MmMdFreeGlobalDescriptors(VOID)
Definition: descriptor.c:1332
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1060
Definition: typedefs.h:117
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3773
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
BL_MEMORY_DESCRIPTOR_LIST MmMdlMappingTrackers
Definition: pagealloc.c:46
LIST_ENTRY ListEntry
Definition: bl.h:826
ULONGLONG VirtualPage
Definition: bl.h:832
return STATUS_SUCCESS
Definition: btrfs.c:2725
LONGLONG QuadPart
Definition: typedefs.h:112
_In_ PSTORAGE_PROPERTY_ID _Outptr_ PSTORAGE_DESCRIPTOR_HEADER * Descriptor
Definition: classpnp.h:966

Referenced by BlMmMapPhysicalAddressEx().

Variable Documentation

◆ MmDescriptorCallTreeCount

◆ MmOriginalTranslationType

BL_TRANSLATION_TYPE MmOriginalTranslationType

Definition at line 18 of file mm.c.

Referenced by BlpMmInitialize().

◆ MmTranslationType