mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[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. svn path=/trunk/; revision=64701
This commit is contained in:
parent
634d194a5f
commit
ae24fd4e41
3 changed files with 27 additions and 13 deletions
|
@ -295,9 +295,18 @@ static VOID WINAPI BiosBootstrapLoader(LPWORD Stack)
|
|||
|
||||
/* 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");
|
||||
}
|
||||
|
|
|
@ -29,16 +29,6 @@ typedef struct _CALLBACK16
|
|||
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
|
||||
|
|
|
@ -19,6 +19,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;
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
|
Loading…
Reference in a new issue