Author: ion Date: Mon Feb 6 03:14:14 2017 New Revision: 73722
URL: http://svn.reactos.org/svn/reactos?rev=73722&view=rev Log: [BOOTLIB]: Clarify that BlMemoryReserved == BlMemoryBelow1MB [BOOTLIB]: Implement EfiAllocatePages, EfiFreePages for Protected Mode. [BOOTLIB]: Fix a "Todo" in MmFwGetMemoryMap: We now free the EFI buffer used for the memory map itself, and unmap it from the memory map (which would show it as 'in-use' while we're dumping it).
Modified: trunk/reactos/boot/environ/app/bootmgr/bootmgr.c trunk/reactos/boot/environ/include/bl.h trunk/reactos/boot/environ/lib/firmware/efi/firmware.c trunk/reactos/boot/environ/lib/mm/descriptor.c trunk/reactos/boot/environ/lib/mm/mm.c trunk/reactos/boot/environ/lib/mm/pagealloc.c
Modified: trunk/reactos/boot/environ/app/bootmgr/bootmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/app/bootmgr/bo... ============================================================================== --- trunk/reactos/boot/environ/app/bootmgr/bootmgr.c [iso-8859-1] (original) +++ trunk/reactos/boot/environ/app/bootmgr/bootmgr.c [iso-8859-1] Mon Feb 6 03:14:14 2017 @@ -1035,11 +1035,11 @@ AddressRange.Maximum = 0xFFFFF; AddressRange.Minimum = 0;
- /* Allocate one reserved page with the "reserved" attribute */ + /* Allocate one reserved page with the "below 1MB" attribute */ Status = MmPapAllocatePhysicalPagesInRange(&PhysicalAddress, BlApplicationReserved, 1, - BlMemoryReserved, + BlMemoryBelow1MB, 0, &MmMdlUnmappedAllocated, &AddressRange,
Modified: trunk/reactos/boot/environ/include/bl.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/include/bl.h?r... ============================================================================== --- trunk/reactos/boot/environ/include/bl.h [iso-8859-1] (original) +++ trunk/reactos/boot/environ/include/bl.h [iso-8859-1] Mon Feb 6 03:14:14 2017 @@ -364,8 +364,8 @@ BlMemoryUnknown = 0x00010000, BlMemoryNonFixed = 0x00020000, BlMemoryFixed = 0x00040000, - BlMemoryReserved = 0x00080000, - BlMemoryValidAllocationAttributes = BlMemoryNonFixed | BlMemoryFixed | BlMemoryReserved | BlMemoryUnknown, + BlMemoryBelow1MB = 0x00080000, + BlMemoryValidAllocationAttributes = BlMemoryNonFixed | BlMemoryFixed | BlMemoryBelow1MB | BlMemoryUnknown, BlMemoryValidAllocationAttributeMask = 0x00FF0000,
// @@ -2006,6 +2006,13 @@ PBL_MEMORY_DESCRIPTOR MmMdFindDescriptor ( _In_ ULONG WhichList, + _In_ ULONG Flags, + _In_ ULONGLONG Page + ); + +PBL_MEMORY_DESCRIPTOR +MmMdFindDescriptorFromMdl ( + _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, _In_ ULONG Flags, _In_ ULONGLONG Page );
Modified: trunk/reactos/boot/environ/lib/firmware/efi/firmware.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/firmware/e... ============================================================================== --- trunk/reactos/boot/environ/lib/firmware/efi/firmware.c [iso-8859-1] (original) +++ trunk/reactos/boot/environ/lib/firmware/efi/firmware.c [iso-8859-1] Mon Feb 6 03:14:14 2017 @@ -617,8 +617,8 @@ OldMode = CurrentExecutionContext->Mode; if (OldMode != BlRealMode) { - /* FIXME: Not yet implemented */ - return STATUS_NOT_IMPLEMENTED; + /* Switch to real mode */ + BlpArchSwitchContext(BlProtectedMode); }
/* Make the EFI call */ @@ -1118,13 +1118,18 @@ { BL_ARCH_MODE OldMode; EFI_STATUS EfiStatus; + PHYSICAL_ADDRESS MemoryPhysical;
/* Are we in protected mode? */ OldMode = CurrentExecutionContext->Mode; if (OldMode != BlRealMode) { - /* FIXME: Not yet implemented */ - return STATUS_NOT_IMPLEMENTED; + /* Translate output address */ + BlMmTranslateVirtualAddress(Memory, &MemoryPhysical); + Memory = (EFI_PHYSICAL_ADDRESS*)MemoryPhysical.LowPart; + + /* Switch to real mode */ + BlpArchSwitchContext(BlProtectedMode); }
/* Make the EFI call */ @@ -1387,7 +1392,7 @@ BL_LIBRARY_PARAMETERS LibraryParameters = BlpLibraryParameters; BOOLEAN UseEfiBuffer, HaveRamDisk; NTSTATUS Status; - ULONGLONG Pages, StartPage, EndPage; + ULONGLONG Pages, StartPage, EndPage, EfiBufferPage; UINTN EfiMemoryMapSize, MapKey, DescriptorSize, DescriptorVersion; EFI_PHYSICAL_ADDRESS EfiBuffer = 0; EFI_MEMORY_DESCRIPTOR* EfiMemoryMap; @@ -1650,9 +1655,8 @@ /* Check if this region is currently free RAM */ if (Descriptor->Type == BlConventionalMemory) { - /* Set the reserved flag on the descriptor */ - EfiPrintf(L"Adding magic flag\r\n"); - Descriptor->Flags |= BlMemoryReserved; + /* Set the appropriate flag on the descriptor */ + Descriptor->Flags |= BlMemoryBelow1MB; }
/* Add this descriptor into the list */ @@ -1695,9 +1699,8 @@ /* Check if this region is currently free RAM below 1MB */ if ((Descriptor->Type == BlConventionalMemory) && (EndPage <= 0x100)) { - /* Set the reserved flag on the descriptor */ - EfiPrintf(L"Adding magic flag\r\n"); - Descriptor->Flags |= BlMemoryReserved; + /* Set the appropriate flag on the descriptor */ + Descriptor->Flags |= BlMemoryBelow1MB; }
/* Add the descriptor to the list, requesting coalescing as asked */ @@ -1718,8 +1721,66 @@ EfiMemoryMap = (PVOID)((ULONG_PTR)EfiMemoryMap + DescriptorSize); }
- /* FIXME: @TODO: Mark the EfiBuffer as free, since we're about to free it */ - /* For now, just "leak" the 1-2 pages... */ + /* Check if we are using the local UEFI buffer */ + if (!UseEfiBuffer) + { + goto Quickie; + } + + /* Free the EFI buffer */ + Status = EfiFreePages(Pages, EfiBuffer); + if (!NT_SUCCESS(Status)) + { + /* Keep the pages marked 'in use' and fake success */ + Status = STATUS_SUCCESS; + goto Quickie; + } + + /* Get the base page of the EFI buffer */ + EfiBufferPage = EfiBuffer >> PAGE_SHIFT; + Pages = (EfiBufferPage + Pages) - EfiBufferPage; + + /* Don't try freeing below */ + EfiBuffer = 0; + + /* Find the current descriptor for the allocation */ + Descriptor = MmMdFindDescriptorFromMdl(MemoryMap, + BL_MM_REMOVE_PHYSICAL_REGION_FLAG, + EfiBufferPage); + if (!Descriptor) + { + Status = STATUS_UNSUCCESSFUL; + goto Quickie; + } + + /* Convert it to a free descriptor */ + Descriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags, + BlConventionalMemory, + EfiBufferPage, + 0, + Pages); + if (!Descriptor) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Remove the region from the memory map */ + Status = MmMdRemoveRegionFromMdlEx(MemoryMap, + BL_MM_REMOVE_PHYSICAL_REGION_FLAG, + EfiBufferPage, + Pages, + NULL); + if (!NT_SUCCESS(Status)) + { + MmMdFreeDescriptor(Descriptor); + goto Quickie; + } + + /* Add it back as free memory */ + Status = MmMdAddDescriptorToList(MemoryMap, + Descriptor, + BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG);
Quickie: /* Free the EFI buffer, if we had one */
Modified: trunk/reactos/boot/environ/lib/mm/descriptor.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/mm/descrip... ============================================================================== --- trunk/reactos/boot/environ/lib/mm/descriptor.c [iso-8859-1] (original) +++ trunk/reactos/boot/environ/lib/mm/descriptor.c [iso-8859-1] Mon Feb 6 03:14:14 2017 @@ -1073,7 +1073,7 @@ }
/* Bail out if the allocation flags don't match */ - if (((Flags ^ Descriptor->Flags) & (BlMemoryRuntime | BlMemoryReserved | BlMemoryUnknown))) + if (((Flags ^ Descriptor->Flags) & (BlMemoryRuntime | BlMemoryBelow1MB | BlMemoryUnknown))) { //EfiPrintf(L"Incorrect memory allocation flags\r\n"); return FALSE;
Modified: trunk/reactos/boot/environ/lib/mm/mm.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/mm/mm.c?re... ============================================================================== --- trunk/reactos/boot/environ/lib/mm/mm.c [iso-8859-1] (original) +++ trunk/reactos/boot/environ/lib/mm/mm.c [iso-8859-1] Mon Feb 6 03:14:14 2017 @@ -348,7 +348,6 @@ LibraryParameters->MinimumAllocationCount); if (!NT_SUCCESS(Status)) { - EfiPrintf(L"PA Mm init failed: %lx\r\n", Status); goto Quickie; }
Modified: trunk/reactos/boot/environ/lib/mm/pagealloc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/mm/pageall... ============================================================================== --- trunk/reactos/boot/environ/lib/mm/pagealloc.c [iso-8859-1] (original) +++ trunk/reactos/boot/environ/lib/mm/pagealloc.c [iso-8859-1] Mon Feb 6 03:14:14 2017 @@ -543,7 +543,7 @@ { /* Remove this region from our free memory MDL */ Status = MmMdRemoveRegionFromMdlEx(&MmMdlUnmappedUnallocated, - 0x40000000, + BL_MM_REMOVE_PHYSICAL_REGION_FLAG, Descriptor->BasePage, Descriptor->PageCount, NULL);