Initialize DoubleFault and NonMaskableInterrupt TSS entries
All checks were successful
ci/woodpecker/push/build Pipeline was successful
All checks were successful
ci/woodpecker/push/build Pipeline was successful
This commit is contained in:
parent
e2813bcdaa
commit
1ef205d47b
@ -20,3 +20,7 @@ KPROCESSOR_BLOCK ArInitialProcessorBlock;
|
|||||||
|
|
||||||
/* Initial TSS */
|
/* Initial TSS */
|
||||||
KTSS ArInitialTss;
|
KTSS ArInitialTss;
|
||||||
|
|
||||||
|
/* Double Fault and NMI task gates */
|
||||||
|
UCHAR ArpDoubleFaultTss[KTSS_IO_MAPS];
|
||||||
|
UCHAR ArpNonMaskableInterruptTss[KTSS_IO_MAPS];
|
||||||
|
@ -193,6 +193,62 @@ ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
|||||||
/* Set LDT and SS */
|
/* Set LDT and SS */
|
||||||
ProcessorBlock->TssBase->LDT = KGDT_R0_LDT;
|
ProcessorBlock->TssBase->LDT = KGDT_R0_LDT;
|
||||||
ProcessorBlock->TssBase->Ss0 = KGDT_R0_DATA;
|
ProcessorBlock->TssBase->Ss0 = KGDT_R0_DATA;
|
||||||
|
|
||||||
|
/* Initialize task gates for DoubleFault trap */
|
||||||
|
ArpSetDoubleFaultTssEntry(ProcessorBlock);
|
||||||
|
ArpSetNonMaskableInterruptTssEntry(ProcessorBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the DoubleFault TSS entry in the Global Descriptor Table.
|
||||||
|
*
|
||||||
|
* @param ProcessorBlock
|
||||||
|
* Supplies a pointer to the processor block to use.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||||
|
{
|
||||||
|
PKGDTENTRY TaskGateEntry, TssEntry;
|
||||||
|
PKTSS Tss;
|
||||||
|
|
||||||
|
/* Setup task gate for DoubleFault trap */
|
||||||
|
TaskGateEntry = (PKGDTENTRY)&ProcessorBlock->IdtBase[8];
|
||||||
|
TaskGateEntry->Bits.Dpl = 0;
|
||||||
|
TaskGateEntry->Bits.Present = 1;
|
||||||
|
TaskGateEntry->Bits.Type = I686_TASK_GATE;
|
||||||
|
((PKIDTENTRY)TaskGateEntry)->Selector = KGDT_DF_TSS;
|
||||||
|
|
||||||
|
/* Initialize DoubleFault TSS and set initial state */
|
||||||
|
Tss = (PKTSS)ArpDoubleFaultTss;
|
||||||
|
Tss->IoMapBase = sizeof(KTSS);
|
||||||
|
Tss->Flags = 0;
|
||||||
|
Tss->LDT = KGDT_R0_LDT;
|
||||||
|
Tss->CR3 = ArReadControlRegister(3);
|
||||||
|
Tss->Esp = KeInitializationBlock->KernelFaultStack;
|
||||||
|
Tss->Esp0 = KeInitializationBlock->KernelFaultStack;
|
||||||
|
Tss->Eip = PtrToUlong(ArpHandleTrap08);
|
||||||
|
Tss->Cs = KGDT_R0_CODE;
|
||||||
|
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||||
|
Tss->Es = KGDT_R3_DATA | RPL_MASK;
|
||||||
|
Tss->Fs = KGDT_R0_PCR;
|
||||||
|
Tss->Ss0 = KGDT_R0_DATA;
|
||||||
|
ArStoreSegment(SEGMENT_SS, (PVOID)&Tss->Ss);
|
||||||
|
|
||||||
|
/* Setup DoubleFault TSS entry in Global Descriptor Table */
|
||||||
|
TssEntry = (PKGDTENTRY)(&(ProcessorBlock->GdtBase[KGDT_DF_TSS / sizeof(KGDTENTRY)]));
|
||||||
|
TssEntry->BaseLow = ((ULONG_PTR)Tss & 0xFFFF);
|
||||||
|
TssEntry->Bytes.BaseMiddle = ((ULONG_PTR)Tss >> 16);
|
||||||
|
TssEntry->Bytes.BaseHigh = ((ULONG_PTR)Tss >> 24);
|
||||||
|
TssEntry->LimitLow = sizeof(KTSS) - 1;
|
||||||
|
TssEntry->Bits.LimitHigh = 0;
|
||||||
|
TssEntry->Bits.Dpl = 0;
|
||||||
|
TssEntry->Bits.Present = 1;
|
||||||
|
TssEntry->Bits.Type = I686_TSS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -270,3 +326,54 @@ ArpSetGdtEntry(IN PKGDTENTRY Gdt,
|
|||||||
GdtEntry->Bits.System = 0;
|
GdtEntry->Bits.System = 0;
|
||||||
GdtEntry->Bits.Type = (Type & 0x1F);
|
GdtEntry->Bits.Type = (Type & 0x1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the Non-Maskable Interrupt TSS entry in the Global Descriptor Table.
|
||||||
|
*
|
||||||
|
* @param ProcessorBlock
|
||||||
|
* Supplies a pointer to the processor block to use.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||||
|
{
|
||||||
|
PKGDTENTRY TaskGateEntry, TssEntry;
|
||||||
|
PKTSS Tss;
|
||||||
|
|
||||||
|
/* Setup task gate for NMI */
|
||||||
|
TaskGateEntry = (PKGDTENTRY)&ProcessorBlock->IdtBase[2];
|
||||||
|
TaskGateEntry->Bits.Dpl = 0;
|
||||||
|
TaskGateEntry->Bits.Present = 1;
|
||||||
|
TaskGateEntry->Bits.Type = I686_TASK_GATE;
|
||||||
|
((PKIDTENTRY)TaskGateEntry)->Selector = KGDT_NMI_TSS;
|
||||||
|
|
||||||
|
/* Initialize NMI TSS and set initial state */
|
||||||
|
Tss = (PKTSS)ArpNonMaskableInterruptTss;
|
||||||
|
Tss->IoMapBase = sizeof(KTSS);
|
||||||
|
Tss->Flags = 0;
|
||||||
|
Tss->LDT = KGDT_R0_LDT;
|
||||||
|
Tss->CR3 = ArReadControlRegister(3);
|
||||||
|
Tss->Esp = KeInitializationBlock->KernelFaultStack;
|
||||||
|
Tss->Esp0 = KeInitializationBlock->KernelFaultStack;
|
||||||
|
Tss->Eip = PtrToUlong(ArpHandleTrap02);
|
||||||
|
Tss->Cs = KGDT_R0_CODE;
|
||||||
|
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||||
|
Tss->Es = KGDT_R3_DATA | RPL_MASK;
|
||||||
|
Tss->Fs = KGDT_R0_PCR;
|
||||||
|
ArStoreSegment(SEGMENT_SS, (PVOID)&Tss->Ss);
|
||||||
|
|
||||||
|
/* Setup NMI TSS entry in Global Descriptor Table */
|
||||||
|
TssEntry = (PKGDTENTRY)(&(ProcessorBlock->GdtBase[KGDT_NMI_TSS / sizeof(KGDTENTRY)]));
|
||||||
|
TssEntry->BaseLow = ((ULONG_PTR)Tss & 0xFFFF);
|
||||||
|
TssEntry->Bytes.BaseMiddle = ((ULONG_PTR)Tss >> 16);
|
||||||
|
TssEntry->Bytes.BaseHigh = ((ULONG_PTR)Tss >> 24);
|
||||||
|
TssEntry->LimitLow = sizeof(KTSS) - 1;
|
||||||
|
TssEntry->Bits.LimitHigh = 0;
|
||||||
|
TssEntry->Bits.Dpl = 0;
|
||||||
|
TssEntry->Bits.Present = 1;
|
||||||
|
TssEntry->Bits.Type = I686_TSS;
|
||||||
|
}
|
@ -28,6 +28,10 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock);
|
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock);
|
||||||
|
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
ArpSetGdtEntry(IN PKGDTENTRY Gdt,
|
ArpSetGdtEntry(IN PKGDTENTRY Gdt,
|
||||||
@ -38,4 +42,8 @@ ArpSetGdtEntry(IN PKGDTENTRY Gdt,
|
|||||||
IN UCHAR Dpl,
|
IN UCHAR Dpl,
|
||||||
IN UCHAR SegmentMode);
|
IN UCHAR SegmentMode);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock);
|
||||||
|
|
||||||
#endif /* __XTOSKRNL_ARPFUNCS_H */
|
#endif /* __XTOSKRNL_ARPFUNCS_H */
|
||||||
|
@ -24,4 +24,8 @@ EXTERN KPROCESSOR_BLOCK ArInitialProcessorBlock;
|
|||||||
/* Initial TSS */
|
/* Initial TSS */
|
||||||
EXTERN KTSS ArInitialTss;
|
EXTERN KTSS ArInitialTss;
|
||||||
|
|
||||||
|
/* Double Fault and NMI task gates */
|
||||||
|
EXTERN UCHAR ArpDoubleFaultTss[KTSS_IO_MAPS];
|
||||||
|
EXTERN UCHAR ArpNonMaskableInterruptTss[KTSS_IO_MAPS];
|
||||||
|
|
||||||
#endif /* __XTOSKRNL_I686_GLOBALS_H */
|
#endif /* __XTOSKRNL_I686_GLOBALS_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user