diff --git a/xtoskrnl/ar/amd64/procsup.c b/xtoskrnl/ar/amd64/procsup.c index bac355d..a3f90ba 100644 --- a/xtoskrnl/ar/amd64/procsup.c +++ b/xtoskrnl/ar/amd64/procsup.c @@ -18,23 +18,35 @@ */ XTAPI VOID -ArInitializeProcessor(VOID) +ArInitializeProcessor(IN PVOID ProcessorStructures) { KDESCRIPTOR GdtDescriptor, IdtDescriptor; + PVOID KernelBootStack, KernelFaultStack; PKPROCESSOR_BLOCK ProcessorBlock; - PVOID KernelFaultStack; PKGDTENTRY Gdt; PKIDTENTRY Idt; PKTSS Tss; - /* Use initial structures */ - Gdt = ArInitialGdt; - Idt = ArInitialIdt; - Tss = &ArInitialTss; - KernelFaultStack = &ArKernelFaultStack; + /* Check if processor structures buffer provided */ + if(ProcessorStructures) + { + /* Assign CPU structures from provided buffer */ + ArpInitializeProcessorStructures(ProcessorStructures, &Gdt, &Tss, &ProcessorBlock, + &KernelBootStack, &KernelFaultStack); - /* Load processor block */ - ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb); + /* Use global IDT */ + Idt = ArInitialIdt; + } + else + { + /* Use initial structures */ + Gdt = ArInitialGdt; + Idt = ArInitialIdt; + Tss = &ArInitialTss; + KernelBootStack = &ArKernelBootStack; + KernelFaultStack = &ArKernelFaultStack; + ProcessorBlock = &ArInitialProcessorBlock; + } /* Initialize processor block */ ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack); @@ -287,9 +299,6 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock, IN PKTSS Tss, IN PVOID DpcStack) { - /* Fill processor block with zeroes */ - RtlZeroMemory(ProcessorBlock, sizeof(KPROCESSOR_BLOCK)); - /* Set processor block and processor control block */ ProcessorBlock->Self = ProcessorBlock; ProcessorBlock->CurrentPrcb = &ProcessorBlock->Prcb; @@ -386,6 +395,64 @@ ArpInitializeProcessorRegisters(VOID) ArLoadMxcsrRegister(INITIAL_MXCSR); } +/** + * Initializes i686 processor specific structures with provided memory buffer. + * + * @param ProcessorStructures + * Supplies a pointer to the allocated buffer with processor structures. + * + * @param Gdt + * Supplies a pointer to the GDT. + * + * @param Tss + * Supplies a pointer to the TSS. + * + * @param ProcessorBlock + * Supplies a pointer to the processor block. + * + * @param KernelBootStack + * Supplies a pointer to the kernel boot stack. + * + * @param KernelFaultStack + * Supplies a pointer to the kernel fault stack. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +ArpInitializeProcessorStructures(IN PVOID ProcessorStructures, + OUT PKGDTENTRY *Gdt, + OUT PKTSS *Tss, + OUT PKPROCESSOR_BLOCK *ProcessorBlock, + OUT PVOID *KernelBootStack, + OUT PVOID *KernelFaultStack) +{ + UINT_PTR Address; + + /* Align address to page size boundary and move to kernel boot stack */ + Address = ROUND_UP((UINT_PTR)ProcessorStructures, MM_PAGE_SIZE) + KERNEL_STACK_SIZE; + + /* Assign a space for kernel boot stack and advance */ + *KernelBootStack = (PVOID)Address; + Address += KERNEL_STACK_SIZE; + + /* Assign a space for kernel fault stack, no advance needed as stack grows down */ + *KernelFaultStack = (PVOID)Address; + + /* Assign a space for GDT and advance */ + *Gdt = (PVOID)Address; + Address += sizeof(ArInitialGdt); + + /* Assign a space for Processor Block and advance */ + *ProcessorBlock = (PVOID)Address; + Address += sizeof(ArInitialProcessorBlock); + + /* Assign a space for TSS */ + *Tss = (PVOID)Address; +} + /** * Initializes segment registers. * diff --git a/xtoskrnl/ar/i686/procsup.c b/xtoskrnl/ar/i686/procsup.c index 0045d07..3a6d644 100644 --- a/xtoskrnl/ar/i686/procsup.c +++ b/xtoskrnl/ar/i686/procsup.c @@ -18,23 +18,35 @@ */ XTAPI VOID -ArInitializeProcessor(VOID) +ArInitializeProcessor(IN PVOID ProcessorStructures) { KDESCRIPTOR GdtDescriptor, IdtDescriptor; + PVOID KernelBootStack, KernelFaultStack; PKPROCESSOR_BLOCK ProcessorBlock; - PVOID KernelFaultStack; PKGDTENTRY Gdt; PKIDTENTRY Idt; PKTSS Tss; - /* Use initial structures */ - Gdt = ArInitialGdt; - Idt = ArInitialIdt; - Tss = &ArInitialTss; - KernelFaultStack = &ArKernelFaultStack; + /* Check if processor structures buffer provided */ + if(ProcessorStructures) + { + /* Assign CPU structures from provided buffer */ + ArpInitializeProcessorStructures(ProcessorStructures, &Gdt, &Tss, &ProcessorBlock, + &KernelBootStack, &KernelFaultStack); - /* Load processor block */ - ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb); + /* Use global IDT */ + Idt = ArInitialIdt; + } + else + { + /* Use initial structures */ + Gdt = ArInitialGdt; + Idt = ArInitialIdt; + Tss = &ArInitialTss; + KernelBootStack = &ArKernelBootStack; + KernelFaultStack = &ArKernelFaultStack; + ProcessorBlock = &ArInitialProcessorBlock; + } /* Initialize processor block */ ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack); @@ -286,9 +298,6 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock, IN PKTSS Tss, IN PVOID DpcStack) { - /* Fill processor block with zeroes */ - RtlZeroMemory(ProcessorBlock, sizeof(KPROCESSOR_BLOCK)); - /* Set processor block and processor control block */ ProcessorBlock->Self = ProcessorBlock; ProcessorBlock->CurrentPrcb = &ProcessorBlock->Prcb; @@ -338,6 +347,64 @@ ArpInitializeProcessorRegisters(VOID) ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_WP); } +/** + * Initializes i686 processor specific structures with provided memory buffer. + * + * @param ProcessorStructures + * Supplies a pointer to the allocated buffer with processor structures. + * + * @param Gdt + * Supplies a pointer to the GDT. + * + * @param Tss + * Supplies a pointer to the TSS. + * + * @param ProcessorBlock + * Supplies a pointer to the processor block. + * + * @param KernelBootStack + * Supplies a pointer to the kernel boot stack. + * + * @param KernelFaultStack + * Supplies a pointer to the kernel fault stack. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +ArpInitializeProcessorStructures(IN PVOID ProcessorStructures, + OUT PKGDTENTRY *Gdt, + OUT PKTSS *Tss, + OUT PKPROCESSOR_BLOCK *ProcessorBlock, + OUT PVOID *KernelBootStack, + OUT PVOID *KernelFaultStack) +{ + UINT_PTR Address; + + /* Align address to page size boundary and move to kernel boot stack */ + Address = ROUND_UP((UINT_PTR)ProcessorStructures, MM_PAGE_SIZE) + KERNEL_STACK_SIZE; + + /* Assign a space for kernel boot stack and advance */ + *KernelBootStack = (PVOID)Address; + Address += KERNEL_STACK_SIZE; + + /* Assign a space for kernel fault stack, no advance needed as stack grows down */ + *KernelFaultStack = (PVOID)Address; + + /* Assign a space for GDT and advance */ + *Gdt = (PVOID)Address; + Address += sizeof(ArInitialGdt); + + /* Assign a space for Processor Block and advance */ + *ProcessorBlock = (PVOID)Address; + Address += sizeof(ArInitialProcessorBlock); + + /* Assign a space for TSS */ + *Tss = (PVOID)Address; +} + /** * Initializes segment registers. * diff --git a/xtoskrnl/includes/amd64/ari.h b/xtoskrnl/includes/amd64/ari.h index 13c163e..53f698d 100644 --- a/xtoskrnl/includes/amd64/ari.h +++ b/xtoskrnl/includes/amd64/ari.h @@ -36,7 +36,7 @@ ArHalt(VOID); XTAPI VOID -ArInitializeProcessor(VOID); +ArInitializeProcessor(IN PVOID ProcessorStructures); XTCDECL VOID @@ -289,6 +289,15 @@ XTAPI VOID ArpInitializeProcessorRegisters(VOID); +XTAPI +VOID +ArpInitializeProcessorStructures(IN PVOID ProcessorStructures, + OUT PKGDTENTRY *Gdt, + OUT PKTSS *Tss, + OUT PKPROCESSOR_BLOCK *ProcessorBlock, + OUT PVOID *KernelBootStack, + OUT PVOID *KernelFaultStack); + XTAPI VOID ArpInitializeSegments(VOID); diff --git a/xtoskrnl/includes/i686/ari.h b/xtoskrnl/includes/i686/ari.h index 8040c54..5e90ef9 100644 --- a/xtoskrnl/includes/i686/ari.h +++ b/xtoskrnl/includes/i686/ari.h @@ -36,7 +36,7 @@ ArHalt(VOID); XTAPI VOID -ArInitializeProcessor(VOID); +ArInitializeProcessor(IN PVOID ProcessorStructures); XTCDECL VOID @@ -277,6 +277,15 @@ XTAPI VOID ArpInitializeProcessorRegisters(VOID); +XTAPI +VOID +ArpInitializeProcessorStructures(IN PVOID ProcessorStructures, + OUT PKGDTENTRY *Gdt, + OUT PKTSS *Tss, + OUT PKPROCESSOR_BLOCK *ProcessorBlock, + OUT PVOID *KernelBootStack, + OUT PVOID *KernelFaultStack); + XTAPI VOID ArpInitializeSegments(VOID); diff --git a/xtoskrnl/ke/krnlinit.c b/xtoskrnl/ke/krnlinit.c index bcb7e9a..49bdbdd 100644 --- a/xtoskrnl/ke/krnlinit.c +++ b/xtoskrnl/ke/krnlinit.c @@ -49,7 +49,7 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters) XTOS_COMPILER_NAME, XTOS_COMPILER_VERSION); /* Initialize boot CPU */ - ArInitializeProcessor(); + ArInitializeProcessor(NULL); /* Architecture specific kernel initialization */ KepInitializeMachine();