Author: aandrejevic
Date: Mon Apr 20 14:02:18 2015
New Revision: 67325

URL: http://svn.reactos.org/svn/reactos?rev=67325&view=rev
Log:
[NTVDM]
Make the total amount of EMS pages configurable.
Allocate memory for EMS instead of sharing a part of the guest memory.


Modified:
    trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c
    trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.h
    trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.c
    trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.h

Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c?rev=67325&r1=67324&r2=67325&view=diff
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c    [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c    [iso-8859-1] 
Mon Apr 20 14:02:18 2015
@@ -666,7 +666,11 @@
     SearchAndInitRoms(&BiosContext);
 
     /* Initialize EMS */
-    EmsInitialize();
+    if (!EmsInitialize(EMS_TOTAL_PAGES))
+    {
+        DPRINT1("Could not initialize EMS. EMS will not be available.\n"
+                "Try reducing the number of EMS pages.\n");
+    }
 
     /*
      * End of the 32-bit POST portion. We then fall back into 16-bit where

Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.h?rev=67325&r1=67324&r2=67325&view=diff
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.h    [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.h    [iso-8859-1] 
Mon Apr 20 14:02:18 2015
@@ -21,6 +21,9 @@
 // #define BIOS_TIME_INTERRUPT         0x1A
 // #define BIOS_SYS_TIMER_INTERRUPT    0x1C
 
+/* 16 MB of EMS memory */
+#define EMS_TOTAL_PAGES 1024
+
 /* FUNCTIONS 
******************************************************************/
 
 BOOLEAN Bios32Initialize(VOID);

Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.c?rev=67325&r1=67324&r2=67325&view=diff
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.c       [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.c       [iso-8859-1] 
Mon Apr 20 14:02:18 2015
@@ -19,10 +19,12 @@
 /* PRIVATE VARIABLES 
**********************************************************/
 
 static RTL_BITMAP AllocBitmap;
-static ULONG BitmapBuffer[(EMS_TOTAL_PAGES + sizeof(ULONG) - 1) / 
sizeof(ULONG)];
-static EMS_PAGE PageTable[EMS_TOTAL_PAGES];
+static PULONG BitmapBuffer = NULL;
+static PEMS_PAGE PageTable = NULL;
 static EMS_HANDLE HandleTable[EMS_MAX_HANDLES];
 static PVOID Mapping[EMS_PHYSICAL_PAGES] = { NULL };
+static ULONG EmsTotalPages = 0;
+static PVOID EmsMemory = NULL;
 
 /* PRIVATE FUNCTIONS 
**********************************************************/
 
@@ -137,7 +139,8 @@
     PageEntry = GetLogicalPage(HandleEntry, LogicalPage);
     if (!PageEntry) return EMS_STATUS_INV_LOGICAL_PAGE; 
 
-    Mapping[PhysicalPage] = (PVOID)(EMS_ADDRESS + ARRAY_INDEX(PageEntry, 
PageTable) * EMS_PAGE_SIZE);
+    Mapping[PhysicalPage] = (PVOID)((ULONG_PTR)EmsMemory
+                            + ARRAY_INDEX(PageEntry, PageTable) * 
EMS_PAGE_SIZE);
     return EMS_STATUS_OK;
 }
 
@@ -165,7 +168,7 @@
         {
             setAH(EMS_STATUS_OK);
             setBX(RtlNumberOfClearBits(&AllocBitmap));
-            setDX(EMS_TOTAL_PAGES);
+            setDX(EmsTotalPages);
             break;
         }
 
@@ -230,10 +233,9 @@
                     break;
                 }
 
-                SourcePtr = (PUCHAR)REAL_TO_PHYS(EMS_ADDRESS
-                                                 + ARRAY_INDEX(PageEntry, 
PageTable)
-                                                 * EMS_PAGE_SIZE
-                                                 + Data->SourceOffset);
+                SourcePtr = (PUCHAR)((ULONG_PTR)EmsMemory
+                                     + ARRAY_INDEX(PageEntry, PageTable) * 
EMS_PAGE_SIZE
+                                     + Data->SourceOffset);
             }
             else
             {
@@ -260,10 +262,9 @@
                     break;
                 }
 
-                DestPtr = (PUCHAR)REAL_TO_PHYS(EMS_ADDRESS
-                                               + ARRAY_INDEX(PageEntry, 
PageTable)
-                                               * EMS_PAGE_SIZE
-                                               + Data->DestOffset);
+                DestPtr = (PUCHAR)((ULONG_PTR)EmsMemory
+                                   + ARRAY_INDEX(PageEntry, PageTable) * 
EMS_PAGE_SIZE
+                                   + Data->DestOffset);
             }
             else
             {
@@ -346,18 +347,45 @@
 
 /* PUBLIC FUNCTIONS 
***********************************************************/
 
-VOID EmsInitialize(VOID)
+BOOLEAN EmsInitialize(ULONG TotalPages)
 {
     ULONG i;
-
-    RtlZeroMemory(BitmapBuffer, sizeof(BitmapBuffer));
-    RtlInitializeBitMap(&AllocBitmap, BitmapBuffer, EMS_TOTAL_PAGES);
 
     for (i = 0; i < EMS_MAX_HANDLES; i++)
     {
         HandleTable[i].Allocated = FALSE;
         HandleTable[i].PageCount = 0;
         InitializeListHead(&HandleTable[i].PageList);
+    }
+
+    EmsTotalPages = TotalPages;
+    BitmapBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
+                                   HEAP_ZERO_MEMORY,
+                                   ((TotalPages + 31) / 32) * sizeof(ULONG));
+    if (BitmapBuffer == NULL) return FALSE;
+
+    RtlInitializeBitMap(&AllocBitmap, BitmapBuffer, TotalPages);
+
+    PageTable = (PEMS_PAGE)RtlAllocateHeap(RtlGetProcessHeap(),
+                                           HEAP_ZERO_MEMORY,
+                                           TotalPages * sizeof(EMS_PAGE));
+    if (PageTable == NULL)
+    {
+        RtlFreeHeap(RtlGetProcessHeap(), 0, BitmapBuffer);
+        BitmapBuffer = NULL;
+
+        return FALSE;
+    }
+
+    EmsMemory = (PVOID)RtlAllocateHeap(RtlGetProcessHeap(), 0, TotalPages * 
EMS_PAGE_SIZE);
+    if (EmsMemory == NULL)
+    {
+        RtlFreeHeap(RtlGetProcessHeap(), 0, PageTable);
+        PageTable = NULL;
+        RtlFreeHeap(RtlGetProcessHeap(), 0, BitmapBuffer);
+        BitmapBuffer = NULL;
+
+        return FALSE;
     }
 
     MemInstallFastMemoryHook((PVOID)TO_LINEAR(EMS_SEGMENT, 0),
@@ -366,10 +394,29 @@
                              EmsWriteMemory);
 
     RegisterBiosInt32(EMS_INTERRUPT_NUM, EmsIntHandler);
+    return TRUE;
 }
 
 VOID EmsCleanup(VOID)
 {
     MemRemoveFastMemoryHook((PVOID)TO_LINEAR(EMS_SEGMENT, 0),
                             EMS_PHYSICAL_PAGES * EMS_PAGE_SIZE);
-}
+
+    if (EmsMemory)
+    {
+        RtlFreeHeap(RtlGetProcessHeap(), 0, EmsMemory);
+        EmsMemory = NULL;
+    }
+
+    if (PageTable)
+    {
+        RtlFreeHeap(RtlGetProcessHeap(), 0, PageTable);
+        PageTable = NULL;
+    }
+
+    if (BitmapBuffer)
+    {
+        RtlFreeHeap(RtlGetProcessHeap(), 0, BitmapBuffer);
+        BitmapBuffer = NULL;
+    }
+}

Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.h?rev=67325&r1=67324&r2=67325&view=diff
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.h       [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/ems.h       [iso-8859-1] 
Mon Apr 20 14:02:18 2015
@@ -15,10 +15,8 @@
 #define EMS_INTERRUPT_NUM   0x67
 #define EMS_SEGMENT         0xD000
 #define EMS_MAX_HANDLES     16
-#define EMS_TOTAL_PAGES     256
 #define EMS_PAGE_BITS       14
 #define EMS_PAGE_SIZE       (1 << EMS_PAGE_BITS)
-#define EMS_ADDRESS         0xA00000
 #define EMS_PHYSICAL_PAGES  4
 
 #define EMS_STATUS_OK                   0x00
@@ -63,7 +61,7 @@
 
 /* FUNCTIONS 
******************************************************************/
 
-VOID EmsInitialize(VOID);
+BOOLEAN EmsInitialize(ULONG TotalPages);
 VOID EmsCleanup(VOID);
 
 #endif // _EMS_H_


Reply via email to