mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
[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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user