[BOOTLIB]: Implement MmArchTranslateVirtualAddress for non-paging mode. Stub Mmx86Tra...
authorAlex Ionescu <aionescu@gmail.com>
Sun, 5 Feb 2017 22:34:47 +0000 (22:34 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Sun, 5 Feb 2017 22:34:47 +0000 (22:34 +0000)
[BOOTLIB]: Support EfiPrintf in Protected mode.
[BOOTLIB]: Support EfiGetMemoryMap in Protected Mode.

svn path=/trunk/; revision=73721

reactos/boot/environ/include/bl.h
reactos/boot/environ/lib/firmware/efi/firmware.c
reactos/boot/environ/lib/mm/i386/mmx86.c
reactos/boot/environ/lib/mm/mm.c
reactos/boot/environ/lib/mm/pagealloc.c

index 9d06f98..7401e64 100644 (file)
@@ -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
index ea96ca1..48cdffb 100644 (file)
@@ -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 */
index c9ce6d7..36c5742 100644 (file)
@@ -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,
index cb4ceea..e104441 100644 (file)
@@ -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
index 70138e2..22b926a 100644 (file)
@@ -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))
             {