Author: ion
Date: Tue Feb 7 03:34:49 2017
New Revision: 73741
URL:
http://svn.reactos.org/svn/reactos?rev=73741&view=rev
Log:
[BOOTLIB]: Finish implementing Mmx86pMapMemoryRegions.
Modified:
trunk/reactos/boot/environ/lib/mm/i386/mmx86.c
Modified: trunk/reactos/boot/environ/lib/mm/i386/mmx86.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/mm/i386/m…
==============================================================================
--- trunk/reactos/boot/environ/lib/mm/i386/mmx86.c [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/lib/mm/i386/mmx86.c [iso-8859-1] Tue Feb 7 03:34:49 2017
@@ -677,6 +677,8 @@
ULONGLONG Size;
NTSTATUS Status;
PVOID VirtualAddress;
+ BL_MEMORY_DESCRIPTOR_LIST FirmwareMdl;
+ PLIST_ENTRY Head, NextEntry;
/* In phase 1 we don't initialize deferred mappings*/
if (Phase == 1)
@@ -756,10 +758,59 @@
/* In phase 1, also do UEFI mappings */
if (Phase != 2)
{
- EfiPrintf(L"Phase 1 TODO UEFI mappings \r\n");
- }
-
- return STATUS_NOT_IMPLEMENTED;
+ /* Get the memory map */
+ MmMdInitializeListHead(&FirmwareMdl);
+ Status = MmFwGetMemoryMap(&FirmwareMdl, BL_MM_FLAG_REQUEST_COALESCING);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* Iterate over it */
+ Head = FirmwareMdl.First;
+ NextEntry = Head->Flink;
+ while (NextEntry != Head)
+ {
+ /* Check if this is a UEFI-related descriptor, unless it's the self-map
page */
+ Descriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry);
+ if (((Descriptor->Type == BlEfiBootMemory) ||
+ (Descriptor->Type == BlEfiRuntimeMemory) ||
+ (Descriptor->Type == BlLoaderMemory)) &&
+ ((Descriptor->BasePage << PAGE_SHIFT) !=
Mmx86SelfMapBase.QuadPart))
+ {
+ /* Identity-map it */
+ PhysicalAddress.QuadPart = Descriptor->BasePage << PAGE_SHIFT;
+ Status = Mmx86MapInitStructure((PVOID)((ULONG_PTR)Descriptor->BasePage
<< PAGE_SHIFT),
+ Descriptor->PageCount <<
PAGE_SHIFT,
+ PhysicalAddress);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+ }
+
+ /* Move to the next descriptor */
+ NextEntry = NextEntry->Flink;
+ }
+
+ /* Reset */
+ NextEntry = Head->Flink;
+ while (NextEntry != Head)
+ {
+ /* Get the descriptor */
+ Descriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry);
+
+ /* Skip to the next entry before we free */
+ NextEntry = NextEntry->Flink;
+
+ /* Remove and free it */
+ MmMdRemoveDescriptorFromList(&FirmwareMdl, Descriptor);
+ MmMdFreeDescriptor(Descriptor);
+ }
+ }
+
+ /* All library mappings identity mapped now */
+ return STATUS_SUCCESS;
}
NTSTATUS
@@ -1114,14 +1165,17 @@
case BlPae:
+ /* We don't support PAE */
Status = STATUS_NOT_SUPPORTED;
break;
default:
+
+ /* Invalid architecture type*/
Status = STATUS_INVALID_PARAMETER;
break;
}
+ /* Back to caller */
return Status;
-
-}
+}