[CMAKE]
[reactos.git] / ntoskrnl / ex / init.c
index 048d639..ee7cc3c 100644 (file)
 #include <debug.h>
 #include "ntstrsafe.h"
 
+/* Temporary hack */
+BOOLEAN
+NTAPI
+MmArmInitSystem(
+    IN ULONG Phase,
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
+
 typedef struct _INIT_BUFFER
 {
     WCHAR DebugBuffer[256];
@@ -79,6 +87,7 @@ BOOLEAN ExpRealTimeIsUniversal;
 
 NTSTATUS
 NTAPI
+INIT_FUNCTION
 ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
     UNICODE_STRING LinkName;
@@ -190,6 +199,7 @@ ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
 VOID
 NTAPI
+INIT_FUNCTION
 ExpInitNls(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
     LARGE_INTEGER SectionSize;
@@ -321,6 +331,7 @@ ExpInitNls(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     }
 
     /* Copy the codepage data in its new location. */
+    ASSERT(SectionBase > MmSystemRangeStart);
     RtlCopyMemory(SectionBase, ExpNlsTableBase, ExpNlsTableSize);
 
     /* Free the previously allocated buffer and set the new location */
@@ -364,6 +375,7 @@ ExpInitNls(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
 VOID
 NTAPI
+INIT_FUNCTION
 ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer,
                       OUT PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
                       OUT PCHAR *ProcessEnvironment)
@@ -584,6 +596,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer,
 
 ULONG
 NTAPI
+INIT_FUNCTION
 ExComputeTickCountMultiplier(IN ULONG ClockIncrement)
 {
     ULONG MsRemainder = 0, MsIncrement;
@@ -616,6 +629,7 @@ ExComputeTickCountMultiplier(IN ULONG ClockIncrement)
 
 BOOLEAN
 NTAPI
+INIT_FUNCTION
 ExpInitSystemPhase0(VOID)
 {
     /* Initialize EXRESOURCE Support */
@@ -638,6 +652,7 @@ ExpInitSystemPhase0(VOID)
 
 BOOLEAN
 NTAPI
+INIT_FUNCTION
 ExpInitSystemPhase1(VOID)
 {
     /* Initialize worker threads */
@@ -675,6 +690,7 @@ ExpInitSystemPhase1(VOID)
 
 BOOLEAN
 NTAPI
+INIT_FUNCTION
 ExInitSystem(VOID)
 {
     /* Check the initialization phase */
@@ -700,6 +716,7 @@ ExInitSystem(VOID)
 
 BOOLEAN
 NTAPI
+INIT_FUNCTION
 ExpIsLoaderValid(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
     PLOADER_PARAMETER_EXTENSION Extension;
@@ -725,6 +742,7 @@ ExpIsLoaderValid(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
 VOID
 NTAPI
+INIT_FUNCTION
 ExpLoadBootSymbols(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
     ULONG i = 0;
@@ -817,6 +835,53 @@ ExpLoadBootSymbols(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
 VOID
 NTAPI
+INIT_FUNCTION
+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
+INIT_FUNCTION
 ExpInitializeExecutive(IN ULONG Cpu,
                        IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
@@ -919,12 +984,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);
             }
         }
     }
@@ -1005,7 +1065,7 @@ ExpInitializeExecutive(IN ULONG Cpu,
     if (!ExInitSystem()) KeBugCheck(PHASE0_INITIALIZATION_FAILED);
 
     /* Initialize the memory manager at phase 0 */
-    if (!MmInitSystem(0, LoaderBlock)) KeBugCheck(PHASE0_INITIALIZATION_FAILED);
+    if (!MmArmInitSystem(0, LoaderBlock)) KeBugCheck(PHASE0_INITIALIZATION_FAILED);
 
     /* Load boot symbols */
     ExpLoadBootSymbols(LoaderBlock);
@@ -1232,6 +1292,7 @@ ExpInitializeExecutive(IN ULONG Cpu,
 
 VOID
 NTAPI
+INIT_FUNCTION
 Phase1InitializationDiscard(IN PVOID Context)
 {
     PLOADER_PARAMETER_BLOCK LoaderBlock = Context;
@@ -1537,7 +1598,7 @@ Phase1InitializationDiscard(IN PVOID Context)
     if (!MmInitSystem(1, LoaderBlock)) KeBugCheck(MEMORY1_INITIALIZATION_FAILED);
 
     /* Create NLS section */
-    ExpInitNls(KeLoaderBlock);
+    ExpInitNls(LoaderBlock);
 
     /* Initialize Cache Views */
     if (!CcInitializeCacheManager()) KeBugCheck(CACHE_INITIALIZATION_FAILED);
@@ -1822,8 +1883,8 @@ Phase1InitializationDiscard(IN PVOID Context)
         NtClose(OptionHandle);
     }
 
-    /* Unmap Low memory, and initialize the MPW and Balancer Thread */
-    MmInitSystem(2, LoaderBlock);
+    /* FIXME: This doesn't do anything for now */
+    MmArmInitSystem(2, LoaderBlock);
 
     /* Update progress bar */
     InbvUpdateProgressBar(80);
@@ -1850,6 +1911,7 @@ Phase1InitializationDiscard(IN PVOID Context)
     InbvUpdateProgressBar(90);
 
     /* Launch initial process */
+    DPRINT1("Free non-cache pages: %lx\n", MmAvailablePages + MiMemoryConsumers[MC_CACHE].PagesUsed);
     ProcessInfo = &InitBuffer->ProcessInfo;
     ExpLoadInitialProcess(InitBuffer, &ProcessParameters, &Environment);
 
@@ -1859,10 +1921,6 @@ Phase1InitializationDiscard(IN PVOID Context)
     /* Allow strings to be displayed */
     InbvEnableDisplayString(TRUE);
 
-    /* Enough fun for now */
-    extern BOOLEAN AllowPagedPool;
-    AllowPagedPool = FALSE;
-
     /* Wait 5 seconds for it to initialize */
     Timeout.QuadPart = Int32x32To64(5, -10000000);
     Status = ZwWaitForSingleObject(ProcessInfo->ProcessHandle, FALSE, &Timeout);
@@ -1900,6 +1958,7 @@ Phase1InitializationDiscard(IN PVOID Context)
 
     /* Free the boot buffer */
     ExFreePool(InitBuffer);
+    DPRINT1("Free non-cache pages: %lx\n", MmAvailablePages + MiMemoryConsumers[MC_CACHE].PagesUsed);
 }
 
 VOID
@@ -1910,5 +1969,5 @@ Phase1Initialization(IN PVOID Context)
     Phase1InitializationDiscard(Context);
 
     /* Jump into zero page thread */
-    MmZeroPageThreadMain(NULL);
+    MmZeroPageThread();
 }