Let kernel initialize stack on it's own without relying on boot loader
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
0b743a5f26
commit
d6aac59199
@ -20,3 +20,9 @@ KPROCESSOR_BLOCK ArInitialProcessorBlock;
|
|||||||
|
|
||||||
/* Initial TSS */
|
/* Initial TSS */
|
||||||
KTSS ArInitialTss;
|
KTSS ArInitialTss;
|
||||||
|
|
||||||
|
/* Initial kernel boot stack */
|
||||||
|
UCHAR ArKernelBootStack[KERNEL_STACK_SIZE] = {0};
|
||||||
|
|
||||||
|
/* Initial kernel fault stack */
|
||||||
|
UCHAR ArKernelFaultStack[KERNEL_STACK_SIZE] = {0};
|
||||||
|
@ -22,6 +22,7 @@ ArInitializeProcessor(VOID)
|
|||||||
{
|
{
|
||||||
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
||||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||||
|
PVOID KernelFaultStack;
|
||||||
PKGDTENTRY Gdt;
|
PKGDTENTRY Gdt;
|
||||||
PKIDTENTRY Idt;
|
PKIDTENTRY Idt;
|
||||||
PKTSS Tss;
|
PKTSS Tss;
|
||||||
@ -30,12 +31,13 @@ ArInitializeProcessor(VOID)
|
|||||||
Gdt = ArInitialGdt;
|
Gdt = ArInitialGdt;
|
||||||
Idt = ArInitialIdt;
|
Idt = ArInitialIdt;
|
||||||
Tss = &ArInitialTss;
|
Tss = &ArInitialTss;
|
||||||
|
KernelFaultStack = &ArKernelFaultStack;
|
||||||
|
|
||||||
/* Load processor block */
|
/* Load processor block */
|
||||||
ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb);
|
ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb);
|
||||||
|
|
||||||
/* Initialize processor block */
|
/* Initialize processor block */
|
||||||
ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, (PVOID)KeInitializationBlock->KernelFaultStack);
|
ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack);
|
||||||
|
|
||||||
/* Initialize GDT, IDT and TSS */
|
/* Initialize GDT, IDT and TSS */
|
||||||
ArpInitializeGdt(ProcessorBlock);
|
ArpInitializeGdt(ProcessorBlock);
|
||||||
@ -314,9 +316,9 @@ ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
|||||||
|
|
||||||
/* Setup I/O map and stacks for ring0 & traps */
|
/* Setup I/O map and stacks for ring0 & traps */
|
||||||
ProcessorBlock->TssBase->IoMapBase = sizeof(KTSS);
|
ProcessorBlock->TssBase->IoMapBase = sizeof(KTSS);
|
||||||
ProcessorBlock->TssBase->Rsp0 = KeInitializationBlock->KernelBootStack;
|
ProcessorBlock->TssBase->Rsp0 = (ULONG_PTR)&ArKernelBootStack;
|
||||||
ProcessorBlock->TssBase->Ist[KIDT_IST_PANIC] = KeInitializationBlock->KernelFaultStack;
|
ProcessorBlock->TssBase->Ist[KIDT_IST_PANIC] = (ULONG_PTR)&ArKernelFaultStack;
|
||||||
ProcessorBlock->TssBase->Ist[KIDT_IST_MCA] = KeInitializationBlock->KernelFaultStack;
|
ProcessorBlock->TssBase->Ist[KIDT_IST_MCA] = (ULONG_PTR)&ArKernelFaultStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,3 +24,9 @@ KTSS ArInitialTss;
|
|||||||
/* Double Fault and NMI task gates */
|
/* Double Fault and NMI task gates */
|
||||||
UCHAR ArpDoubleFaultTss[KTSS_IO_MAPS];
|
UCHAR ArpDoubleFaultTss[KTSS_IO_MAPS];
|
||||||
UCHAR ArpNonMaskableInterruptTss[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};
|
||||||
|
@ -22,6 +22,7 @@ ArInitializeProcessor(VOID)
|
|||||||
{
|
{
|
||||||
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
||||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||||
|
PVOID KernelFaultStack;
|
||||||
PKGDTENTRY Gdt;
|
PKGDTENTRY Gdt;
|
||||||
PKIDTENTRY Idt;
|
PKIDTENTRY Idt;
|
||||||
PKTSS Tss;
|
PKTSS Tss;
|
||||||
@ -30,12 +31,13 @@ ArInitializeProcessor(VOID)
|
|||||||
Gdt = ArInitialGdt;
|
Gdt = ArInitialGdt;
|
||||||
Idt = ArInitialIdt;
|
Idt = ArInitialIdt;
|
||||||
Tss = &ArInitialTss;
|
Tss = &ArInitialTss;
|
||||||
|
KernelFaultStack = &ArKernelFaultStack;
|
||||||
|
|
||||||
/* Load processor block */
|
/* Load processor block */
|
||||||
ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb);
|
ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb);
|
||||||
|
|
||||||
/* Initialize processor block */
|
/* Initialize processor block */
|
||||||
ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, (PVOID)KeInitializationBlock->KernelFaultStack);
|
ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack);
|
||||||
|
|
||||||
/* Initialize GDT, IDT and TSS */
|
/* Initialize GDT, IDT and TSS */
|
||||||
ArpInitializeGdt(ProcessorBlock);
|
ArpInitializeGdt(ProcessorBlock);
|
||||||
@ -275,8 +277,8 @@ ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
|||||||
Tss->Flags = 0;
|
Tss->Flags = 0;
|
||||||
Tss->LDT = KGDT_R0_LDT;
|
Tss->LDT = KGDT_R0_LDT;
|
||||||
Tss->CR3 = ArReadControlRegister(3);
|
Tss->CR3 = ArReadControlRegister(3);
|
||||||
Tss->Esp = KeInitializationBlock->KernelFaultStack;
|
Tss->Esp = (ULONG_PTR)&ArKernelFaultStack;
|
||||||
Tss->Esp0 = KeInitializationBlock->KernelFaultStack;
|
Tss->Esp0 = (ULONG_PTR)&ArKernelFaultStack;
|
||||||
Tss->Eip = PtrToUlong(ArpHandleTrap08);
|
Tss->Eip = PtrToUlong(ArpHandleTrap08);
|
||||||
Tss->Cs = KGDT_R0_CODE;
|
Tss->Cs = KGDT_R0_CODE;
|
||||||
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||||
@ -444,8 +446,8 @@ ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
|||||||
Tss->Flags = 0;
|
Tss->Flags = 0;
|
||||||
Tss->LDT = KGDT_R0_LDT;
|
Tss->LDT = KGDT_R0_LDT;
|
||||||
Tss->CR3 = ArReadControlRegister(3);
|
Tss->CR3 = ArReadControlRegister(3);
|
||||||
Tss->Esp = KeInitializationBlock->KernelFaultStack;
|
Tss->Esp = (ULONG_PTR)&ArKernelFaultStack;
|
||||||
Tss->Esp0 = KeInitializationBlock->KernelFaultStack;
|
Tss->Esp0 = (ULONG_PTR)&ArKernelFaultStack;
|
||||||
Tss->Eip = PtrToUlong(ArpHandleTrap02);
|
Tss->Eip = PtrToUlong(ArpHandleTrap02);
|
||||||
Tss->Cs = KGDT_R0_CODE;
|
Tss->Cs = KGDT_R0_CODE;
|
||||||
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||||
|
@ -24,4 +24,10 @@ EXTERN KPROCESSOR_BLOCK ArInitialProcessorBlock;
|
|||||||
/* Initial TSS */
|
/* Initial TSS */
|
||||||
EXTERN KTSS ArInitialTss;
|
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 */
|
#endif /* __XTOSKRNL_AMD64_GLOBALS_H */
|
||||||
|
@ -19,12 +19,6 @@ EXTERN HAL_FRAMEBUFFER_DATA HlpFrameBufferData;
|
|||||||
/* Kernel initialization block passed by boot loader */
|
/* Kernel initialization block passed by boot loader */
|
||||||
EXTERN PKERNEL_INITIALIZATION_BLOCK KeInitializationBlock;
|
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 */
|
/* Pointer to boot loader provided DbgPrint() routine */
|
||||||
EXTERN VOID (*LdrDbgPrint)(IN PWCHAR Format, IN ...);
|
EXTERN VOID (*LdrDbgPrint)(IN PWCHAR Format, IN ...);
|
||||||
|
|
||||||
|
@ -28,4 +28,10 @@ EXTERN KTSS ArInitialTss;
|
|||||||
EXTERN UCHAR ArpDoubleFaultTss[KTSS_IO_MAPS];
|
EXTERN UCHAR ArpDoubleFaultTss[KTSS_IO_MAPS];
|
||||||
EXTERN UCHAR ArpNonMaskableInterruptTss[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 */
|
#endif /* __XTOSKRNL_I686_GLOBALS_H */
|
||||||
|
@ -20,10 +20,6 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
KepStartKernel(VOID);
|
KepStartKernel(VOID);
|
||||||
|
|
||||||
XTAPI
|
|
||||||
VOID
|
|
||||||
KepInitializeStack(IN PKERNEL_INITIALIZATION_BLOCK Parameters);
|
|
||||||
|
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
KepSwitchBootStack(IN ULONG_PTR Stack);
|
KepSwitchBootStack(IN ULONG_PTR Stack);
|
||||||
|
@ -15,11 +15,5 @@ HAL_FRAMEBUFFER_DATA HlpFrameBufferData;
|
|||||||
/* Kernel initialization block passed by boot loader */
|
/* Kernel initialization block passed by boot loader */
|
||||||
PKERNEL_INITIALIZATION_BLOCK KeInitializationBlock;
|
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 */
|
/* Pointer to boot loader provided DbgPrint() routine */
|
||||||
VOID (*LdrDbgPrint)(IN PWCHAR Format, IN ...) = NULL;
|
VOID (*LdrDbgPrint)(IN PWCHAR Format, IN ...) = NULL;
|
||||||
|
@ -46,9 +46,6 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters)
|
|||||||
/* Save the kernel initialization block */
|
/* Save the kernel initialization block */
|
||||||
KeInitializationBlock = Parameters;
|
KeInitializationBlock = Parameters;
|
||||||
|
|
||||||
/* Initialize kernel stacks */
|
|
||||||
KepInitializeStack(Parameters);
|
|
||||||
|
|
||||||
/* Architecture specific initialization */
|
/* Architecture specific initialization */
|
||||||
KepArchInitialize();
|
KepArchInitialize();
|
||||||
|
|
||||||
@ -56,36 +53,5 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters)
|
|||||||
ArInitializeProcessor();
|
ArInitializeProcessor();
|
||||||
|
|
||||||
/* Switch boot stack alligning it to 4 byte boundary */
|
/* Switch boot stack alligning it to 4 byte boundary */
|
||||||
KepSwitchBootStack(KeInitializationBlock->KernelBootStack & ~0x3);
|
KepSwitchBootStack((ULONG_PTR)&ArKernelBootStack & ~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];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user