From 6fb40574c2fad0cea01392ff75fbc15f422fffbc Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 19 Aug 2010 08:50:23 +0000 Subject: [PATCH] [NTOSKRNL] - Implement support for /BURNMEMORY option. - Don't stop boot on bad memory type Patch by Jay Smith, modified by Aleksey, even more modified by me. See issue #4957 for more details. svn path=/trunk/; revision=48565 --- reactos/ntoskrnl/ex/init.c | 52 +++++++++++++++++++++++++++---- reactos/ntoskrnl/mm/ARM3/mminit.c | 3 +- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index b44b58976b2..18dd8aa2b10 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -815,6 +815,51 @@ ExpLoadBootSymbols(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } } +VOID +NTAPI +ExBurnMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN ULONG PagesToDestroy, + IN TYPE_OF_MEMORY MemoryType) +{ + PLIST_ENTRY ListEntry; + PMEMORY_ALLOCATION_DESCRIPTOR MemDescriptor; + + DPRINT1("Burn RAM amount: %d pages\n", PagesToDestroy); + + /* Loop the memory descriptors, beginning at the end */ + for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Blink; + ListEntry != &LoaderBlock->MemoryDescriptorListHead; + ListEntry = ListEntry->Blink) + { + /* Get the memory descriptor structure */ + MemDescriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Is memory free there or is it temporary? */ + if (MemDescriptor->MemoryType == LoaderFree || + MemDescriptor->MemoryType == LoaderFirmwareTemporary) + { + /* Check if the descriptor has more pages than we want */ + if (MemDescriptor->PageCount > PagesToDestroy) + { + /* Change block's page count, ntoskrnl doesn't care much */ + MemDescriptor->PageCount -= PagesToDestroy; + break; + } + else + { + /* Change block type */ + MemDescriptor->MemoryType = MemoryType; + PagesToDestroy -= MemDescriptor->PageCount; + + /* Check if we are done */ + if (PagesToDestroy == 0) break; + } + } + } +} + VOID NTAPI ExpInitializeExecutive(IN ULONG Cpu, @@ -919,12 +964,7 @@ ExpInitializeExecutive(IN ULONG Cpu, { /* Read the number of pages we'll use */ PerfMemUsed = atol(PerfMem + 1) * (1024 * 1024 / PAGE_SIZE); - if (PerfMem) - { - /* FIXME: TODO */ - DPRINT1("Burnable memory support not yet present." - "/BURNMEM option ignored.\n"); - } + if (PerfMemUsed) ExBurnMemory(LoaderBlock, PerfMemUsed, LoaderBad); } } } diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 9f9f1b4c974..e7bb328d784 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -831,8 +831,7 @@ MiBuildPfnDatabaseFromLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Check for bad RAM */ case LoaderBad: - DPRINT1("You have damaged RAM modules. Stopping boot\n"); - while (TRUE); + DPRINT1("You either have specified /BURNMEMORY or damaged RAM modules.\n"); break; /* Check for free RAM */