mirror of
https://github.com/reactos/reactos.git
synced 2025-05-10 20:27:45 +00:00
[BOOTMGFW]:
- Implement algorithm to detect if truncation is needed, which should only happen on IA64 systems I believe (otherwise, the OS and firmware should have the same alignment/page size requirements) - Implement algorithm to detect if coalescing is needed. This shouldn't happen with firmware memory yet, but might happen once we start carving out stuff. svn path=/trunk/; revision=69056
This commit is contained in:
parent
a97581c62d
commit
cdd381d869
3 changed files with 149 additions and 10 deletions
|
@ -545,6 +545,15 @@ MmMdAddDescriptorToList (
|
||||||
_In_ ULONG Flags
|
_In_ ULONG Flags
|
||||||
);
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
MmMdRemoveRegionFromMdlEx (
|
||||||
|
__in PBL_MEMORY_DESCRIPTOR_LIST MdList,
|
||||||
|
__in ULONG Flags,
|
||||||
|
__in ULONGLONG BasePage,
|
||||||
|
__in ULONGLONG PageCount,
|
||||||
|
__in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
|
||||||
|
);
|
||||||
|
|
||||||
extern ULONG MmDescriptorCallTreeCount;
|
extern ULONG MmDescriptorCallTreeCount;
|
||||||
extern ULONG BlpApplicationFlags;
|
extern ULONG BlpApplicationFlags;
|
||||||
extern BL_LIBRARY_PARAMETERS BlpLibraryParameters;
|
extern BL_LIBRARY_PARAMETERS BlpLibraryParameters;
|
||||||
|
|
|
@ -268,6 +268,100 @@ MmMdInitByteGranularDescriptor (
|
||||||
return MemoryDescriptor;
|
return MemoryDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
MmMdpTruncateDescriptor (
|
||||||
|
__in PBL_MEMORY_DESCRIPTOR_LIST MdList,
|
||||||
|
__in PBL_MEMORY_DESCRIPTOR MemoryDescriptor,
|
||||||
|
__in ULONG Flags
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PBL_MEMORY_DESCRIPTOR NextDescriptor, PreviousDescriptor;
|
||||||
|
PLIST_ENTRY NextEntry, PreviousEntry;
|
||||||
|
ULONGLONG EndPage, PreviousEndPage;// , NextEndPage;
|
||||||
|
|
||||||
|
/* Get the next descriptor */
|
||||||
|
NextEntry = MemoryDescriptor->ListEntry.Flink;
|
||||||
|
NextDescriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry);
|
||||||
|
|
||||||
|
/* Get the previous descriptor */
|
||||||
|
PreviousEntry = MemoryDescriptor->ListEntry.Blink;
|
||||||
|
PreviousDescriptor = CONTAINING_RECORD(PreviousEntry, BL_MEMORY_DESCRIPTOR, ListEntry);
|
||||||
|
|
||||||
|
/* Calculate end pages */
|
||||||
|
EndPage = MemoryDescriptor->BasePage + MemoryDescriptor->PageCount;
|
||||||
|
//NextEndPage = NextDescriptor->BasePage + NextDescriptor->PageCount;
|
||||||
|
PreviousEndPage = PreviousDescriptor->BasePage + PreviousDescriptor->PageCount;
|
||||||
|
|
||||||
|
/* Check for backward overlap */
|
||||||
|
if ((PreviousEntry != MdList->First) && (MemoryDescriptor->BasePage < PreviousEndPage))
|
||||||
|
{
|
||||||
|
EarlyPrint(L"Overlap detected -- this is unexpected on x86/x64 platforms\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for forward overlap */
|
||||||
|
if ((NextEntry != MdList->First) && (NextDescriptor->BasePage < EndPage))
|
||||||
|
{
|
||||||
|
EarlyPrint(L"Overlap detected -- this is unexpected on x86/x64 platforms\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nothing to do */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
MmMdpCoalesceDescriptor (
|
||||||
|
__in PBL_MEMORY_DESCRIPTOR_LIST MdList,
|
||||||
|
__in PBL_MEMORY_DESCRIPTOR MemoryDescriptor,
|
||||||
|
__in ULONG Flags
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PBL_MEMORY_DESCRIPTOR NextDescriptor, PreviousDescriptor;
|
||||||
|
PLIST_ENTRY NextEntry, PreviousEntry;
|
||||||
|
ULONGLONG EndPage, PreviousEndPage, PreviousMappedEndPage, MappedEndPage;
|
||||||
|
|
||||||
|
/* Get the next descriptor */
|
||||||
|
NextEntry = MemoryDescriptor->ListEntry.Flink;
|
||||||
|
NextDescriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry);
|
||||||
|
|
||||||
|
/* Get the previous descriptor */
|
||||||
|
PreviousEntry = MemoryDescriptor->ListEntry.Blink;
|
||||||
|
PreviousDescriptor = CONTAINING_RECORD(PreviousEntry, BL_MEMORY_DESCRIPTOR, ListEntry);
|
||||||
|
|
||||||
|
/* Calculate end pages */
|
||||||
|
EndPage = MemoryDescriptor->BasePage + MemoryDescriptor->PageCount;
|
||||||
|
MappedEndPage = MemoryDescriptor->BasePage + MemoryDescriptor->PageCount;
|
||||||
|
PreviousMappedEndPage = PreviousDescriptor->VirtualPage + PreviousDescriptor->PageCount;
|
||||||
|
PreviousEndPage = PreviousDescriptor->BasePage + PreviousDescriptor->PageCount;
|
||||||
|
PreviousMappedEndPage = PreviousDescriptor->VirtualPage + PreviousDescriptor->PageCount;
|
||||||
|
|
||||||
|
/* Check if the previous entry touches the current entry, and is compatible */
|
||||||
|
if ((PreviousEntry != MdList->First) &&
|
||||||
|
(PreviousDescriptor->Type == MemoryDescriptor->Type) &&
|
||||||
|
((PreviousDescriptor->Flags ^ MemoryDescriptor->Flags) & 0x1B19FFFF) &&
|
||||||
|
(PreviousEndPage == MemoryDescriptor->BasePage) &&
|
||||||
|
((!(MemoryDescriptor->VirtualPage) && !(PreviousDescriptor->VirtualPage)) ||
|
||||||
|
((MemoryDescriptor->VirtualPage) && (PreviousDescriptor->VirtualPage) &&
|
||||||
|
(PreviousMappedEndPage == MemoryDescriptor->VirtualPage))))
|
||||||
|
{
|
||||||
|
EarlyPrint(L"Previous descriptor coalescible!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CHeck if the current entry touches the next entry, and is compatible */
|
||||||
|
if ((NextEntry != MdList->First) &&
|
||||||
|
(NextDescriptor->Type == MemoryDescriptor->Type) &&
|
||||||
|
((NextDescriptor->Flags ^ MemoryDescriptor->Flags) & 0x1B19FFFF) &&
|
||||||
|
(EndPage == NextDescriptor->BasePage) &&
|
||||||
|
((!(MemoryDescriptor->VirtualPage) && !(PreviousDescriptor->VirtualPage)) ||
|
||||||
|
((MemoryDescriptor->VirtualPage) && (PreviousDescriptor->VirtualPage) &&
|
||||||
|
(MappedEndPage == NextDescriptor->VirtualPage))))
|
||||||
|
{
|
||||||
|
EarlyPrint(L"Next descriptor coalescible!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nothing to do */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
MmMdAddDescriptorToList (
|
MmMdAddDescriptorToList (
|
||||||
_In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
|
_In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
|
||||||
|
@ -340,24 +434,20 @@ MmMdAddDescriptorToList (
|
||||||
if (Flags & BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG)
|
if (Flags & BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG)
|
||||||
{
|
{
|
||||||
/* Do it and then exit */
|
/* Do it and then exit */
|
||||||
#if 0
|
if (MmMdpTruncateDescriptor(MdList, MemoryDescriptor, Flags))
|
||||||
if (MmMdpTruncateDescriptor(MdList, Flags))
|
|
||||||
{
|
{
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do we have to coalesce? */
|
/* Do we have to coalesce? */
|
||||||
if (Flags & BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG)
|
if (Flags & BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG)
|
||||||
{
|
{
|
||||||
/* Do it and then exit */
|
/* Do it and then exit */
|
||||||
#if 0
|
if (MmMdpCoalesceDescriptor(MdList, MemoryDescriptor, Flags))
|
||||||
if (MmMdpCoalesceDescriptor(MdList))
|
|
||||||
{
|
{
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do we have to update the current pointer? */
|
/* Do we have to update the current pointer? */
|
||||||
|
@ -386,6 +476,17 @@ MmMdAddDescriptorToList (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
MmMdRemoveRegionFromMdlEx (
|
||||||
|
__in PBL_MEMORY_DESCRIPTOR_LIST MdList,
|
||||||
|
__in ULONG Flags,
|
||||||
|
__in ULONGLONG BasePage,
|
||||||
|
__in ULONGLONG PageCount,
|
||||||
|
__in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
MmMdInitialize (
|
MmMdInitialize (
|
||||||
|
|
|
@ -50,7 +50,7 @@ MmPaInitialize (
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG ExistingDescriptors, FinalOffset;
|
ULONG ExistingDescriptors, FinalOffset;
|
||||||
PBL_MEMORY_DESCRIPTOR Descriptor;
|
PBL_MEMORY_DESCRIPTOR Descriptor, NewDescriptor;
|
||||||
|
|
||||||
/* Initialize physical allocator variables */
|
/* Initialize physical allocator variables */
|
||||||
PapMaximumPhysicalPage = 0xFFFFFFFFFFFFF;
|
PapMaximumPhysicalPage = 0xFFFFFFFFFFFFF;
|
||||||
|
@ -109,9 +109,38 @@ MmPaInitialize (
|
||||||
ExistingDescriptors = BootMemoryData->DescriptorCount;
|
ExistingDescriptors = BootMemoryData->DescriptorCount;
|
||||||
while (ExistingDescriptors != 0)
|
while (ExistingDescriptors != 0)
|
||||||
{
|
{
|
||||||
EarlyPrint(L"Existing migration of memory not supported\n");
|
/* Remove this region from our free memory MDL */
|
||||||
Status = STATUS_NOT_IMPLEMENTED;
|
Status = MmMdRemoveRegionFromMdlEx(&MmMdlUnmappedUnallocated,
|
||||||
break;
|
0x40000000,
|
||||||
|
Descriptor->BasePage,
|
||||||
|
Descriptor->PageCount,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Build a descriptor for it */
|
||||||
|
NewDescriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags,
|
||||||
|
Descriptor->Type,
|
||||||
|
Descriptor->BasePage,
|
||||||
|
Descriptor->VirtualPage,
|
||||||
|
Descriptor->PageCount);
|
||||||
|
if (!NewDescriptor)
|
||||||
|
{
|
||||||
|
return STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And add this region to the reserved & allocated MDL */
|
||||||
|
Status = MmMdAddDescriptorToList(&MmMdlReservedAllocated, NewDescriptor, 0);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move on to the next descriptor */
|
||||||
|
ExistingDescriptors--;
|
||||||
|
Descriptor = (PBL_MEMORY_DESCRIPTOR)((ULONG_PTR)Descriptor + BootMemoryData->DescriptorSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are done, so check for any RAM constraints which will make us truncate memory */
|
/* We are done, so check for any RAM constraints which will make us truncate memory */
|
||||||
|
|
Loading…
Reference in a new issue