Allow to initialize CPU with allocated processor structures
This commit is contained in:
parent
fb099a1988
commit
3c3a756771
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user