Use dedicated NMI stack on i686
All checks were successful
Builds / ExectOS (i686, debug) (push) Successful in 39s
Builds / ExectOS (amd64, release) (push) Successful in 41s
Builds / ExectOS (i686, release) (push) Successful in 42s
Builds / ExectOS (amd64, debug) (push) Successful in 47s

This commit is contained in:
2026-03-30 11:43:09 +02:00
parent e9aaeab982
commit 8c6c63465f
4 changed files with 27 additions and 14 deletions

View File

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

View File

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

View File

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

View File

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