2015-09-06 03:24:30 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING.ARM in the top level directory
|
|
|
|
* PROJECT: ReactOS UEFI Boot Library
|
|
|
|
* FILE: boot/environ/lib/mm/i386/mmx86.c
|
|
|
|
* PURPOSE: Boot Library Memory Manager x86-Specific Code
|
|
|
|
* PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
|
|
|
#include "bl.h"
|
|
|
|
|
|
|
|
/* DATA VARIABLES ************************************************************/
|
|
|
|
|
2015-09-06 16:41:43 +00:00
|
|
|
ULONG_PTR MmArchKsegBase;
|
|
|
|
ULONG_PTR MmArchKsegBias;
|
|
|
|
ULONG MmArchLargePageSize;
|
|
|
|
BL_ADDRESS_RANGE MmArchKsegAddressRange;
|
|
|
|
ULONG_PTR MmArchTopOfApplicationAddressSpace;
|
|
|
|
ULONG_PTR Mmx86SelfMapBase;
|
|
|
|
|
|
|
|
typedef VOID
|
|
|
|
(*PBL_MM_FLUSH_TLB) (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef VOID
|
|
|
|
(*PBL_MM_RELOCATE_SELF_MAP) (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
PBL_MM_RELOCATE_SELF_MAP BlMmRelocateSelfMap;
|
|
|
|
PBL_MM_FLUSH_TLB BlMmFlushTlb;
|
|
|
|
|
2015-09-06 19:56:47 +00:00
|
|
|
ULONG MmDeferredMappingCount;
|
|
|
|
|
2015-09-06 03:24:30 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2015-09-06 16:41:43 +00:00
|
|
|
VOID
|
|
|
|
MmArchNullFunction (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
{
|
|
|
|
/* Nothing to do */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-09-06 19:56:47 +00:00
|
|
|
NTSTATUS
|
|
|
|
Mmx86pMapMemoryRegions (
|
|
|
|
_In_ ULONG Phase,
|
|
|
|
_In_ PBL_MEMORY_DATA MemoryData
|
|
|
|
)
|
|
|
|
{
|
|
|
|
BOOLEAN DoDeferred;
|
|
|
|
|
|
|
|
/* In phase 1 we don't initialize deferred mappings*/
|
|
|
|
if (Phase == 1)
|
|
|
|
{
|
|
|
|
DoDeferred = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Don't do anything if there's nothing to initialize */
|
|
|
|
if (!MmDeferredMappingCount)
|
|
|
|
{
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DoDeferred = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (DoDeferred)
|
|
|
|
{
|
2015-09-07 23:31:08 +00:00
|
|
|
EfiPrintf(L"Deferred todo\r\n");
|
2015-09-06 19:56:47 +00:00
|
|
|
}
|
|
|
|
|
2015-09-07 23:31:08 +00:00
|
|
|
EfiPrintf(L"Phase 1 TODO\r\n");
|
2015-09-06 19:56:47 +00:00
|
|
|
return STATUS_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
2015-09-06 03:24:30 +00:00
|
|
|
NTSTATUS
|
|
|
|
MmArchInitialize (
|
|
|
|
_In_ ULONG Phase,
|
|
|
|
_In_ PBL_MEMORY_DATA MemoryData,
|
|
|
|
_In_ BL_TRANSLATION_TYPE TranslationType,
|
2015-09-06 16:41:43 +00:00
|
|
|
_In_ BL_TRANSLATION_TYPE RequestedTranslationType
|
2015-09-06 03:24:30 +00:00
|
|
|
)
|
|
|
|
{
|
2015-09-06 16:41:43 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
/* For phase 2, just map deferred regions */
|
|
|
|
if (Phase != 1)
|
|
|
|
{
|
2015-09-06 19:56:47 +00:00
|
|
|
return Mmx86pMapMemoryRegions(2, MemoryData);
|
2015-09-06 16:41:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* What translation type are we switching to? */
|
|
|
|
switch (RequestedTranslationType)
|
|
|
|
{
|
|
|
|
/* Physical memory */
|
|
|
|
case BlNone:
|
|
|
|
|
|
|
|
/* Initialize everything to default/null values */
|
|
|
|
MmArchLargePageSize = 1;
|
|
|
|
MmArchKsegBase = 0;
|
|
|
|
MmArchKsegBias = 0;
|
|
|
|
MmArchKsegAddressRange.Minimum = 0;
|
|
|
|
MmArchKsegAddressRange.Maximum = (ULONGLONG)~0;
|
|
|
|
MmArchTopOfApplicationAddressSpace = 0;
|
|
|
|
Mmx86SelfMapBase = 0;
|
|
|
|
|
|
|
|
/* Set stub functions */
|
|
|
|
BlMmRelocateSelfMap = MmArchNullFunction;
|
|
|
|
BlMmFlushTlb = MmArchNullFunction;
|
|
|
|
|
|
|
|
/* Set success */
|
|
|
|
Status = STATUS_SUCCESS;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BlVirtual:
|
|
|
|
|
|
|
|
Status = STATUS_NOT_IMPLEMENTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BlPae:
|
|
|
|
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
Status = STATUS_INVALID_PARAMETER;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
|
2015-09-06 03:24:30 +00:00
|
|
|
}
|