From d6aac5919906e316b636f5f43b50b312d848f79d Mon Sep 17 00:00:00 2001 From: belliash Date: Sun, 5 Feb 2023 09:55:59 +0100 Subject: [PATCH] Let kernel initialize stack on it's own without relying on boot loader --- xtoskrnl/ar/amd64/globals.c | 6 ++++++ xtoskrnl/ar/amd64/procsup.c | 10 +++++---- xtoskrnl/ar/i686/globals.c | 6 ++++++ xtoskrnl/ar/i686/procsup.c | 12 ++++++----- xtoskrnl/includes/amd64/globals.h | 6 ++++++ xtoskrnl/includes/globals.h | 6 ------ xtoskrnl/includes/i686/globals.h | 6 ++++++ xtoskrnl/includes/kepfuncs.h | 4 ---- xtoskrnl/ke/globals.c | 6 ------ xtoskrnl/ke/krnlinit.c | 36 +------------------------------ 10 files changed, 38 insertions(+), 60 deletions(-) diff --git a/xtoskrnl/ar/amd64/globals.c b/xtoskrnl/ar/amd64/globals.c index 9e902ca..4804cfb 100644 --- a/xtoskrnl/ar/amd64/globals.c +++ b/xtoskrnl/ar/amd64/globals.c @@ -20,3 +20,9 @@ KPROCESSOR_BLOCK ArInitialProcessorBlock; /* Initial TSS */ KTSS ArInitialTss; + +/* Initial kernel boot stack */ +UCHAR ArKernelBootStack[KERNEL_STACK_SIZE] = {0}; + +/* Initial kernel fault stack */ +UCHAR ArKernelFaultStack[KERNEL_STACK_SIZE] = {0}; diff --git a/xtoskrnl/ar/amd64/procsup.c b/xtoskrnl/ar/amd64/procsup.c index ab3d966..e24fa5f 100644 --- a/xtoskrnl/ar/amd64/procsup.c +++ b/xtoskrnl/ar/amd64/procsup.c @@ -22,6 +22,7 @@ ArInitializeProcessor(VOID) { KDESCRIPTOR GdtDescriptor, IdtDescriptor; PKPROCESSOR_BLOCK ProcessorBlock; + PVOID KernelFaultStack; PKGDTENTRY Gdt; PKIDTENTRY Idt; PKTSS Tss; @@ -30,12 +31,13 @@ ArInitializeProcessor(VOID) Gdt = ArInitialGdt; Idt = ArInitialIdt; Tss = &ArInitialTss; + KernelFaultStack = &ArKernelFaultStack; /* Load processor block */ ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb); /* Initialize processor block */ - ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, (PVOID)KeInitializationBlock->KernelFaultStack); + ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack); /* Initialize GDT, IDT and TSS */ ArpInitializeGdt(ProcessorBlock); @@ -314,9 +316,9 @@ ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock) /* Setup I/O map and stacks for ring0 & traps */ ProcessorBlock->TssBase->IoMapBase = sizeof(KTSS); - ProcessorBlock->TssBase->Rsp0 = KeInitializationBlock->KernelBootStack; - ProcessorBlock->TssBase->Ist[KIDT_IST_PANIC] = KeInitializationBlock->KernelFaultStack; - ProcessorBlock->TssBase->Ist[KIDT_IST_MCA] = KeInitializationBlock->KernelFaultStack; + ProcessorBlock->TssBase->Rsp0 = (ULONG_PTR)&ArKernelBootStack; + ProcessorBlock->TssBase->Ist[KIDT_IST_PANIC] = (ULONG_PTR)&ArKernelFaultStack; + ProcessorBlock->TssBase->Ist[KIDT_IST_MCA] = (ULONG_PTR)&ArKernelFaultStack; } /** diff --git a/xtoskrnl/ar/i686/globals.c b/xtoskrnl/ar/i686/globals.c index c56f5eb..0630834 100644 --- a/xtoskrnl/ar/i686/globals.c +++ b/xtoskrnl/ar/i686/globals.c @@ -24,3 +24,9 @@ KTSS ArInitialTss; /* Double Fault and NMI task gates */ UCHAR ArpDoubleFaultTss[KTSS_IO_MAPS]; UCHAR ArpNonMaskableInterruptTss[KTSS_IO_MAPS]; + +/* Initial kernel boot stack */ +UCHAR ArKernelBootStack[KERNEL_STACK_SIZE] = {0}; + +/* Initial kernel fault stack */ +UCHAR ArKernelFaultStack[KERNEL_STACK_SIZE] = {0}; diff --git a/xtoskrnl/ar/i686/procsup.c b/xtoskrnl/ar/i686/procsup.c index a22206e..b1f7f73 100644 --- a/xtoskrnl/ar/i686/procsup.c +++ b/xtoskrnl/ar/i686/procsup.c @@ -22,6 +22,7 @@ ArInitializeProcessor(VOID) { KDESCRIPTOR GdtDescriptor, IdtDescriptor; PKPROCESSOR_BLOCK ProcessorBlock; + PVOID KernelFaultStack; PKGDTENTRY Gdt; PKIDTENTRY Idt; PKTSS Tss; @@ -30,12 +31,13 @@ ArInitializeProcessor(VOID) Gdt = ArInitialGdt; Idt = ArInitialIdt; Tss = &ArInitialTss; + KernelFaultStack = &ArKernelFaultStack; /* Load processor block */ ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb); /* Initialize processor block */ - ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, (PVOID)KeInitializationBlock->KernelFaultStack); + ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack); /* Initialize GDT, IDT and TSS */ ArpInitializeGdt(ProcessorBlock); @@ -275,8 +277,8 @@ ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock) Tss->Flags = 0; Tss->LDT = KGDT_R0_LDT; Tss->CR3 = ArReadControlRegister(3); - Tss->Esp = KeInitializationBlock->KernelFaultStack; - Tss->Esp0 = KeInitializationBlock->KernelFaultStack; + Tss->Esp = (ULONG_PTR)&ArKernelFaultStack; + Tss->Esp0 = (ULONG_PTR)&ArKernelFaultStack; Tss->Eip = PtrToUlong(ArpHandleTrap08); Tss->Cs = KGDT_R0_CODE; Tss->Ds = KGDT_R3_DATA | RPL_MASK; @@ -444,8 +446,8 @@ ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock) Tss->Flags = 0; Tss->LDT = KGDT_R0_LDT; Tss->CR3 = ArReadControlRegister(3); - Tss->Esp = KeInitializationBlock->KernelFaultStack; - Tss->Esp0 = KeInitializationBlock->KernelFaultStack; + Tss->Esp = (ULONG_PTR)&ArKernelFaultStack; + Tss->Esp0 = (ULONG_PTR)&ArKernelFaultStack; Tss->Eip = PtrToUlong(ArpHandleTrap02); Tss->Cs = KGDT_R0_CODE; Tss->Ds = KGDT_R3_DATA | RPL_MASK; diff --git a/xtoskrnl/includes/amd64/globals.h b/xtoskrnl/includes/amd64/globals.h index 733b55a..70c6aa0 100644 --- a/xtoskrnl/includes/amd64/globals.h +++ b/xtoskrnl/includes/amd64/globals.h @@ -24,4 +24,10 @@ EXTERN KPROCESSOR_BLOCK ArInitialProcessorBlock; /* Initial TSS */ EXTERN KTSS ArInitialTss; +/* Kernel own boot stack */ +EXTERN UCHAR ArKernelBootStack[KERNEL_STACK_SIZE]; + +/* Kernel own fault stack */ +EXTERN UCHAR ArKernelFaultStack[KERNEL_STACK_SIZE]; + #endif /* __XTOSKRNL_AMD64_GLOBALS_H */ diff --git a/xtoskrnl/includes/globals.h b/xtoskrnl/includes/globals.h index a4b06ac..d29a741 100644 --- a/xtoskrnl/includes/globals.h +++ b/xtoskrnl/includes/globals.h @@ -19,12 +19,6 @@ EXTERN HAL_FRAMEBUFFER_DATA HlpFrameBufferData; /* Kernel initialization block passed by boot loader */ EXTERN PKERNEL_INITIALIZATION_BLOCK KeInitializationBlock; -/* Kernel own boot stack */ -EXTERN UCHAR KepKernelBootStackData[KERNEL_STACK_SIZE]; - -/* Kernel own fault stack */ -EXTERN UCHAR KepKernelFaultStackData[KERNEL_STACK_SIZE]; - /* Pointer to boot loader provided DbgPrint() routine */ EXTERN VOID (*LdrDbgPrint)(IN PWCHAR Format, IN ...); diff --git a/xtoskrnl/includes/i686/globals.h b/xtoskrnl/includes/i686/globals.h index 8c01d7c..0c5f6ec 100644 --- a/xtoskrnl/includes/i686/globals.h +++ b/xtoskrnl/includes/i686/globals.h @@ -28,4 +28,10 @@ EXTERN KTSS ArInitialTss; EXTERN UCHAR ArpDoubleFaultTss[KTSS_IO_MAPS]; EXTERN UCHAR ArpNonMaskableInterruptTss[KTSS_IO_MAPS]; +/* Kernel own boot stack */ +EXTERN UCHAR ArKernelBootStack[KERNEL_STACK_SIZE]; + +/* Kernel own fault stack */ +EXTERN UCHAR ArKernelFaultStack[KERNEL_STACK_SIZE]; + #endif /* __XTOSKRNL_I686_GLOBALS_H */ diff --git a/xtoskrnl/includes/kepfuncs.h b/xtoskrnl/includes/kepfuncs.h index 489fb73..e20b2b8 100644 --- a/xtoskrnl/includes/kepfuncs.h +++ b/xtoskrnl/includes/kepfuncs.h @@ -20,10 +20,6 @@ XTAPI VOID KepStartKernel(VOID); -XTAPI -VOID -KepInitializeStack(IN PKERNEL_INITIALIZATION_BLOCK Parameters); - XTAPI VOID KepSwitchBootStack(IN ULONG_PTR Stack); diff --git a/xtoskrnl/ke/globals.c b/xtoskrnl/ke/globals.c index 8213ad7..cb81d83 100644 --- a/xtoskrnl/ke/globals.c +++ b/xtoskrnl/ke/globals.c @@ -15,11 +15,5 @@ HAL_FRAMEBUFFER_DATA HlpFrameBufferData; /* Kernel initialization block passed by boot loader */ PKERNEL_INITIALIZATION_BLOCK KeInitializationBlock; -/* Kernel own boot stack */ -UCHAR KepKernelBootStackData[KERNEL_STACK_SIZE] = {0}; - -/* Kernel own fault stack */ -UCHAR KepKernelFaultStackData[KERNEL_STACK_SIZE] = {0}; - /* Pointer to boot loader provided DbgPrint() routine */ VOID (*LdrDbgPrint)(IN PWCHAR Format, IN ...) = NULL; diff --git a/xtoskrnl/ke/krnlinit.c b/xtoskrnl/ke/krnlinit.c index ff05f57..5f75d7b 100644 --- a/xtoskrnl/ke/krnlinit.c +++ b/xtoskrnl/ke/krnlinit.c @@ -46,9 +46,6 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters) /* Save the kernel initialization block */ KeInitializationBlock = Parameters; - /* Initialize kernel stacks */ - KepInitializeStack(Parameters); - /* Architecture specific initialization */ KepArchInitialize(); @@ -56,36 +53,5 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters) ArInitializeProcessor(); /* Switch boot stack alligning it to 4 byte boundary */ - KepSwitchBootStack(KeInitializationBlock->KernelBootStack & ~0x3); -} - -/** - * Initializes a stack needed by the kernel. - * - * @param Parameters - * Supplies a pointer to memory area containing parameters passed to kernel by bootloader. - * - * @return This routine does not return any value. - * - * @since XT 1.0 - */ -XTAPI -VOID -KepInitializeStack(IN PKERNEL_INITIALIZATION_BLOCK Parameters) -{ - /* Make sure kernel boot stack is initialized */ - if(!Parameters->KernelBootStack) - { - /* Initialize kernel boot stack */ - LdrPrint(L"Initializing kernel boot stack\n"); - Parameters->KernelBootStack = (ULONG_PTR)&KepKernelBootStackData[KERNEL_STACK_SIZE]; - } - - /* Make sure kernel fault stack is initialized */ - if(!Parameters->KernelFaultStack) - { - /* Initialize kernel fault stack */ - LdrPrint(L"Initializing kernel fault stack\n"); - Parameters->KernelFaultStack = (ULONG_PTR)&KepKernelFaultStackData[KERNEL_STACK_SIZE]; - } + KepSwitchBootStack((ULONG_PTR)&ArKernelBootStack & ~0x3); }