mirror of
https://github.com/reactos/reactos.git
synced 2024-07-12 15:45:20 +00:00
[NTVDM]
Since the BIOS registers the whole range of possible interrupts, we register their stubs in an array-form so that the BIOS always registers INT n at the same place. We save 561 bytes of memory. svn path=/trunk/; revision=63366
This commit is contained in:
parent
65a58c440e
commit
de36490031
|
@ -301,18 +301,14 @@ static VOID BiosHwSetup(VOID)
|
||||||
static VOID InitializeBiosInt32(VOID)
|
static VOID InitializeBiosInt32(VOID)
|
||||||
{
|
{
|
||||||
USHORT i;
|
USHORT i;
|
||||||
// USHORT Offset = 0;
|
|
||||||
|
|
||||||
/* Initialize the callback context */
|
/* Initialize the callback context */
|
||||||
InitializeContext(&BiosContext, BIOS_SEGMENT, 0x0000);
|
InitializeContext(&BiosContext, BIOS_SEGMENT, 0x0000);
|
||||||
|
|
||||||
/* Register the BIOS 32-bit Interrupts */
|
/* Register the default BIOS 32-bit Interrupts */
|
||||||
for (i = 0x00; i <= 0xFF; i++)
|
for (i = 0x00; i <= 0xFF; i++)
|
||||||
{
|
{
|
||||||
// Offset += RegisterInt32(MAKELONG(Offset, BIOS_SEGMENT), i, NULL, NULL);
|
RegisterBiosInt32(i, NULL);
|
||||||
BiosContext.NextOffset += RegisterInt32(MAKELONG(BiosContext.NextOffset,
|
|
||||||
BiosContext.Segment),
|
|
||||||
i, NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the exception vector interrupts to a default Exception handler */
|
/* Initialize the exception vector interrupts to a default Exception handler */
|
||||||
|
|
|
@ -30,11 +30,12 @@
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
||||||
extern CALLBACK16 BiosContext;
|
extern CALLBACK16 BiosContext;
|
||||||
#define RegisterBiosInt32(IntNumber, IntHandler) \
|
#define RegisterBiosInt32(IntNumber, IntHandler) \
|
||||||
do { \
|
do { \
|
||||||
BiosContext.NextOffset += RegisterInt32(MAKELONG(BiosContext.NextOffset, \
|
RegisterInt32(BiosContext.TrampolineFarPtr + \
|
||||||
BiosContext.Segment), \
|
BiosContext.TrampolineSize + \
|
||||||
(IntNumber), (IntHandler), NULL); \
|
(IntNumber) * Int16To32StubSize, \
|
||||||
|
(IntNumber), (IntHandler), NULL); \
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
VOID EnableHwIRQ(UCHAR hwirq, EMULATOR_INT32_PROC func);
|
VOID EnableHwIRQ(UCHAR hwirq, EMULATOR_INT32_PROC func);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
/*
|
/*
|
||||||
* This is the list of registered BOP handlers.
|
* This is the list of registered BOP handlers.
|
||||||
*/
|
*/
|
||||||
EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM] = { NULL };
|
static EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM] = { NULL };
|
||||||
|
|
||||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
/*
|
/*
|
||||||
* This is the list of registered 32-bit Interrupt handlers.
|
* This is the list of registered 32-bit Interrupt handlers.
|
||||||
*/
|
*/
|
||||||
EMULATOR_INT32_PROC Int32Proc[EMULATOR_MAX_INT32_NUM] = { NULL };
|
static EMULATOR_INT32_PROC Int32Proc[EMULATOR_MAX_INT32_NUM] = { NULL };
|
||||||
|
|
||||||
/* BOP Identifiers */
|
/* BOP Identifiers */
|
||||||
#define BOP_CONTROL 0xFF // Control BOP Handler
|
#define BOP_CONTROL 0xFF // Control BOP Handler
|
||||||
|
@ -50,7 +50,7 @@ do { \
|
||||||
//
|
//
|
||||||
|
|
||||||
/* 16-bit generic interrupt code for calling a 32-bit interrupt handler */
|
/* 16-bit generic interrupt code for calling a 32-bit interrupt handler */
|
||||||
BYTE Int16To32[] =
|
static BYTE Int16To32[] =
|
||||||
{
|
{
|
||||||
0xFA, // cli
|
0xFA, // cli
|
||||||
|
|
||||||
|
@ -76,6 +76,7 @@ BYTE Int16To32[] =
|
||||||
0x44, 0x44, // inc sp, inc sp
|
0x44, 0x44, // inc sp, inc sp
|
||||||
0xCF, // iret
|
0xCF, // iret
|
||||||
};
|
};
|
||||||
|
const ULONG Int16To32StubSize = sizeof(Int16To32);
|
||||||
|
|
||||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||||
|
|
||||||
|
@ -85,9 +86,10 @@ InitializeContext(IN PCALLBACK16 Context,
|
||||||
IN USHORT Offset)
|
IN USHORT Offset)
|
||||||
{
|
{
|
||||||
Context->TrampolineFarPtr = MAKELONG(Offset, Segment);
|
Context->TrampolineFarPtr = MAKELONG(Offset, Segment);
|
||||||
|
Context->TrampolineSize = max(CALL16_TRAMPOLINE_SIZE,
|
||||||
|
INT16_TRAMPOLINE_SIZE);
|
||||||
Context->Segment = Segment;
|
Context->Segment = Segment;
|
||||||
Context->NextOffset = Offset + max(CALL16_TRAMPOLINE_SIZE,
|
Context->NextOffset = Offset + Context->TrampolineSize;
|
||||||
INT16_TRAMPOLINE_SIZE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
|
@ -15,17 +15,15 @@
|
||||||
/* 32-bit Interrupt Identifiers */
|
/* 32-bit Interrupt Identifiers */
|
||||||
#define EMULATOR_MAX_INT32_NUM 0xFF + 1
|
#define EMULATOR_MAX_INT32_NUM 0xFF + 1
|
||||||
|
|
||||||
#define INT_HANDLER_OFFSET 0x1000
|
|
||||||
#define COMMON_STUB_OFFSET 0x2000
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _CALLBACK16
|
typedef struct _CALLBACK16
|
||||||
{
|
{
|
||||||
ULONG TrampolineFarPtr; // Where the trampoline zone is placed
|
ULONG TrampolineFarPtr; // Where the trampoline zone is placed
|
||||||
|
ULONG TrampolineSize; // Size of the trampoline zone
|
||||||
USHORT Segment;
|
USHORT Segment;
|
||||||
USHORT NextOffset;
|
USHORT NextOffset;
|
||||||
} CALLBACK16, *PCALLBACK16;
|
} CALLBACK16, *PCALLBACK16;
|
||||||
|
|
||||||
|
extern const ULONG Int16To32StubSize;
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue