Allow to initialize CPU with allocated processor structures
This commit is contained in:
parent
fb099a1988
commit
3c3a756771
@ -18,23 +18,35 @@
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
ArInitializeProcessor(VOID)
|
ArInitializeProcessor(IN PVOID ProcessorStructures)
|
||||||
{
|
{
|
||||||
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
||||||
|
PVOID KernelBootStack, KernelFaultStack;
|
||||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||||
PVOID KernelFaultStack;
|
|
||||||
PKGDTENTRY Gdt;
|
PKGDTENTRY Gdt;
|
||||||
PKIDTENTRY Idt;
|
PKIDTENTRY Idt;
|
||||||
PKTSS Tss;
|
PKTSS Tss;
|
||||||
|
|
||||||
/* Use initial structures */
|
/* Check if processor structures buffer provided */
|
||||||
Gdt = ArInitialGdt;
|
if(ProcessorStructures)
|
||||||
Idt = ArInitialIdt;
|
{
|
||||||
Tss = &ArInitialTss;
|
/* Assign CPU structures from provided buffer */
|
||||||
KernelFaultStack = &ArKernelFaultStack;
|
ArpInitializeProcessorStructures(ProcessorStructures, &Gdt, &Tss, &ProcessorBlock,
|
||||||
|
&KernelBootStack, &KernelFaultStack);
|
||||||
|
|
||||||
/* Load processor block */
|
/* Use global IDT */
|
||||||
ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb);
|
Idt = ArInitialIdt;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use initial structures */
|
||||||
|
Gdt = ArInitialGdt;
|
||||||
|
Idt = ArInitialIdt;
|
||||||
|
Tss = &ArInitialTss;
|
||||||
|
KernelBootStack = &ArKernelBootStack;
|
||||||
|
KernelFaultStack = &ArKernelFaultStack;
|
||||||
|
ProcessorBlock = &ArInitialProcessorBlock;
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize processor block */
|
/* Initialize processor block */
|
||||||
ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack);
|
ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack);
|
||||||
@ -287,9 +299,6 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock,
|
|||||||
IN PKTSS Tss,
|
IN PKTSS Tss,
|
||||||
IN PVOID DpcStack)
|
IN PVOID DpcStack)
|
||||||
{
|
{
|
||||||
/* Fill processor block with zeroes */
|
|
||||||
RtlZeroMemory(ProcessorBlock, sizeof(KPROCESSOR_BLOCK));
|
|
||||||
|
|
||||||
/* Set processor block and processor control block */
|
/* Set processor block and processor control block */
|
||||||
ProcessorBlock->Self = ProcessorBlock;
|
ProcessorBlock->Self = ProcessorBlock;
|
||||||
ProcessorBlock->CurrentPrcb = &ProcessorBlock->Prcb;
|
ProcessorBlock->CurrentPrcb = &ProcessorBlock->Prcb;
|
||||||
@ -386,6 +395,64 @@ ArpInitializeProcessorRegisters(VOID)
|
|||||||
ArLoadMxcsrRegister(INITIAL_MXCSR);
|
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.
|
* Initializes segment registers.
|
||||||
*
|
*
|
||||||
|
@ -18,23 +18,35 @@
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
ArInitializeProcessor(VOID)
|
ArInitializeProcessor(IN PVOID ProcessorStructures)
|
||||||
{
|
{
|
||||||
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
KDESCRIPTOR GdtDescriptor, IdtDescriptor;
|
||||||
|
PVOID KernelBootStack, KernelFaultStack;
|
||||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||||
PVOID KernelFaultStack;
|
|
||||||
PKGDTENTRY Gdt;
|
PKGDTENTRY Gdt;
|
||||||
PKIDTENTRY Idt;
|
PKIDTENTRY Idt;
|
||||||
PKTSS Tss;
|
PKTSS Tss;
|
||||||
|
|
||||||
/* Use initial structures */
|
/* Check if processor structures buffer provided */
|
||||||
Gdt = ArInitialGdt;
|
if(ProcessorStructures)
|
||||||
Idt = ArInitialIdt;
|
{
|
||||||
Tss = &ArInitialTss;
|
/* Assign CPU structures from provided buffer */
|
||||||
KernelFaultStack = &ArKernelFaultStack;
|
ArpInitializeProcessorStructures(ProcessorStructures, &Gdt, &Tss, &ProcessorBlock,
|
||||||
|
&KernelBootStack, &KernelFaultStack);
|
||||||
|
|
||||||
/* Load processor block */
|
/* Use global IDT */
|
||||||
ProcessorBlock = CONTAIN_RECORD(&ArInitialProcessorBlock.Prcb, KPROCESSOR_BLOCK, Prcb);
|
Idt = ArInitialIdt;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use initial structures */
|
||||||
|
Gdt = ArInitialGdt;
|
||||||
|
Idt = ArInitialIdt;
|
||||||
|
Tss = &ArInitialTss;
|
||||||
|
KernelBootStack = &ArKernelBootStack;
|
||||||
|
KernelFaultStack = &ArKernelFaultStack;
|
||||||
|
ProcessorBlock = &ArInitialProcessorBlock;
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize processor block */
|
/* Initialize processor block */
|
||||||
ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack);
|
ArpInitializeProcessorBlock(ProcessorBlock, Gdt, Idt, Tss, KernelFaultStack);
|
||||||
@ -286,9 +298,6 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock,
|
|||||||
IN PKTSS Tss,
|
IN PKTSS Tss,
|
||||||
IN PVOID DpcStack)
|
IN PVOID DpcStack)
|
||||||
{
|
{
|
||||||
/* Fill processor block with zeroes */
|
|
||||||
RtlZeroMemory(ProcessorBlock, sizeof(KPROCESSOR_BLOCK));
|
|
||||||
|
|
||||||
/* Set processor block and processor control block */
|
/* Set processor block and processor control block */
|
||||||
ProcessorBlock->Self = ProcessorBlock;
|
ProcessorBlock->Self = ProcessorBlock;
|
||||||
ProcessorBlock->CurrentPrcb = &ProcessorBlock->Prcb;
|
ProcessorBlock->CurrentPrcb = &ProcessorBlock->Prcb;
|
||||||
@ -338,6 +347,64 @@ ArpInitializeProcessorRegisters(VOID)
|
|||||||
ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_WP);
|
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.
|
* Initializes segment registers.
|
||||||
*
|
*
|
||||||
|
@ -36,7 +36,7 @@ ArHalt(VOID);
|
|||||||
|
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
ArInitializeProcessor(VOID);
|
ArInitializeProcessor(IN PVOID ProcessorStructures);
|
||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
VOID
|
||||||
@ -289,6 +289,15 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
ArpInitializeProcessorRegisters(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
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
ArpInitializeSegments(VOID);
|
ArpInitializeSegments(VOID);
|
||||||
|
@ -36,7 +36,7 @@ ArHalt(VOID);
|
|||||||
|
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
ArInitializeProcessor(VOID);
|
ArInitializeProcessor(IN PVOID ProcessorStructures);
|
||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
VOID
|
||||||
@ -277,6 +277,15 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
ArpInitializeProcessorRegisters(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
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
ArpInitializeSegments(VOID);
|
ArpInitializeSegments(VOID);
|
||||||
|
@ -49,7 +49,7 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters)
|
|||||||
XTOS_COMPILER_NAME, XTOS_COMPILER_VERSION);
|
XTOS_COMPILER_NAME, XTOS_COMPILER_VERSION);
|
||||||
|
|
||||||
/* Initialize boot CPU */
|
/* Initialize boot CPU */
|
||||||
ArInitializeProcessor();
|
ArInitializeProcessor(NULL);
|
||||||
|
|
||||||
/* Architecture specific kernel initialization */
|
/* Architecture specific kernel initialization */
|
||||||
KepInitializeMachine();
|
KepInitializeMachine();
|
||||||
|
Loading…
Reference in New Issue
Block a user