[NTVDM]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 14 Oct 2014 00:14:56 +0000 (00:14 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 14 Oct 2014 00:14:56 +0000 (00:14 +0000)
- Call CpuUnsimulate in EmulatorTerminate so that we really stop the CPU, before stopping the rest of the VM.
- We can reset CpuRunning to TRUE in CpuSimulate *only* if the VM is still running AND the CpuCallLevel is strictly positive (>=1 means, CPU halted or running; ==0 means, CPU stopped).

svn path=/trunk/; revision=64741

reactos/subsystems/ntvdm/cpu/cpu.c
reactos/subsystems/ntvdm/cpu/cpu.h
reactos/subsystems/ntvdm/emulator.c

index 662edfc..d9c3940 100644 (file)
@@ -37,9 +37,7 @@ BOOLEAN CpuRunning = FALSE;
 
 /* No more than 'MaxCpuCallLevel' recursive CPU calls are allowed */
 static const INT MaxCpuCallLevel = 32;
-static INT CpuCallLevel = 0;
-
-// BOOLEAN VdmRunning  = TRUE;
+static INT CpuCallLevel = 0; // == 0: CPU stopped; >= 1: CPU running or halted
 
 #if 0
 LPCWSTR ExceptionName[] =
@@ -131,10 +129,10 @@ VOID CpuSimulate(VOID)
 
     DPRINT("CpuSimulate <-- Level %d\n", CpuCallLevel);
     CpuCallLevel--;
-    if (CpuCallLevel < 0) CpuCallLevel = 0;
+    if (!VdmRunning || CpuCallLevel < 0) CpuCallLevel = 0;
 
     /* This takes into account for reentrance */
-    CpuRunning = TRUE;
+    if (VdmRunning && (CpuCallLevel > 0)) CpuRunning = TRUE;
 }
 
 VOID CpuUnsimulate(VOID)
@@ -148,14 +146,6 @@ static VOID WINAPI CpuUnsimulateBop(LPWORD Stack)
     CpuUnsimulate();
 }
 
-#if 0
-VOID EmulatorTerminate(VOID)
-{
-    /* Stop the VDM */
-    VdmRunning = FALSE;
-}
-#endif
-
 /* PUBLIC FUNCTIONS ***********************************************************/
 
 BOOLEAN CpuInitialize(VOID)
index fd51b49..d60d30d 100644 (file)
@@ -55,7 +55,6 @@ enum
 };
 #endif
 extern FAST486_STATE EmulatorContext;
-// extern BOOLEAN VdmRunning;
 
 /* FUNCTIONS ******************************************************************/
 
index 22eb25e..ac98ec6 100644 (file)
@@ -177,6 +177,7 @@ VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack)
 VOID EmulatorTerminate(VOID)
 {
     /* Stop the VDM */
+    CpuUnsimulate(); // Halt the CPU
     VdmRunning = FALSE;
 }