Author: tkreuzer
Date: Thu Sep 22 07:52:51 2011
New Revision: 53801

URL: http://svn.reactos.org/svn/reactos?rev=53801&view=rev
Log:
[FREELDR]
- Move heap code out of mm.c into a seperate file mm/heap.c
- Move code from arcemul/mm.c into mm/mminit.c

Added:
    trunk/reactos/boot/freeldr/freeldr/mm/heap.c
      - copied, changed from r53800, trunk/reactos/boot/freeldr/freeldr/mm/mm.c
Removed:
    trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c
Modified:
    trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt
    trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild
    trunk/reactos/boot/freeldr/freeldr/mm/meminit.c
    trunk/reactos/boot/freeldr/freeldr/mm/mm.c

Modified: trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt?rev=53801&r1=53800&r2=53801&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] Thu Sep 22 
07:52:51 2011
@@ -33,7 +33,6 @@
     options.c
     oslist.c
     version.c
-    arcemul/mm.c
     arcemul/time.c
     cache/blocklist.c
     cache/cache.c
@@ -53,6 +52,7 @@
     inifile/parse.c
     mm/meminit.c
     mm/mm.c
+    mm/heap.c
     reactos/registry.c
     reactos/arcname.c
     reactos/archwsup.c

Removed: trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c?rev=53800&view=auto
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c (removed)
@@ -1,223 +1,0 @@
-/*
- * PROJECT:         ReactOS Boot Loader (FreeLDR)
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            boot/freeldr/freeldr/arcemul/mm.c
- * PURPOSE:         Routines for ARC Memory Management
- * PROGRAMMERS:     HervĂ© Poussineau  <[email protected]>
- */
-
-/* INCLUDES 
*******************************************************************/
-
-#include <freeldr.h>
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS 
******************************************************************/
-
-typedef struct
-{
-    MEMORY_DESCRIPTOR m;
-    ULONG Index;
-    BOOLEAN GeneratedDescriptor;
-} MEMORY_DESCRIPTOR_INT;
-static const MEMORY_DESCRIPTOR_INT MemoryDescriptors[] =
-{
-#if defined (__i386__) || defined (_M_AMD64)
-    { { MemoryFirmwarePermanent, 0x00, 1 }, 0, }, // realmode int vectors
-    { { MemoryFirmwareTemporary, 0x01, 7 }, 1, }, // freeldr stack + cmdline
-    { { MemoryLoadedProgram, 0x08, 0x70 }, 2, }, // freeldr image (roughly 
max. 0x64 pages)
-    { { MemorySpecialMemory, 0x78, 8 }, 3, }, // prot mode stack. 
BIOSCALLBUFFER
-    { { MemoryFirmwareTemporary, 0x80, 0x10 }, 4, }, // File system read 
buffer. FILESYSBUFFER
-    { { MemoryFirmwareTemporary, 0x90, 0x10 }, 5, }, // Disk read buffer for 
int 13h. DISKREADBUFFER
-    { { MemoryFirmwarePermanent, 0xA0, 0x60 }, 6, }, // ROM / Video
-    { { MemorySpecialMemory, 0xFFF, 1 }, 7, }, // unusable memory
-#elif __arm__ // This needs to be done per-platform specific way
-
-#endif
-};
-
-static
-VOID MmFixupSystemMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG* MapCount)
-{
-       int             Index;
-       int             Index2;
-       ULONGLONG BaseAddressOffset;
-
-       // Loop through each entry in the array
-       for (Index=0; Index<*MapCount; Index++)
-       {
-               // Correct all the addresses to be aligned on page boundaries
-               BaseAddressOffset = ROUND_UP(BiosMemoryMap[Index].BaseAddress, 
MM_PAGE_SIZE) - BiosMemoryMap[Index].BaseAddress;
-               BiosMemoryMap[Index].BaseAddress += BaseAddressOffset;
-               if (BiosMemoryMap[Index].Length < BaseAddressOffset)
-               {
-                       BiosMemoryMap[Index].Length = 0;
-               }
-               else
-               {
-                       BiosMemoryMap[Index].Length -= BaseAddressOffset;
-               }
-               BiosMemoryMap[Index].Length = 
ROUND_DOWN(BiosMemoryMap[Index].Length, MM_PAGE_SIZE);
-
-               // If the entry type isn't usable then remove
-               // it from the memory map (this will help reduce
-               // the size of our lookup table)
-               // If the length is less than a full page then
-               // get rid of it also.
-               if (BiosMemoryMap[Index].Type != BiosMemoryUsable ||
-                       BiosMemoryMap[Index].Length < MM_PAGE_SIZE)
-               {
-                       // Slide every entry after this down one
-                       for (Index2=Index; Index2<(*MapCount - 1); Index2++)
-                       {
-                               BiosMemoryMap[Index2] = BiosMemoryMap[Index2 + 
1];
-                       }
-                       (*MapCount)--;
-                       Index--;
-               }
-       }
-}
-
-const MEMORY_DESCRIPTOR*
-ArcGetMemoryDescriptor(const MEMORY_DESCRIPTOR* Current)
-{
-    MEMORY_DESCRIPTOR_INT* CurrentDescriptor;
-    BIOS_MEMORY_MAP BiosMemoryMap[32];
-    static ULONG BiosMemoryMapEntryCount;
-    static MEMORY_DESCRIPTOR_INT BiosMemoryDescriptors[32];
-    static BOOLEAN MemoryMapInitialized = FALSE;
-    ULONG i, j;
-
-    //
-    // Check if it is the first time we're called
-    //
-    if (!MemoryMapInitialized)
-    {
-        //
-        // Get the machine generated memory map
-        //
-        RtlZeroMemory(BiosMemoryMap, sizeof(BIOS_MEMORY_MAP) * 32);
-        BiosMemoryMapEntryCount = MachVtbl.GetMemoryMap(BiosMemoryMap,
-                                                        sizeof(BiosMemoryMap) /
-                                                        
sizeof(BIOS_MEMORY_MAP));
-
-        //
-        // Fix entries that are not page aligned
-        //
-        MmFixupSystemMemoryMap(BiosMemoryMap, &BiosMemoryMapEntryCount);
-
-        //
-        // Copy the entries to our structure
-        //
-        for (i = 0, j = 0; i < BiosMemoryMapEntryCount; i++)
-        {
-            //
-            // Is it suitable memory?
-            //
-            if (BiosMemoryMap[i].Type != BiosMemoryUsable)
-            {
-                //
-                // No. Process next descriptor
-                //
-                continue;
-            }
-
-            //
-            // Copy this memory descriptor
-            //
-            BiosMemoryDescriptors[j].m.MemoryType = MemoryFree;
-            BiosMemoryDescriptors[j].m.BasePage = 
(ULONG)(BiosMemoryMap[i].BaseAddress / MM_PAGE_SIZE);
-            BiosMemoryDescriptors[j].m.PageCount = 
(ULONG)(BiosMemoryMap[i].Length / MM_PAGE_SIZE);
-            BiosMemoryDescriptors[j].Index = j;
-            BiosMemoryDescriptors[j].GeneratedDescriptor = TRUE;
-            j++;
-        }
-
-        //
-        // Remember how much descriptors we found
-        //
-        BiosMemoryMapEntryCount = j;
-
-        //
-        // Mark memory map as already retrieved and initialized
-        //
-        MemoryMapInitialized = TRUE;
-    }
-
-    CurrentDescriptor = CONTAINING_RECORD(Current, MEMORY_DESCRIPTOR_INT, m);
-
-    if (Current == NULL)
-    {
-        //
-        // First descriptor requested
-        //
-        if (BiosMemoryMapEntryCount > 0)
-        {
-            //
-            // Return first generated memory descriptor
-            //
-            return &BiosMemoryDescriptors[0].m;
-        }
-        else if (sizeof(MemoryDescriptors) > 0)
-        {
-            //
-            // Return first fixed memory descriptor
-            //
-            return &MemoryDescriptors[0].m;
-        }
-        else
-        {
-            //
-            // Strange case, we have no memory descriptor
-            //
-            return NULL;
-        }
-    }
-    else if (CurrentDescriptor->GeneratedDescriptor)
-    {
-        //
-        // Current entry is a generated descriptor
-        //
-        if (CurrentDescriptor->Index + 1 < BiosMemoryMapEntryCount)
-        {
-            //
-            // Return next generated descriptor
-            //
-            return &BiosMemoryDescriptors[CurrentDescriptor->Index + 1].m;
-        }
-        else if (sizeof(MemoryDescriptors) > 0)
-        {
-            //
-            // Return first fixed memory descriptor
-            //
-            return &MemoryDescriptors[0].m;
-        }
-        else
-        {
-            //
-            // No fixed memory descriptor; end of memory map
-            //
-            return NULL;
-        }
-    }
-    else
-    {
-        //
-        // Current entry is a fixed descriptor
-        //
-        if (CurrentDescriptor->Index + 1 < sizeof(MemoryDescriptors) / 
sizeof(MemoryDescriptors[0]))
-        {
-            //
-            // Return next fixed descriptor
-            //
-            return &MemoryDescriptors[CurrentDescriptor->Index + 1].m;
-        }
-        else
-        {
-            //
-            // No more fixed memory descriptor; end of memory map
-            //
-            return NULL;
-        }
-    }
-}

Modified: trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild?rev=53801&r1=53800&r2=53801&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild [iso-8859-1] 
(original)
+++ trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild [iso-8859-1] Thu Sep 
22 07:52:51 2011
@@ -9,7 +9,6 @@
        <define name="_NTHAL_" />
        <define name="_NTSYSTEM_" />
        <directory name="arcemul">
-               <file>mm.c</file>
                <file>time.c</file>
        </directory>
        <directory name="cache">
@@ -41,6 +40,7 @@
                <file>parse.c</file>
        </directory>
        <directory name="mm">
+               <file>heap.c</file>
                <file>meminit.c</file>
                <file>mm.c</file>
        </directory>

Copied: trunk/reactos/boot/freeldr/freeldr/mm/heap.c (from r53800, 
trunk/reactos/boot/freeldr/freeldr/mm/mm.c)
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/mm/heap.c?p2=trunk/reactos/boot/freeldr/freeldr/mm/heap.c&p1=trunk/reactos/boot/freeldr/freeldr/mm/mm.c&r1=53800&r2=53801&rev=53801&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/mm/mm.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/mm/heap.c [iso-8859-1] Thu Sep 22 
07:52:51 2011
@@ -20,66 +20,30 @@
 #include <freeldr.h>
 #include <debug.h>
 
-#if DBG
-VOID           DumpMemoryAllocMap(VOID);
-VOID           MemAllocTest(VOID);
-#endif // DBG
-
 DBG_DEFAULT_CHANNEL(MEMORY);
 
-ULONG LoaderPagesSpanned = 0;
+VOID MmInitializeHeap(PVOID PageLookupTable)
+{
+       ULONG PagesNeeded = 0;
+       ULONG HeapStart = 0;
 
-PVOID MmAllocateMemoryWithType(ULONG MemorySize, TYPE_OF_MEMORY MemoryType)
-{
-       ULONG   PagesNeeded;
-       ULONG   FirstFreePageFromEnd;
-       PVOID   MemPointer;
+       // Find contigious memory block for HEAP:STACK
+       PagesNeeded = HEAP_PAGES + STACK_PAGES;
+       HeapStart = MmFindAvailablePages(PageLookupTable, 
TotalPagesInLookupTable, PagesNeeded, FALSE);
 
-       if (MemorySize == 0)
+       if (HeapStart == 0)
        {
-               WARN("MmAllocateMemory() called for 0 bytes. Returning 
NULL.\n");
-               UiMessageBoxCritical("Memory allocation failed: 
MmAllocateMemory() called for 0 bytes.");
-               return NULL;
+               UiMessageBox("Critical error: Can't allocate heap!");
+               return;
        }
 
-       MemorySize = ROUND_UP(MemorySize, 4);
+       // Initialize BGET
+       bpool(HeapStart << MM_PAGE_SHIFT, PagesNeeded << MM_PAGE_SHIFT);
 
-       // Find out how many blocks it will take to
-       // satisfy this allocation
-       PagesNeeded = ROUND_UP(MemorySize, MM_PAGE_SIZE) / MM_PAGE_SIZE;
+       // Mark those pages as used
+       MmMarkPagesInLookupTable(PageLookupTableAddress, HeapStart, 
PagesNeeded, LoaderOsloaderHeap);
 
-       // If we don't have enough available mem
-       // then return NULL
-       if (FreePagesInLookupTable < PagesNeeded)
-       {
-               ERR("Memory allocation failed in MmAllocateMemory(). Not enough 
free memory to allocate %d bytes.\n", MemorySize);
-               UiMessageBoxCritical("Memory allocation failed: out of 
memory.");
-               return NULL;
-       }
-
-       FirstFreePageFromEnd = MmFindAvailablePages(PageLookupTableAddress, 
TotalPagesInLookupTable, PagesNeeded, FALSE);
-
-       if (FirstFreePageFromEnd == 0)
-       {
-               ERR("Memory allocation failed in MmAllocateMemory(). Not enough 
free memory to allocate %d bytes.\n", MemorySize);
-               UiMessageBoxCritical("Memory allocation failed: out of 
memory.");
-               return NULL;
-       }
-
-       MmAllocatePagesInLookupTable(PageLookupTableAddress, 
FirstFreePageFromEnd, PagesNeeded, MemoryType);
-
-       FreePagesInLookupTable -= PagesNeeded;
-       MemPointer = (PVOID)((ULONG_PTR)FirstFreePageFromEnd * MM_PAGE_SIZE);
-
-       TRACE("Allocated %d bytes (%d pages) of memory starting at page %d.\n", 
MemorySize, PagesNeeded, FirstFreePageFromEnd);
-       TRACE("Memory allocation pointer: 0x%x\n", MemPointer);
-
-       // Update LoaderPagesSpanned count
-       if ((((ULONG_PTR)MemPointer + MemorySize + PAGE_SIZE - 1) >> 
PAGE_SHIFT) > LoaderPagesSpanned)
-               LoaderPagesSpanned = (((ULONG_PTR)MemPointer + MemorySize + 
PAGE_SIZE - 1) >> PAGE_SHIFT);
-
-       // Now return the pointer
-       return MemPointer;
+       TRACE("Heap initialized, base 0x%08x, pages %d\n", (HeapStart << 
MM_PAGE_SHIFT), PagesNeeded);
 }
 
 PVOID MmHeapAlloc(ULONG MemorySize)
@@ -118,232 +82,7 @@
        brel(MemoryPointer);
 }
 
-PVOID MmAllocateMemory(ULONG MemorySize)
-{
-       // Temporary forwarder...
-       return MmAllocateMemoryWithType(MemorySize, LoaderOsloaderHeap);
-}
 
-PVOID MmAllocateMemoryAtAddress(ULONG MemorySize, PVOID DesiredAddress, 
TYPE_OF_MEMORY MemoryType)
-{
-       ULONG           PagesNeeded;
-       ULONG           StartPageNumber;
-       PVOID   MemPointer;
-
-       if (MemorySize == 0)
-       {
-               WARN("MmAllocateMemoryAtAddress() called for 0 bytes. Returning 
NULL.\n");
-               UiMessageBoxCritical("Memory allocation failed: 
MmAllocateMemoryAtAddress() called for 0 bytes.");
-               return NULL;
-       }
-
-       // Find out how many blocks it will take to
-       // satisfy this allocation
-       PagesNeeded = ROUND_UP(MemorySize, MM_PAGE_SIZE) / MM_PAGE_SIZE;
-
-       // Get the starting page number
-       StartPageNumber = MmGetPageNumberFromAddress(DesiredAddress);
-
-       // If we don't have enough available mem
-       // then return NULL
-       if (FreePagesInLookupTable < PagesNeeded)
-       {
-               ERR("Memory allocation failed in MmAllocateMemoryAtAddress(). "
-                       "Not enough free memory to allocate %d bytes 
(requesting %d pages but have only %d). "
-                       "\n", MemorySize, PagesNeeded, FreePagesInLookupTable);
-               UiMessageBoxCritical("Memory allocation failed: out of 
memory.");
-               return NULL;
-       }
-
-       if (MmAreMemoryPagesAvailable(PageLookupTableAddress, 
TotalPagesInLookupTable, DesiredAddress, PagesNeeded) == FALSE)
-       {
-               WARN("Memory allocation failed in MmAllocateMemoryAtAddress(). "
-                        "Not enough free memory to allocate %d bytes at 
address %p.\n",
-             MemorySize, DesiredAddress);
-
-               // Don't tell this to user since caller should try to alloc 
this memory
-               // at a different address
-               //UiMessageBoxCritical("Memory allocation failed: out of 
memory.");
-               return NULL;
-       }
-
-       MmAllocatePagesInLookupTable(PageLookupTableAddress, StartPageNumber, 
PagesNeeded, MemoryType);
-
-       FreePagesInLookupTable -= PagesNeeded;
-       MemPointer = (PVOID)((ULONG_PTR)StartPageNumber * MM_PAGE_SIZE);
-
-       TRACE("Allocated %d bytes (%d pages) of memory starting at page %d.\n", 
MemorySize, PagesNeeded, StartPageNumber);
-       TRACE("Memory allocation pointer: 0x%x\n", MemPointer);
-
-       // Update LoaderPagesSpanned count
-       if ((((ULONG_PTR)MemPointer + MemorySize + PAGE_SIZE - 1) >> 
PAGE_SHIFT) > LoaderPagesSpanned)
-               LoaderPagesSpanned = (((ULONG_PTR)MemPointer + MemorySize + 
PAGE_SIZE - 1) >> PAGE_SHIFT);
-
-       // Now return the pointer
-       return MemPointer;
-}
-
-VOID MmSetMemoryType(PVOID MemoryAddress, ULONG MemorySize, TYPE_OF_MEMORY 
NewType)
-{
-       ULONG           PagesNeeded;
-       ULONG           StartPageNumber;
-
-       // Find out how many blocks it will take to
-       // satisfy this allocation
-       PagesNeeded = ROUND_UP(MemorySize, MM_PAGE_SIZE) / MM_PAGE_SIZE;
-
-       // Get the starting page number
-       StartPageNumber = MmGetPageNumberFromAddress(MemoryAddress);
-
-       // Set new type for these pages
-       MmAllocatePagesInLookupTable(PageLookupTableAddress, StartPageNumber, 
PagesNeeded, NewType);
-}
-
-PVOID MmAllocateHighestMemoryBelowAddress(ULONG MemorySize, PVOID 
DesiredAddress, TYPE_OF_MEMORY MemoryType)
-{
-       ULONG           PagesNeeded;
-       ULONG           FirstFreePageFromEnd;
-       ULONG           DesiredAddressPageNumber;
-       PVOID   MemPointer;
-
-       if (MemorySize == 0)
-       {
-               WARN("MmAllocateHighestMemoryBelowAddress() called for 0 bytes. 
Returning NULL.\n");
-               UiMessageBoxCritical("Memory allocation failed: 
MmAllocateHighestMemoryBelowAddress() called for 0 bytes.");
-               return NULL;
-       }
-
-       // Find out how many blocks it will take to
-       // satisfy this allocation
-       PagesNeeded = ROUND_UP(MemorySize, MM_PAGE_SIZE) / MM_PAGE_SIZE;
-
-       // Get the page number for their desired address
-       DesiredAddressPageNumber = (ULONG_PTR)DesiredAddress / MM_PAGE_SIZE;
-
-       // If we don't have enough available mem
-       // then return NULL
-       if (FreePagesInLookupTable < PagesNeeded)
-       {
-               ERR("Memory allocation failed in 
MmAllocateHighestMemoryBelowAddress(). Not enough free memory to allocate %d 
bytes.\n", MemorySize);
-               UiMessageBoxCritical("Memory allocation failed: out of 
memory.");
-               return NULL;
-       }
-
-       FirstFreePageFromEnd = 
MmFindAvailablePagesBeforePage(PageLookupTableAddress, TotalPagesInLookupTable, 
PagesNeeded, DesiredAddressPageNumber);
-
-       if (FirstFreePageFromEnd == 0)
-       {
-               ERR("Memory allocation failed in 
MmAllocateHighestMemoryBelowAddress(). Not enough free memory to allocate %d 
bytes.\n", MemorySize);
-               UiMessageBoxCritical("Memory allocation failed: out of 
memory.");
-               return NULL;
-       }
-
-       MmAllocatePagesInLookupTable(PageLookupTableAddress, 
FirstFreePageFromEnd, PagesNeeded, MemoryType);
-
-       FreePagesInLookupTable -= PagesNeeded;
-       MemPointer = (PVOID)((ULONG_PTR)FirstFreePageFromEnd * MM_PAGE_SIZE);
-
-       TRACE("Allocated %d bytes (%d pages) of memory starting at page %d.\n", 
MemorySize, PagesNeeded, FirstFreePageFromEnd);
-       TRACE("Memory allocation pointer: 0x%x\n", MemPointer);
-
-       // Update LoaderPagesSpanned count
-       if ((((ULONG_PTR)MemPointer + MemorySize) >> PAGE_SHIFT) > 
LoaderPagesSpanned)
-               LoaderPagesSpanned = (((ULONG_PTR)MemPointer + MemorySize) >> 
PAGE_SHIFT);
-
-       // Now return the pointer
-       return MemPointer;
-}
-
-VOID MmFreeMemory(PVOID MemoryPointer)
-{
-}
-
-#if DBG
-
-VOID DumpMemoryAllocMap(VOID)
-{
-       ULONG                                                   Idx;
-       PPAGE_LOOKUP_TABLE_ITEM         RealPageLookupTable = 
(PPAGE_LOOKUP_TABLE_ITEM)PageLookupTableAddress;
-
-       DbgPrint("----------- Memory Allocation Bitmap -----------\n");
-
-       for (Idx=0; Idx<TotalPagesInLookupTable; Idx++)
-       {
-               if ((Idx % 32) == 0)
-               {
-                       DbgPrint("\n");
-                       DbgPrint("%08x:\t", (Idx * MM_PAGE_SIZE));
-               }
-               else if ((Idx % 4) == 0)
-               {
-                       DbgPrint(" ");
-               }
-
-               switch (RealPageLookupTable[Idx].PageAllocated)
-               {
-               case LoaderFree:
-                       DbgPrint("*");
-                       break;
-               case LoaderBad:
-                       DbgPrint( "-");
-                       break;
-               case LoaderLoadedProgram:
-                       DbgPrint("O");
-                       break;
-               case LoaderFirmwareTemporary:
-                       DbgPrint("T");
-                       break;
-               case LoaderFirmwarePermanent:
-                       DbgPrint( "P");
-                       break;
-               case LoaderOsloaderHeap:
-                       DbgPrint("H");
-                       break;
-               case LoaderOsloaderStack:
-                       DbgPrint("S");
-                       break;
-               case LoaderSystemCode:
-                       DbgPrint("K");
-                       break;
-               case LoaderHalCode:
-                       DbgPrint("L");
-                       break;
-               case LoaderBootDriver:
-                       DbgPrint("B");
-                       break;
-               case LoaderStartupPcrPage:
-                       DbgPrint("G");
-                       break;
-               case LoaderRegistryData:
-                       DbgPrint("R");
-                       break;
-               case LoaderMemoryData:
-                       DbgPrint("M");
-                       break;
-               case LoaderNlsData:
-                       DbgPrint("N");
-                       break;
-               case LoaderSpecialMemory:
-                       DbgPrint("C");
-                       break;
-               default:
-                       DbgPrint("?");
-                       break;
-               }
-       }
-
-       DbgPrint("\n");
-}
-#endif // DBG
-
-PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(ULONG *NoEntries)
-{
-       PPAGE_LOOKUP_TABLE_ITEM         RealPageLookupTable = 
(PPAGE_LOOKUP_TABLE_ITEM)PageLookupTableAddress;
-
-       *NoEntries = TotalPagesInLookupTable;
-
-       return RealPageLookupTable;
-}
 
 #undef ExAllocatePoolWithTag
 NTKERNELAPI

Modified: trunk/reactos/boot/freeldr/freeldr/mm/meminit.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/mm/meminit.c?rev=53801&r1=53800&r2=53801&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/mm/meminit.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/mm/meminit.c [iso-8859-1] Thu Sep 22 
07:52:51 2011
@@ -56,6 +56,215 @@
 extern ULONG_PTR       MmHeapPointer;
 extern ULONG_PTR       MmHeapStart;
 
+typedef struct
+{
+    MEMORY_DESCRIPTOR m;
+    ULONG Index;
+    BOOLEAN GeneratedDescriptor;
+} MEMORY_DESCRIPTOR_INT;
+static const MEMORY_DESCRIPTOR_INT MemoryDescriptors[] =
+{
+#if defined (__i386__) || defined (_M_AMD64)
+    { { MemoryFirmwarePermanent, 0x00, 1 }, 0, }, // realmode int vectors
+    { { MemoryFirmwareTemporary, 0x01, 7 }, 1, }, // freeldr stack + cmdline
+    { { MemoryLoadedProgram, 0x08, 0x70 }, 2, }, // freeldr image (roughly 
max. 0x64 pages)
+    { { MemorySpecialMemory, 0x78, 8 }, 3, }, // prot mode stack. 
BIOSCALLBUFFER
+    { { MemoryFirmwareTemporary, 0x80, 0x10 }, 4, }, // File system read 
buffer. FILESYSBUFFER
+    { { MemoryFirmwareTemporary, 0x90, 0x10 }, 5, }, // Disk read buffer for 
int 13h. DISKREADBUFFER
+    { { MemoryFirmwarePermanent, 0xA0, 0x60 }, 6, }, // ROM / Video
+    { { MemorySpecialMemory, 0xFFF, 1 }, 7, }, // unusable memory
+#elif __arm__ // This needs to be done per-platform specific way
+
+#endif
+};
+
+static
+VOID MmFixupSystemMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG* MapCount)
+{
+       int             Index;
+       int             Index2;
+       ULONGLONG BaseAddressOffset;
+
+       // Loop through each entry in the array
+       for (Index=0; Index<*MapCount; Index++)
+       {
+               // Correct all the addresses to be aligned on page boundaries
+               BaseAddressOffset = ROUND_UP(BiosMemoryMap[Index].BaseAddress, 
MM_PAGE_SIZE) - BiosMemoryMap[Index].BaseAddress;
+               BiosMemoryMap[Index].BaseAddress += BaseAddressOffset;
+               if (BiosMemoryMap[Index].Length < BaseAddressOffset)
+               {
+                       BiosMemoryMap[Index].Length = 0;
+               }
+               else
+               {
+                       BiosMemoryMap[Index].Length -= BaseAddressOffset;
+               }
+               BiosMemoryMap[Index].Length = 
ROUND_DOWN(BiosMemoryMap[Index].Length, MM_PAGE_SIZE);
+
+               // If the entry type isn't usable then remove
+               // it from the memory map (this will help reduce
+               // the size of our lookup table)
+               // If the length is less than a full page then
+               // get rid of it also.
+               if (BiosMemoryMap[Index].Type != BiosMemoryUsable ||
+                       BiosMemoryMap[Index].Length < MM_PAGE_SIZE)
+               {
+                       // Slide every entry after this down one
+                       for (Index2=Index; Index2<(*MapCount - 1); Index2++)
+                       {
+                               BiosMemoryMap[Index2] = BiosMemoryMap[Index2 + 
1];
+                       }
+                       (*MapCount)--;
+                       Index--;
+               }
+       }
+}
+
+const MEMORY_DESCRIPTOR*
+ArcGetMemoryDescriptor(const MEMORY_DESCRIPTOR* Current)
+{
+    MEMORY_DESCRIPTOR_INT* CurrentDescriptor;
+    BIOS_MEMORY_MAP BiosMemoryMap[32];
+    static ULONG BiosMemoryMapEntryCount;
+    static MEMORY_DESCRIPTOR_INT BiosMemoryDescriptors[32];
+    static BOOLEAN MemoryMapInitialized = FALSE;
+    ULONG i, j;
+
+    //
+    // Check if it is the first time we're called
+    //
+    if (!MemoryMapInitialized)
+    {
+        //
+        // Get the machine generated memory map
+        //
+        RtlZeroMemory(BiosMemoryMap, sizeof(BIOS_MEMORY_MAP) * 32);
+        BiosMemoryMapEntryCount = MachVtbl.GetMemoryMap(BiosMemoryMap,
+                                                        sizeof(BiosMemoryMap) /
+                                                        
sizeof(BIOS_MEMORY_MAP));
+
+        //
+        // Fix entries that are not page aligned
+        //
+        MmFixupSystemMemoryMap(BiosMemoryMap, &BiosMemoryMapEntryCount);
+
+        //
+        // Copy the entries to our structure
+        //
+        for (i = 0, j = 0; i < BiosMemoryMapEntryCount; i++)
+        {
+            //
+            // Is it suitable memory?
+            //
+            if (BiosMemoryMap[i].Type != BiosMemoryUsable)
+            {
+                //
+                // No. Process next descriptor
+                //
+                continue;
+            }
+
+            //
+            // Copy this memory descriptor
+            //
+            BiosMemoryDescriptors[j].m.MemoryType = MemoryFree;
+            BiosMemoryDescriptors[j].m.BasePage = 
(ULONG)(BiosMemoryMap[i].BaseAddress / MM_PAGE_SIZE);
+            BiosMemoryDescriptors[j].m.PageCount = 
(ULONG)(BiosMemoryMap[i].Length / MM_PAGE_SIZE);
+            BiosMemoryDescriptors[j].Index = j;
+            BiosMemoryDescriptors[j].GeneratedDescriptor = TRUE;
+            j++;
+        }
+
+        //
+        // Remember how much descriptors we found
+        //
+        BiosMemoryMapEntryCount = j;
+
+        //
+        // Mark memory map as already retrieved and initialized
+        //
+        MemoryMapInitialized = TRUE;
+    }
+
+    CurrentDescriptor = CONTAINING_RECORD(Current, MEMORY_DESCRIPTOR_INT, m);
+
+    if (Current == NULL)
+    {
+        //
+        // First descriptor requested
+        //
+        if (BiosMemoryMapEntryCount > 0)
+        {
+            //
+            // Return first generated memory descriptor
+            //
+            return &BiosMemoryDescriptors[0].m;
+        }
+        else if (sizeof(MemoryDescriptors) > 0)
+        {
+            //
+            // Return first fixed memory descriptor
+            //
+            return &MemoryDescriptors[0].m;
+        }
+        else
+        {
+            //
+            // Strange case, we have no memory descriptor
+            //
+            return NULL;
+        }
+    }
+    else if (CurrentDescriptor->GeneratedDescriptor)
+    {
+        //
+        // Current entry is a generated descriptor
+        //
+        if (CurrentDescriptor->Index + 1 < BiosMemoryMapEntryCount)
+        {
+            //
+            // Return next generated descriptor
+            //
+            return &BiosMemoryDescriptors[CurrentDescriptor->Index + 1].m;
+        }
+        else if (sizeof(MemoryDescriptors) > 0)
+        {
+            //
+            // Return first fixed memory descriptor
+            //
+            return &MemoryDescriptors[0].m;
+        }
+        else
+        {
+            //
+            // No fixed memory descriptor; end of memory map
+            //
+            return NULL;
+        }
+    }
+    else
+    {
+        //
+        // Current entry is a fixed descriptor
+        //
+        if (CurrentDescriptor->Index + 1 < sizeof(MemoryDescriptors) / 
sizeof(MemoryDescriptors[0]))
+        {
+            //
+            // Return next fixed descriptor
+            //
+            return &MemoryDescriptors[CurrentDescriptor->Index + 1].m;
+        }
+        else
+        {
+            //
+            // No more fixed memory descriptor; end of memory map
+            //
+            return NULL;
+        }
+    }
+}
+
+
 BOOLEAN MmInitializeMemoryManager(VOID)
 {
 #if DBG
@@ -102,40 +311,6 @@
        return TRUE;
 }
 
-VOID MmInitializeHeap(PVOID PageLookupTable)
-{
-       ULONG PagesNeeded;
-       ULONG HeapStart;
-#ifndef _M_ARM
-       MEMORY_TYPE Type;
-       PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = 
(PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable;
-       
-       // HACK: Make it so it doesn't overlap kernel space
-       Type = RealPageLookupTable[0x100].PageAllocated;
-       MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, 
LoaderSystemCode);
-#endif
-       // Find contigious memory block for HEAP:STACK
-       PagesNeeded = HEAP_PAGES + STACK_PAGES;
-       HeapStart = MmFindAvailablePages(PageLookupTable, 
TotalPagesInLookupTable, PagesNeeded, FALSE);
-#ifndef _M_ARM
-       // Unapply the hack
-       MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, Type);
-#endif
-       if (HeapStart == 0)
-       {
-               UiMessageBox("Critical error: Can't allocate heap!");
-               return;
-       }
-
-       // Initialize BGET
-       bpool(HeapStart << MM_PAGE_SHIFT, PagesNeeded << MM_PAGE_SHIFT);
-
-       // Mark those pages as used
-       MmMarkPagesInLookupTable(PageLookupTableAddress, HeapStart, 
PagesNeeded, LoaderOsloaderHeap);
-
-       TRACE("Heap initialized, base 0x%08x, pages %d\n", (HeapStart << 
MM_PAGE_SHIFT), PagesNeeded);
-}
-
 #if DBG
 PCSTR MmGetSystemMemoryMapTypeString(MEMORY_TYPE Type)
 {
@@ -178,7 +353,7 @@
             //
             if (MemoryDescriptor->MemoryType == MemoryFree) 
MmHighestPhysicalPage = MemoryDescriptor->BasePage + 
MemoryDescriptor->PageCount;
         }
-        
+
         //
         // Check if we got a higher (usable) start page address
         //
@@ -190,7 +365,7 @@
             if (MemoryDescriptor->MemoryType == MemoryFree) 
MmLowestPhysicalPage = MemoryDescriptor->BasePage;
         }
     }
-    
+
     TRACE("lo/hi %lx %lxn", MmLowestPhysicalPage, MmHighestPhysicalPage);
     PageCount = MmHighestPhysicalPage - MmLowestPhysicalPage;
     TRACE("MmGetAddressablePageCountIncludingHoles() returning 0x%x\n", 
PageCount);

Modified: trunk/reactos/boot/freeldr/freeldr/mm/mm.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/mm/mm.c?rev=53801&r1=53800&r2=53801&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/mm/mm.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/mm/mm.c [iso-8859-1] Thu Sep 22 07:52:51 
2011
@@ -82,42 +82,6 @@
        return MemPointer;
 }
 
-PVOID MmHeapAlloc(ULONG MemorySize)
-{
-       PVOID Result;
-
-       if (MemorySize > MM_PAGE_SIZE)
-       {
-               WARN("Consider using other functions to allocate %d bytes of 
memory!\n", MemorySize);
-       }
-
-       // Get the buffer from BGET pool
-       Result = bget(MemorySize);
-
-       if (Result == NULL)
-       {
-               ERR("Heap allocation for %d bytes failed\n", MemorySize);
-       }
-#if MM_DBG
-    {
-       LONG CurAlloc, TotalFree, MaxFree, NumberOfGets, NumberOfRels;
-
-           // Gather some stats
-           bstats(&CurAlloc, &TotalFree, &MaxFree, &NumberOfGets, 
&NumberOfRels);
-
-           TRACE("Current alloced %d bytes, free %d bytes, allocs %d, frees 
%d\n",
-                   CurAlloc, TotalFree, NumberOfGets, NumberOfRels);
-       }
-#endif
-       return Result;
-}
-
-VOID MmHeapFree(PVOID MemoryPointer)
-{
-       // Release the buffer to the pool
-       brel(MemoryPointer);
-}
-
 PVOID MmAllocateMemory(ULONG MemorySize)
 {
        // Temporary forwarder...
@@ -345,64 +309,3 @@
        return RealPageLookupTable;
 }
 
-#undef ExAllocatePoolWithTag
-NTKERNELAPI
-PVOID
-NTAPI
-ExAllocatePoolWithTag(
-    IN POOL_TYPE PoolType,
-    IN SIZE_T NumberOfBytes,
-    IN ULONG Tag)
-{
-    return MmHeapAlloc(NumberOfBytes);
-}
-
-#undef ExFreePool
-NTKERNELAPI
-VOID
-NTAPI
-ExFreePool(
-    IN PVOID P)
-{
-    MmHeapFree(P);
-}
-
-#undef ExFreePoolWithTag
-NTKERNELAPI
-VOID
-NTAPI
-ExFreePoolWithTag(
-  IN PVOID P,
-  IN ULONG Tag)
-{
-    ExFreePool(P);
-}
-
-PVOID
-NTAPI
-RtlAllocateHeap(
-    IN PVOID HeapHandle,
-    IN ULONG Flags,
-    IN SIZE_T Size)
-{
-    PVOID ptr;
-
-    ptr = MmHeapAlloc(Size);
-    if (ptr && (Flags & HEAP_ZERO_MEMORY))
-    {
-        RtlZeroMemory(ptr, Size);
-    }
-
-    return ptr;
-}
-
-BOOLEAN
-NTAPI
-RtlFreeHeap(
-    IN PVOID HeapHandle,
-    IN ULONG Flags,
-    IN PVOID HeapBase)
-{
-    MmHeapFree(HeapBase);
-    return TRUE;
-}


Reply via email to