- 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.
svn path=/trunk/; revision=64701
/* 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");
}
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
/* 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;
/* FUNCTIONS ******************************************************************/