Use dedicated NMI stack on i686
This commit is contained in:
@@ -130,7 +130,7 @@
|
|||||||
|
|
||||||
/* XTOS Kernel stack size */
|
/* XTOS Kernel stack size */
|
||||||
#define KERNEL_STACK_SIZE 0x4000
|
#define KERNEL_STACK_SIZE 0x4000
|
||||||
#define KERNEL_STACKS 2
|
#define KERNEL_STACKS 3
|
||||||
|
|
||||||
/* XTOS Kernel stack guard pages */
|
/* XTOS Kernel stack guard pages */
|
||||||
#define KERNEL_STACK_GUARD_PAGES 1
|
#define KERNEL_STACK_GUARD_PAGES 1
|
||||||
|
|||||||
@@ -30,5 +30,8 @@ KPROCESSOR_BLOCK AR::ProcSup::InitialProcessorBlock;
|
|||||||
/* Initial TSS */
|
/* Initial TSS */
|
||||||
KTSS AR::ProcSup::InitialTss;
|
KTSS AR::ProcSup::InitialTss;
|
||||||
|
|
||||||
|
/* Initial kernel NMI stack */
|
||||||
|
UCHAR AR::ProcSup::NmiStack[KERNEL_STACK_SIZE] = {};
|
||||||
|
|
||||||
/* NMI task gate */
|
/* NMI task gate */
|
||||||
UCHAR AR::ProcSup::NonMaskableInterruptTss[KTSS_IO_MAPS];
|
UCHAR AR::ProcSup::NonMaskableInterruptTss[KTSS_IO_MAPS];
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ VOID
|
|||||||
AR::ProcSup::InitializeProcessor(IN PVOID ProcessorStructures)
|
AR::ProcSup::InitializeProcessor(IN PVOID ProcessorStructures)
|
||||||
{
|
{
|
||||||
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
||||||
PVOID KernelBootStack, KernelFaultStack;
|
PVOID KernelBootStack, KernelFaultStack, KernelNmiStack;
|
||||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||||
PKGDTENTRY Gdt;
|
PKGDTENTRY Gdt;
|
||||||
PKIDTENTRY Idt;
|
PKIDTENTRY Idt;
|
||||||
@@ -143,7 +143,7 @@ AR::ProcSup::InitializeProcessor(IN PVOID ProcessorStructures)
|
|||||||
{
|
{
|
||||||
/* Assign CPU structures from provided buffer */
|
/* Assign CPU structures from provided buffer */
|
||||||
InitializeProcessorStructures(ProcessorStructures, &Gdt, &Tss, &ProcessorBlock,
|
InitializeProcessorStructures(ProcessorStructures, &Gdt, &Tss, &ProcessorBlock,
|
||||||
&KernelBootStack, &KernelFaultStack);
|
&KernelBootStack, &KernelFaultStack, &KernelNmiStack);
|
||||||
|
|
||||||
/* Use global IDT */
|
/* Use global IDT */
|
||||||
Idt = InitialIdt;
|
Idt = InitialIdt;
|
||||||
@@ -156,6 +156,7 @@ AR::ProcSup::InitializeProcessor(IN PVOID ProcessorStructures)
|
|||||||
Tss = &InitialTss;
|
Tss = &InitialTss;
|
||||||
KernelBootStack = &BootStack;
|
KernelBootStack = &BootStack;
|
||||||
KernelFaultStack = &FaultStack;
|
KernelFaultStack = &FaultStack;
|
||||||
|
KernelNmiStack = &NmiStack;
|
||||||
ProcessorBlock = &InitialProcessorBlock;
|
ProcessorBlock = &InitialProcessorBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +166,7 @@ AR::ProcSup::InitializeProcessor(IN PVOID ProcessorStructures)
|
|||||||
/* Initialize GDT, IDT and TSS */
|
/* Initialize GDT, IDT and TSS */
|
||||||
InitializeGdt(ProcessorBlock);
|
InitializeGdt(ProcessorBlock);
|
||||||
InitializeIdt(ProcessorBlock);
|
InitializeIdt(ProcessorBlock);
|
||||||
InitializeTss(ProcessorBlock, KernelBootStack, KernelFaultStack);
|
InitializeTss(ProcessorBlock, KernelBootStack, KernelFaultStack, KernelNmiStack);
|
||||||
|
|
||||||
/* Set GDT and IDT descriptors */
|
/* Set GDT and IDT descriptors */
|
||||||
GdtDescriptor.Base = Gdt;
|
GdtDescriptor.Base = Gdt;
|
||||||
@@ -381,7 +382,8 @@ AR::ProcSup::InitializeProcessorStructures(IN PVOID ProcessorStructures,
|
|||||||
OUT PKTSS *Tss,
|
OUT PKTSS *Tss,
|
||||||
OUT PKPROCESSOR_BLOCK *ProcessorBlock,
|
OUT PKPROCESSOR_BLOCK *ProcessorBlock,
|
||||||
OUT PVOID *KernelBootStack,
|
OUT PVOID *KernelBootStack,
|
||||||
OUT PVOID *KernelFaultStack)
|
OUT PVOID *KernelFaultStack,
|
||||||
|
OUT PVOID *KernelNmiStack)
|
||||||
{
|
{
|
||||||
UINT_PTR Address;
|
UINT_PTR Address;
|
||||||
|
|
||||||
@@ -392,8 +394,12 @@ AR::ProcSup::InitializeProcessorStructures(IN PVOID ProcessorStructures,
|
|||||||
*KernelBootStack = (PVOID)Address;
|
*KernelBootStack = (PVOID)Address;
|
||||||
Address += KERNEL_STACK_SIZE;
|
Address += KERNEL_STACK_SIZE;
|
||||||
|
|
||||||
/* Assign a space for kernel fault stack, no advance needed as stack grows down */
|
/* Assign a space for kernel fault stack and advance */
|
||||||
*KernelFaultStack = (PVOID)Address;
|
*KernelFaultStack = (PVOID)Address;
|
||||||
|
Address += KERNEL_STACK_SIZE;
|
||||||
|
|
||||||
|
/* Assign a space for kernel NMI stack, no advance needed as stack grows down */
|
||||||
|
*KernelNmiStack = (PVOID)Address;
|
||||||
|
|
||||||
/* Assign a space for GDT and advance */
|
/* Assign a space for GDT and advance */
|
||||||
*Gdt = (PKGDTENTRY)(PVOID)Address;
|
*Gdt = (PKGDTENTRY)(PVOID)Address;
|
||||||
@@ -439,7 +445,8 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
AR::ProcSup::InitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
AR::ProcSup::InitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||||
IN PVOID KernelBootStack,
|
IN PVOID KernelBootStack,
|
||||||
IN PVOID KernelFaultStack)
|
IN PVOID KernelFaultStack,
|
||||||
|
IN PVOID KernelNmiStack)
|
||||||
{
|
{
|
||||||
/* Clear I/O map */
|
/* Clear I/O map */
|
||||||
RtlSetMemory(ProcessorBlock->TssBase->IoMaps[0].IoMap, 0xFF, IOPM_FULL_SIZE);
|
RtlSetMemory(ProcessorBlock->TssBase->IoMaps[0].IoMap, 0xFF, IOPM_FULL_SIZE);
|
||||||
@@ -471,7 +478,7 @@ AR::ProcSup::InitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
|||||||
|
|
||||||
/* Initialize task gates for DoubleFault and NMI traps */
|
/* Initialize task gates for DoubleFault and NMI traps */
|
||||||
SetDoubleFaultTssEntry(ProcessorBlock, KernelFaultStack);
|
SetDoubleFaultTssEntry(ProcessorBlock, KernelFaultStack);
|
||||||
SetNonMaskableInterruptTssEntry(ProcessorBlock, KernelFaultStack);
|
SetNonMaskableInterruptTssEntry(ProcessorBlock, KernelNmiStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -701,7 +708,7 @@ AR::ProcSup::SetIdtGate(IN PKIDTENTRY Idt,
|
|||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
AR::ProcSup::SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
AR::ProcSup::SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||||
IN PVOID KernelFaultStack)
|
IN PVOID KernelNmiStack)
|
||||||
{
|
{
|
||||||
PKGDTENTRY TaskGateEntry, TssEntry;
|
PKGDTENTRY TaskGateEntry, TssEntry;
|
||||||
PKTSS Tss;
|
PKTSS Tss;
|
||||||
@@ -719,8 +726,8 @@ AR::ProcSup::SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock
|
|||||||
Tss->Flags = 0;
|
Tss->Flags = 0;
|
||||||
Tss->LDT = KGDT_R0_LDT;
|
Tss->LDT = KGDT_R0_LDT;
|
||||||
Tss->CR3 = CpuFunc::ReadControlRegister(3);
|
Tss->CR3 = CpuFunc::ReadControlRegister(3);
|
||||||
Tss->Esp = (ULONG_PTR)KernelFaultStack;
|
Tss->Esp = (ULONG_PTR)KernelNmiStack;
|
||||||
Tss->Esp0 = (ULONG_PTR)KernelFaultStack;
|
Tss->Esp0 = (ULONG_PTR)KernelNmiStack;
|
||||||
Tss->Eip = PtrToUlong(ArTrapEntry[0x02]);
|
Tss->Eip = PtrToUlong(ArTrapEntry[0x02]);
|
||||||
Tss->Cs = KGDT_R0_CODE;
|
Tss->Cs = KGDT_R0_CODE;
|
||||||
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ namespace AR
|
|||||||
STATIC KIDTENTRY InitialIdt[IDT_ENTRIES];
|
STATIC KIDTENTRY InitialIdt[IDT_ENTRIES];
|
||||||
STATIC KPROCESSOR_BLOCK InitialProcessorBlock;
|
STATIC KPROCESSOR_BLOCK InitialProcessorBlock;
|
||||||
STATIC KTSS InitialTss;
|
STATIC KTSS InitialTss;
|
||||||
|
STATIC UCHAR NmiStack[KERNEL_STACK_SIZE];
|
||||||
STATIC UCHAR NonMaskableInterruptTss[KTSS_IO_MAPS];
|
STATIC UCHAR NonMaskableInterruptTss[KTSS_IO_MAPS];
|
||||||
|
|
||||||
|
|
||||||
@@ -57,11 +58,13 @@ namespace AR
|
|||||||
OUT PKTSS *Tss,
|
OUT PKTSS *Tss,
|
||||||
OUT PKPROCESSOR_BLOCK *ProcessorBlock,
|
OUT PKPROCESSOR_BLOCK *ProcessorBlock,
|
||||||
OUT PVOID *KernelBootStack,
|
OUT PVOID *KernelBootStack,
|
||||||
OUT PVOID *KernelFaultStack);
|
OUT PVOID *KernelFaultStack,
|
||||||
|
OUT PVOID *KernelNmiStack);
|
||||||
STATIC XTAPI VOID InitializeSegments(VOID);
|
STATIC XTAPI VOID InitializeSegments(VOID);
|
||||||
STATIC XTAPI VOID InitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
STATIC XTAPI VOID InitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||||
IN PVOID KernelBootStack,
|
IN PVOID KernelBootStack,
|
||||||
IN PVOID KernelFaultStack);
|
IN PVOID KernelFaultStack,
|
||||||
|
IN PVOID KernelNmiStack);
|
||||||
STATIC XTAPI VOID SetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
STATIC XTAPI VOID SetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||||
IN PVOID KernelFaultStack);
|
IN PVOID KernelFaultStack);
|
||||||
STATIC XTAPI VOID SetGdtEntry(IN PKGDTENTRY Gdt,
|
STATIC XTAPI VOID SetGdtEntry(IN PKGDTENTRY Gdt,
|
||||||
@@ -75,7 +78,7 @@ namespace AR
|
|||||||
IN USHORT Selector,
|
IN USHORT Selector,
|
||||||
IN ULONG_PTR Base);
|
IN ULONG_PTR Base);
|
||||||
STATIC XTAPI VOID SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
STATIC XTAPI VOID SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||||
IN PVOID KernelFaultStack);
|
IN PVOID KernelNmiStack);
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user