Compare commits

..

No commits in common. "4c32340803664d6e3ab340d02c4e6b7ced3937e3" and "75197cc8b5118750510360ebd8a8c9ae85ae4443" have entirely different histories.

5 changed files with 17 additions and 114 deletions

View File

@ -53,13 +53,6 @@ MmMdRemoveDescriptorFromList (
IN PMEMORY_DESCRIPTOR Descriptor IN PMEMORY_DESCRIPTOR Descriptor
); );
PMEMORY_DESCRIPTOR
MmMdFindDescriptorFromMdl (
IN PMEMORY_DESCRIPTOR_LIST Mdl,
IN ULONGLONG Page,
IN ULONG Flags
);
NTSTATUS NTSTATUS
MmMdRemoveRegionFromMdlEx ( MmMdRemoveRegionFromMdlEx (
IN PMEMORY_DESCRIPTOR_LIST Mdl, IN PMEMORY_DESCRIPTOR_LIST Mdl,

View File

@ -206,9 +206,6 @@ Return Value:
} }
BootDevice->Size = sizeof(BOOT_DEVICE); BootDevice->Size = sizeof(BOOT_DEVICE);
//
// Memory map devices are treated as ramdisks.
//
if (DevicePathType(EfiDevicePath) == HARDWARE_DEVICE_PATH && DevicePathSubType(EfiDevicePath) == HW_MEMMAP_DP) { if (DevicePathType(EfiDevicePath) == HARDWARE_DEVICE_PATH && DevicePathSubType(EfiDevicePath) == HW_MEMMAP_DP) {
MemmapNode = (MEMMAP_DEVICE_PATH *)EfiDevicePath; MemmapNode = (MEMMAP_DEVICE_PATH *)EfiDevicePath;
BlockDevice = &BootDevice->Block; BlockDevice = &BootDevice->Block;
@ -221,7 +218,7 @@ Return Value:
} }
// //
// TODO: Support more devices than just HDD/CD-ROM and ramdisks. // TODO: Only media devices and ramdisks are currently supported.
// //
DeviceNode = EfiInitpGetDeviceNode(EfiDevicePath); DeviceNode = EfiInitpGetDeviceNode(EfiDevicePath);
if (DevicePathType(DeviceNode) != MEDIA_DEVICE_PATH) { if (DevicePathType(DeviceNode) != MEDIA_DEVICE_PATH) {
@ -550,7 +547,7 @@ Return Value:
// //
// Convert the EFI file path into a boot file path option. // Convert the EFI file path into a boot file path option.
// TODO: Support UDP/PXE boot. // TODO: UDP/PXE are not supported.
// //
PrevOption = Option; PrevOption = Option;
Option = (PBOOT_APPLICATION_OPTION)((PUCHAR)&Entry->Options + OptionsSize); Option = (PBOOT_APPLICATION_OPTION)((PUCHAR)&Entry->Options + OptionsSize);
@ -564,7 +561,7 @@ Return Value:
BufferRemaining -= Size; BufferRemaining -= Size;
// //
// TODO: Parse additional options from LoadOptions. // TODO: Additional options in LoadOptions are not parsed.
// //
PrevOption = Option; PrevOption = Option;
Option = (PBOOT_APPLICATION_OPTION)((PUCHAR)&Entry->Options + OptionsSize); Option = (PBOOT_APPLICATION_OPTION)((PUCHAR)&Entry->Options + OptionsSize);

View File

@ -302,18 +302,17 @@ Return Value:
{ {
NTSTATUS Status; NTSTATUS Status;
UINTN EfiMapSize;
UINTN EfiMapKey;
UINTN EfiDescriptorSize;
UINT32 EfiDescriptorVersion;
UINTN PageCount, EfiPageCount;
EFI_PHYSICAL_ADDRESS EfiBuffer; EFI_PHYSICAL_ADDRESS EfiBuffer;
EFI_MEMORY_DESCRIPTOR *EfiMap; EFI_MEMORY_DESCRIPTOR *EfiMap;
UINTN EfiMapKey;
UINTN EfiMapSize, EfiDescriptorSize;
UINT32 EfiDescriptorVersion;
UINT64 EfiStartPage, EfiEndPage;
UINTN EfiPageCount;
ULONGLONG NtStartPage;
ULONG NtPageCount;
BOOLEAN IsRamdisk; BOOLEAN IsRamdisk;
UINT64 EfiRamdiskStartPage, EfiRamdiskEndPage;
MEMORY_TYPE MemoryType; MEMORY_TYPE MemoryType;
UINT64 EfiStartPage, EfiEndPage;
UINT64 EfiRamdiskStartPage, EfiRamdiskEndPage;
PMEMORY_DESCRIPTOR NtDescriptor; PMEMORY_DESCRIPTOR NtDescriptor;
(VOID)Flags; (VOID)Flags;
@ -348,8 +347,8 @@ Return Value:
} }
EfiMapSize += 4 * EfiDescriptorSize; EfiMapSize += 4 * EfiDescriptorSize;
NtPageCount = (ALIGN_UP(EfiMapSize, PAGE_SIZE) >> PAGE_SHIFT) + 1; PageCount = (ALIGN_UP(EfiMapSize, PAGE_SIZE) >> PAGE_SHIFT) + 1;
EfiPageCount = EFI_PAGE(NtPageCount); EfiPageCount = EFI_PAGE(PageCount);
Status = EfiAllocatePages(AllocateAnyPages, EfiLoaderData, EfiPageCount, &EfiBuffer); Status = EfiAllocatePages(AllocateAnyPages, EfiLoaderData, EfiPageCount, &EfiBuffer);
if (!NT_SUCCESS(Status)) { if (!NT_SUCCESS(Status)) {
DebugPrint(L"MmFwGetMemoryMap(): EfiAllocatePages() failed\r\n"); DebugPrint(L"MmFwGetMemoryMap(): EfiAllocatePages() failed\r\n");
@ -573,55 +572,9 @@ Return Value:
} }
// //
// The following code is to free the buffer and // TODO: Account for possible MDL changes due to EfiFreePages(EfiBuffer).
// also mark the freed memory as free in the MDL.
// //
Status = EfiFreePages(EfiBuffer, EfiPageCount);
if (!NT_SUCCESS(Status)) {
Status = STATUS_SUCCESS;
goto exit;
}
EfiBuffer = 0;
EfiStartPage = EfiBuffer >> EFI_PAGE_SHIFT;
EfiEndPage = ALIGN_UP(EfiStartPage + EfiPageCount, EFI_PAGE(1));
NtStartPage = NT_PAGE(EfiStartPage);
NtPageCount = NT_PAGE(EfiEndPage) - NtStartPage;
//
// Find the current descriptor.
//
NtDescriptor = MmMdFindDescriptorFromMdl(Mdl, NtStartPage, MDL_OPERATION_FLAGS_PHYSICAL);
if (NtDescriptor == NULL) {
Status = STATUS_UNSUCCESSFUL;
goto exit;
}
//
// Create a new free descriptor, with the same
// attributes as the current one.
//
NtDescriptor = MmMdInitDescriptor(NtStartPage, 0, NtPageCount, NtDescriptor->Attributes, MEMORY_TYPE_FREE);
if (NtDescriptor == NULL) {
Status = STATUS_INSUFFICIENT_RESOURCES;
goto exit;
}
//
// Remove the current descriptor.
//
Status = MmMdRemoveRegionFromMdlEx(Mdl, NtStartPage, NtPageCount, MDL_OPERATION_FLAGS_PHYSICAL, 0);
if (!NT_SUCCESS(Status)) {
MmMdFreeDescriptor(NtDescriptor);
goto exit;
}
//
// Add the new descriptor to the MDL.
//
Status = MmMdAddDescriptorToList(Mdl, NtDescriptor, 0x01);
exit: exit:
if (EfiBuffer) { if (EfiBuffer) {
EfiFreePages(EfiBuffer, EfiPageCount); EfiFreePages(EfiBuffer, EfiPageCount);

View File

@ -41,7 +41,7 @@ Return Value:
{ {
// //
// TODO: Implement this routine. // TODO: Implement this.
// //
return STATUS_SUCCESS; return STATUS_SUCCESS;

View File

@ -83,7 +83,7 @@ Return Value:
} }
// //
// TODO: Implement the rest of this routine. // TODO: Incomplete.
// //
ConsolePrint(L"MmMdpHasPrecedence() is incomplete\r\n"); ConsolePrint(L"MmMdpHasPrecedence() is incomplete\r\n");
return TRUE; return TRUE;
@ -386,45 +386,6 @@ Return Value:
} }
} }
PMEMORY_DESCRIPTOR
MmMdFindDescriptorFromMdl (
IN PMEMORY_DESCRIPTOR_LIST Mdl,
IN ULONGLONG Page,
IN ULONG Flags
)
/*++
Routine Description:
Searches an MDL for the descriptor containing a page.
Arguments:
Mdl - The MDL to search.
Page - The page to search for.
Flags - MDL_OPERATION_FLAGS_*
MDL_OPERATION_FLAGS_PHYSICAL if Page is physical.
MDL_OPERATION_FLAGS_VIRTUAL if Page is virtual.
Return Value:
Pointer to the descriptor if successful.
NULL if an error occurs.
--*/
{
//
// TODO: Implement this routine.
//
return NULL;
}
NTSTATUS NTSTATUS
MmMdRemoveRegionFromMdlEx ( MmMdRemoveRegionFromMdlEx (
IN PMEMORY_DESCRIPTOR_LIST Mdl, IN PMEMORY_DESCRIPTOR_LIST Mdl,
@ -480,7 +441,7 @@ Return Value:
} }
// //
// TODO: Implement the rest of this routine. // TODO: Finish this function.
// //
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -529,7 +490,7 @@ Return Value:
// //
// Free the descriptor from the heap. // Free the descriptor from the heap.
// TODO: Use BlMmFreeHeap(). // TODO: Use BlMmFreeHeap()
// //
ConsolePrint(L"MmMdFreeDescriptor(): need BlMmFreeHeap() to free descriptor\r\n"); ConsolePrint(L"MmMdFreeDescriptor(): need BlMmFreeHeap() to free descriptor\r\n");
return STATUS_NOT_IMPLEMENTED; return STATUS_NOT_IMPLEMENTED;
@ -604,7 +565,6 @@ Return Value:
PMEMORY_DESCRIPTOR Descriptor; PMEMORY_DESCRIPTOR Descriptor;
if (MmGlobalMemoryDescriptorsUsed >= MmGlobalMemoryDescriptorCount) { if (MmGlobalMemoryDescriptorsUsed >= MmGlobalMemoryDescriptorCount) {
DebugPrint(L"MmMdInitDescriptor(): No free descriptors available\r\n");
return NULL; return NULL;
} }