- 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:
Hermès Bélusca-Maïto 2014-10-12 17:23:20 +00:00
parent 634d194a5f
commit ae24fd4e41
3 changed files with 27 additions and 13 deletions

View file

@ -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");
}

View file

@ -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

View file

@ -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 ******************************************************************/