From 3c9397513fb69eba355807b0d5dc9f1df14886bf Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 7 Feb 2017 03:34:49 +0000 Subject: [PATCH] [BOOTLIB]: Finish implementing Mmx86pMapMemoryRegions. svn path=/trunk/; revision=73741 --- reactos/boot/environ/lib/mm/i386/mmx86.c | 60 ++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/reactos/boot/environ/lib/mm/i386/mmx86.c b/reactos/boot/environ/lib/mm/i386/mmx86.c index cde5afd25f1..51c6273d316 100644 --- a/reactos/boot/environ/lib/mm/i386/mmx86.c +++ b/reactos/boot/environ/lib/mm/i386/mmx86.c @@ -677,6 +677,8 @@ Mmx86pMapMemoryRegions ( 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 @@ Mmx86pMapMemoryRegions ( /* In phase 1, also do UEFI mappings */ if (Phase != 2) { - EfiPrintf(L"Phase 1 TODO UEFI mappings \r\n"); + /* 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); + } } - return STATUS_NOT_IMPLEMENTED; + /* All library mappings identity mapped now */ + return STATUS_SUCCESS; } NTSTATUS @@ -1114,14 +1165,17 @@ MmArchInitialize ( 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; - }