From 6fc91eb58cc976132670265209a030cd41cabe8c Mon Sep 17 00:00:00 2001 From: Kaimakan71 Date: Tue, 27 Aug 2024 13:57:21 -0400 Subject: [PATCH] [BOOT] Add stubs to complete MmPaInitialize() MmPaInitialize() is now complete Added BlpMmInitializeConstraints() and MmMdRemoveRegionFromMdlEx() --- BOOT/ENVIRON/INC/bootlib.h | 5 +++ BOOT/ENVIRON/INC/mm.h | 12 ++++++- BOOT/ENVIRON/LIB/MM/mm.c | 30 ++++++++++++++++++ BOOT/ENVIRON/LIB/MM/mmmd.c | 65 ++++++++++++++++++++++++++++++++++++-- BOOT/ENVIRON/LIB/MM/mmpa.c | 56 +++++++++++++++++++++++++------- BOOT/ENVIRON/LIB/bootlib.c | 2 +- 6 files changed, 155 insertions(+), 15 deletions(-) diff --git a/BOOT/ENVIRON/INC/bootlib.h b/BOOT/ENVIRON/INC/bootlib.h index b0973f1..59969b9 100644 --- a/BOOT/ENVIRON/INC/bootlib.h +++ b/BOOT/ENVIRON/INC/bootlib.h @@ -63,6 +63,11 @@ BlpFwInitialize ( IN PBOOT_FIRMWARE_DATA FirmwareData ); +NTSTATUS +BlpMmInitializeConstraints ( + VOID + ); + NTSTATUS BlpMmInitialize ( IN PBOOT_MEMORY_INFO MemoryInfo, diff --git a/BOOT/ENVIRON/INC/mm.h b/BOOT/ENVIRON/INC/mm.h index 59b58f5..a175de7 100644 --- a/BOOT/ENVIRON/INC/mm.h +++ b/BOOT/ENVIRON/INC/mm.h @@ -18,7 +18,8 @@ Abstract: #include "bootlib.h" -#define MDL_OPERATION_FLAGS_TRUNCATE 0x02 +#define MDL_OPERATION_FLAGS_TRUNCATE 0x00000002 +#define MDL_OPERATION_FLAGS_PHYSICAL 0x40000000 NTSTATUS MmFwGetMemoryMap ( @@ -52,6 +53,15 @@ MmMdRemoveDescriptorFromList ( IN PMEMORY_DESCRIPTOR Descriptor ); +NTSTATUS +MmMdRemoveRegionFromMdlEx ( + IN PMEMORY_DESCRIPTOR_LIST Mdl, + IN ULONGLONG FirstPage, + IN ULONGLONG PageCount, + IN ULONG Flags, + OUT PMEMORY_DESCRIPTOR_LIST Unused + ); + NTSTATUS MmMdFreeDescriptor ( IN PMEMORY_DESCRIPTOR Descriptor diff --git a/BOOT/ENVIRON/LIB/MM/mm.c b/BOOT/ENVIRON/LIB/MM/mm.c index d86074a..2926e3c 100644 --- a/BOOT/ENVIRON/LIB/MM/mm.c +++ b/BOOT/ENVIRON/LIB/MM/mm.c @@ -17,6 +17,36 @@ Abstract: #include "bootlib.h" #include "mm.h" +NTSTATUS +BlpMmInitializeConstraints ( + VOID + ) + +/*++ + +Routine Description: + + Initializes physical address constraints. + +Arguments: + + None. + +Return Value: + + STATUS_SUCCESS if successful, + + +--*/ + +{ + // + // TODO: Implement this. + // + + return STATUS_SUCCESS; +} + NTSTATUS BlpMmInitialize ( IN PBOOT_MEMORY_INFO MemoryInfo, diff --git a/BOOT/ENVIRON/LIB/MM/mmmd.c b/BOOT/ENVIRON/LIB/MM/mmmd.c index 19bc153..f226be6 100644 --- a/BOOT/ENVIRON/LIB/MM/mmmd.c +++ b/BOOT/ENVIRON/LIB/MM/mmmd.c @@ -347,9 +347,9 @@ Routine Description: Arguments: - Mdl - the MDL to remove Descriptor from. + Mdl - MDL to remove Descriptor from. - Descriptor - the descriptor to remove from Mdl. + Descriptor - Descriptor to remove from Mdl. Return Value: @@ -386,6 +386,67 @@ Return Value: } } +NTSTATUS +MmMdRemoveRegionFromMdlEx ( + IN PMEMORY_DESCRIPTOR_LIST Mdl, + IN ULONGLONG FirstPage, + IN ULONGLONG PageCount, + IN ULONG Flags, + OUT PMEMORY_DESCRIPTOR_LIST Unused + ) + +/*++ + +Routine Description: + + Removes a region from a MDL. + +Arguments: + + Mdl - MDL to remove the region from. + + FirstPage - The first page in the region. + + PageCount - The number of pages in the region. + + Flags - MDL_OPERATION_FLAGS_*. + + Unused - Unused. + +Return Value: + + None. + +--*/ + +{ + ULONGLONG RemoveEnd, DescriptorEnd; + PLIST_ENTRY Entry; + PMEMORY_DESCRIPTOR Descriptor; + MEMORY_DESCRIPTOR RemovedDescriptor; + + (VOID)Flags; + (VOID)Unused; + + RemoveEnd = FirstPage + PageCount; + Entry = Mdl->Head->Flink; + while (Entry != Mdl->Head) { + Descriptor = (PMEMORY_DESCRIPTOR)Entry; + DescriptorEnd = Descriptor->FirstPage + Descriptor->PageCount; + + RtlCopyMemory(&RemovedDescriptor, Descriptor, sizeof(MEMORY_DESCRIPTOR)); + + // if (FirstPage <= Descriptor->FirstPage && Descriptor->FirstPage < RemoveEnd) { + // } + } + + // + // TODO: Finish this function. + // + + return STATUS_SUCCESS; +} + NTSTATUS MmMdFreeDescriptor ( IN PMEMORY_DESCRIPTOR Descriptor diff --git a/BOOT/ENVIRON/LIB/MM/mmpa.c b/BOOT/ENVIRON/LIB/MM/mmpa.c index 96f52a4..38a8dcc 100644 --- a/BOOT/ENVIRON/LIB/MM/mmpa.c +++ b/BOOT/ENVIRON/LIB/MM/mmpa.c @@ -79,44 +79,78 @@ Arguments: Return Value: STATUS_SUCCESS if successful, + STATUS_INVALID_PARAMETER if regions in MemoryInfo could not be removed. + STATUS_NO_MEMORY if a new descriptor cannot be allocated. --*/ { NTSTATUS Status; + PMEMORY_DESCRIPTOR Descriptor, NewDescriptor; (VOID)MemoryInfo; DebugPrint(L"Initializing page allocator...\r\n"); - // - // Initialize page allocator settings. - // PapMinimumAllocationCount = MinimumAllocation; PapMinimumPhysicalPage = 1; PapMaximumPhysicalPage = MAXULONGLONG >> PAGE_SHIFT; - DebugPrintf(L"Maximum physical page: %x %x\r\n", HIDWORD(PapMaximumPhysicalPage), LODWORD(PapMaximumPhysicalPage)); - // - // Initialize MDLs. - // InitializeMdl(&MmMdlFwAllocationTracker); InitializeMdl(&MmMdlBadMemory); InitializeMdl(&MmMdlTruncatedMemory); InitializeMdl(&MmMdlPersistentMemory); - InitializeMdl(&MmMdlReservedAllocated);; + InitializeMdl(&MmMdlReservedAllocated); InitializeMdl(&MmMdlMappedAllocated); InitializeMdl(&MmMdlMappedUnallocated); InitializeMdl(&MmMdlUnmappedAllocated); InitializeMdl(&MmMdlUnmappedUnallocated); - // - // Get the firmware memory map. - // Status = MmFwGetMemoryMap(&MmMdlUnmappedUnallocated, 0x03); if (!NT_SUCCESS(Status)) { return Status; } + // + // Remove regions described in MemoryInfo from the + // MDL the memory manager will use for allocation. + // + Descriptor = (PMEMORY_DESCRIPTOR)((PUCHAR)MemoryInfo + MemoryInfo->MdlOffset); + for (ULONG DescriptorCount = MemoryInfo->DescriptorCount; DescriptorCount > 0; DescriptorCount--) { + // + // Remove from the usable MDL. + // + Status = MmMdRemoveRegionFromMdlEx(&MmMdlUnmappedUnallocated, Descriptor->FirstPage, Descriptor->PageCount, MDL_OPERATION_FLAGS_PHYSICAL, NULL); + if (!NT_SUCCESS(Status)) { + return STATUS_INVALID_PARAMETER; + } + + // + // ... and add to the reserved MDL. + // + NewDescriptor = MmMdInitDescriptor( + Descriptor->FirstPage, + Descriptor->MappedFirstPage, + Descriptor->PageCount, + Descriptor->Attributes, + Descriptor->Type + ); + if (NewDescriptor == NULL) { + return STATUS_NO_MEMORY; + } + + Status = MmMdAddDescriptorToList(&MmMdlReservedAllocated, NewDescriptor, 0x00); + if (!NT_SUCCESS(Status)) { + return Status; + } + + Descriptor = (PMEMORY_DESCRIPTOR)((PUCHAR)Descriptor + MemoryInfo->DescriptorSize); + } + + Status = BlpMmInitializeConstraints(); + if (!NT_SUCCESS(Status)) { + return Status; + } + return STATUS_SUCCESS; } diff --git a/BOOT/ENVIRON/LIB/bootlib.c b/BOOT/ENVIRON/LIB/bootlib.c index 59cdffe..faf03f3 100644 --- a/BOOT/ENVIRON/LIB/bootlib.c +++ b/BOOT/ENVIRON/LIB/bootlib.c @@ -82,7 +82,7 @@ Return Value: return Status; } - ConsolePrint(L"-------- Alcyone EFI Boot Manager --------\r\n"); + ConsolePrint(L"> Alcyone EFI Boot Manager\r\n"); ConsolePrintf(L"Image base: %x %x\r\nImage size: %x\r\n", HIDWORD((ULONG_PTR)InputParameters->ImageBase), LODWORD((ULONG_PTR)InputParameters->ImageBase), InputParameters->ImageSize); DebugPrint(L"Initializing boot library...\r\n");