Author: hbelusca
Date: Sun Oct 12 17:23:20 2014
New Revision: 64701
URL:
http://svn.reactos.org/svn/reactos?rev=64701&view=rev
Log:
[NTVDM]
- Move the stack frame indices to where they belong (this is the stack layout when an
interrupt is called).
- In the bootstrap interrupt, modify the CS:IP stored in the stack instead of the current
CS:IP of the CPU, so that we can clean up everything and the interrupt return correctly,
instead of breaking everything... (some apps wouldn't start with the original code^^).
This is an addendum/fix to revision 64521.
Modified:
trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c
trunk/reactos/subsystems/ntvdm/cpu/callback.h
trunk/reactos/subsystems/ntvdm/int32.h
Modified: trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/bios/bios…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c [iso-8859-1] Sun Oct 12 17:23:20
2014
@@ -295,9 +295,18 @@
/* Load DOS */
DosBootsectorInitialize();
- /* Position CPU to 0000:7C00 to boot the OS */
- setCS(0x0000);
- setIP(0x7C00);
+
+ /*
+ * Position CPU to 0000:7C00 to boot the OS.
+ *
+ * Since we are called via the INT32 mechanism, we need to correctly set
+ * CS:IP, not by changing the current one (otherwise the interrupt could
+ * not be clean up and return properly), but by changing the CS:IP in the
+ * stack, so that when the interrupt returns, the modified CS:IP is popped
+ * off the stack and the CPU is correctly repositioned.
+ */
+ Stack[STACK_CS] = 0x0000;
+ Stack[STACK_IP] = 0x7C00;
DPRINT1("<-- BiosBootstrapLoader\n");
}
Modified: trunk/reactos/subsystems/ntvdm/cpu/callback.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/cpu/callb…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/cpu/callback.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/ntvdm/cpu/callback.h [iso-8859-1] Sun Oct 12 17:23:20 2014
@@ -29,16 +29,6 @@
USHORT NextOffset;
} CALLBACK16, *PCALLBACK16;
-//
-// WARNING WARNING!!
-// If you're changing the indices here, you then need to
-// also fix the BOP code in callback.c !!!!!!!!!!!!!!!!!
-//
-#define STACK_INT_NUM 0
-#define STACK_IP 1
-#define STACK_CS 2
-#define STACK_FLAGS 3
-
/* FUNCTIONS ******************************************************************/
VOID
Modified: trunk/reactos/subsystems/ntvdm/int32.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/int32.h?r…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/int32.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/ntvdm/int32.h [iso-8859-1] Sun Oct 12 17:23:20 2014
@@ -18,6 +18,21 @@
/* 32-bit Interrupt Identifiers */
#define EMULATOR_MAX_INT32_NUM 0xFF + 1
+
+
+//
+// WARNING WARNING!!
+// If you're changing the stack indices here, you then need
+// to also fix the Int16To32 handler code in int32.c !!
+//
+
+// Custom variable pushed onto the stack for INT32 interrupts
+#define STACK_INT_NUM 0
+
+// This is the standard stack layout for an interrupt
+#define STACK_IP 1
+#define STACK_CS 2
+#define STACK_FLAGS 3
extern const ULONG Int16To32StubSize;