From 88dcf318568eeeed6094de352e5e9af59b022f92 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sun, 5 Feb 2017 22:34:47 +0000 Subject: [PATCH] [BOOTLIB]: Implement MmArchTranslateVirtualAddress for non-paging mode. Stub Mmx86TranslateVirtualAddress. [BOOTLIB]: Support EfiPrintf in Protected mode. [BOOTLIB]: Support EfiGetMemoryMap in Protected Mode. svn path=/trunk/; revision=73721 --- reactos/boot/environ/include/bl.h | 7 +++ .../boot/environ/lib/firmware/efi/firmware.c | 27 ++++++++-- reactos/boot/environ/lib/mm/i386/mmx86.c | 53 +++++++++++++++++++ reactos/boot/environ/lib/mm/mm.c | 5 +- reactos/boot/environ/lib/mm/pagealloc.c | 7 +-- 5 files changed, 89 insertions(+), 10 deletions(-) diff --git a/reactos/boot/environ/include/bl.h b/reactos/boot/environ/include/bl.h index 9d06f98dbfb..7401e642620 100644 --- a/reactos/boot/environ/include/bl.h +++ b/reactos/boot/environ/include/bl.h @@ -2175,6 +2175,13 @@ BlMmTranslateVirtualAddress ( _Out_ PPHYSICAL_ADDRESS PhysicalAddress ); +BOOLEAN +MmArchTranslateVirtualAddress ( + _In_ PVOID VirtualAddress, + _Out_opt_ PPHYSICAL_ADDRESS PhysicalAddress, + _Out_opt_ PULONG CachingFlags + ); + /* BLOCK ALLOCATOR ROUTINES **************************************************/ NTSTATUS diff --git a/reactos/boot/environ/lib/firmware/efi/firmware.c b/reactos/boot/environ/lib/firmware/efi/firmware.c index ea96ca11b23..48cdffb0793 100644 --- a/reactos/boot/environ/lib/firmware/efi/firmware.c +++ b/reactos/boot/environ/lib/firmware/efi/firmware.c @@ -143,12 +143,17 @@ EfiPrintf ( } else { - /* FIXME: @TODO: Not yet supported */ - // FIXME: Hack while we are in early rosload mode + /* Switch to real mode */ + BlpArchSwitchContext(BlRealMode); + + /* Call EFI directly */ if (EfiConOut != NULL) { EfiConOut->OutputString(EfiConOut, BlScratchBuffer); } + + /* Switch back to protected mode */ + BlpArchSwitchContext(BlProtectedMode); } /* All done */ @@ -559,13 +564,27 @@ EfiGetMemoryMap ( { BL_ARCH_MODE OldMode; EFI_STATUS EfiStatus; + PHYSICAL_ADDRESS MemoryMapSizePhysical, MemoryMapPhysical, MapKeyPhysical; + PHYSICAL_ADDRESS DescriptorSizePhysical, DescriptorVersionPhysical; /* Are we in protected mode? */ OldMode = CurrentExecutionContext->Mode; if (OldMode != BlRealMode) { - /* FIXME: Not yet implemented */ - return STATUS_NOT_IMPLEMENTED; + /* Convert all of the addresses to physical */ + BlMmTranslateVirtualAddress(MemoryMapSize, &MemoryMapSizePhysical); + MemoryMapSize = (UINTN*)MemoryMapSizePhysical.LowPart; + BlMmTranslateVirtualAddress(MemoryMap, &MemoryMapPhysical); + MemoryMap = (EFI_MEMORY_DESCRIPTOR*)MemoryMapPhysical.LowPart; + BlMmTranslateVirtualAddress(MapKey, &MapKeyPhysical); + MapKey = (UINTN*)MapKeyPhysical.LowPart; + BlMmTranslateVirtualAddress(DescriptorSize, &DescriptorSizePhysical); + DescriptorSize = (UINTN*)DescriptorSizePhysical.LowPart; + BlMmTranslateVirtualAddress(DescriptorVersion, &DescriptorVersionPhysical); + DescriptorVersion = (UINTN*)DescriptorVersionPhysical.LowPart; + + /* Switch to real mode */ + BlpArchSwitchContext(BlProtectedMode); } /* Make the EFI call */ diff --git a/reactos/boot/environ/lib/mm/i386/mmx86.c b/reactos/boot/environ/lib/mm/i386/mmx86.c index c9ce6d72a11..36c5742486e 100644 --- a/reactos/boot/environ/lib/mm/i386/mmx86.c +++ b/reactos/boot/environ/lib/mm/i386/mmx86.c @@ -78,6 +78,59 @@ Mmx86pMapMemoryRegions ( return STATUS_NOT_IMPLEMENTED; } +BOOLEAN +Mmx86TranslateVirtualAddress ( + _In_ PVOID VirtualAddress, + _Out_opt_ PPHYSICAL_ADDRESS PhysicalAddress, + _Out_opt_ PULONG CachingFlags + ) +{ + EfiPrintf(L"paging TODO\r\n"); + return FALSE; +} + +BOOLEAN +MmArchTranslateVirtualAddress ( + _In_ PVOID VirtualAddress, + _Out_opt_ PPHYSICAL_ADDRESS PhysicalAddress, + _Out_opt_ PULONG CachingFlags + ) +{ + PBL_MEMORY_DESCRIPTOR Descriptor; + + /* Check if paging is on */ + if ((CurrentExecutionContext) && + (CurrentExecutionContext->ContextFlags & BL_CONTEXT_PAGING_ON)) + { + /* Yes -- we have to translate this from virtual */ + return Mmx86TranslateVirtualAddress(VirtualAddress, + PhysicalAddress, + CachingFlags); + } + + /* Look in all descriptors except truncated and firmware ones */ + Descriptor = MmMdFindDescriptor(BL_MM_INCLUDE_NO_FIRMWARE_MEMORY & + ~BL_MM_INCLUDE_TRUNCATED_MEMORY, + BL_MM_REMOVE_PHYSICAL_REGION_FLAG, + (ULONG_PTR)VirtualAddress >> PAGE_SHIFT); + + /* Return the virtual address as the physical address */ + if (PhysicalAddress) + { + PhysicalAddress->HighPart = 0; + PhysicalAddress->LowPart = (ULONG_PTR)VirtualAddress; + } + + /* There's no caching on physical memory */ + if (CachingFlags) + { + *CachingFlags = 0; + } + + /* Success is if we found a descriptor */ + return Descriptor != NULL; +} + NTSTATUS MmArchInitialize ( _In_ ULONG Phase, diff --git a/reactos/boot/environ/lib/mm/mm.c b/reactos/boot/environ/lib/mm/mm.c index cb4ceea11c2..e10444167d5 100644 --- a/reactos/boot/environ/lib/mm/mm.c +++ b/reactos/boot/environ/lib/mm/mm.c @@ -312,9 +312,8 @@ BlMmTranslateVirtualAddress ( return FALSE; } - EfiPrintf(L"Unhandled virtual path\r\n"); - return FALSE; - //return MmArchTranslateVirtualAddress(VirtualAddress, PhysicalAddress, NULL); + /* Do the architecture-specific translation */ + return MmArchTranslateVirtualAddress(VirtualAddress, PhysicalAddress, NULL); } NTSTATUS diff --git a/reactos/boot/environ/lib/mm/pagealloc.c b/reactos/boot/environ/lib/mm/pagealloc.c index 70138e29f03..22b926af6d4 100644 --- a/reactos/boot/environ/lib/mm/pagealloc.c +++ b/reactos/boot/environ/lib/mm/pagealloc.c @@ -888,8 +888,9 @@ BlMmGetMemoryMap ( /* Free the previous entries, if any */ MmMdFreeList(&FirmwareMdList); - /* Get the firmware map */ - Status = MmFwGetMemoryMap(&FirmwareMdList, 2); + /* Get the firmware map, coalesced */ + Status = MmFwGetMemoryMap(&FirmwareMdList, + BL_MM_FLAG_REQUEST_COALESCING); if (!NT_SUCCESS(Status)) { goto Quickie; @@ -905,7 +906,7 @@ BlMmGetMemoryMap ( /* Free the previous entries, if any */ MmMdFreeList(&FirmwareMdList); - /* Get the firmware map */ + /* Get the firmware map, uncoalesced */ Status = MmFwGetMemoryMap(&FirmwareMdList, 0); if (!NT_SUCCESS(Status)) { -- 2.17.1