Save processor state during kernel initialization
This commit is contained in:
parent
ccd0514416
commit
d35dd4fce3
@ -41,6 +41,10 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
|||||||
IN PVOID StartContext,
|
IN PVOID StartContext,
|
||||||
IN PCONTEXT ContextRecord);
|
IN PCONTEXT ContextRecord);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepSaveProcessorState(OUT PKPROCESSOR_STATE CpuState);
|
||||||
|
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
KepStartKernel(VOID);
|
KepStartKernel(VOID);
|
||||||
|
@ -41,6 +41,10 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
|||||||
IN PVOID StartContext,
|
IN PVOID StartContext,
|
||||||
IN PCONTEXT ContextRecord);
|
IN PCONTEXT ContextRecord);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepSaveProcessorState(OUT PKPROCESSOR_STATE CpuState);
|
||||||
|
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
KepStartKernel(VOID);
|
KepStartKernel(VOID);
|
||||||
|
@ -35,6 +35,9 @@ KepInitializeKernel(VOID)
|
|||||||
/* Initialize CPU power state structures */
|
/* Initialize CPU power state structures */
|
||||||
PoInitializeProcessorControlBlock(Prcb);
|
PoInitializeProcessorControlBlock(Prcb);
|
||||||
|
|
||||||
|
/* Save processor state */
|
||||||
|
KepSaveProcessorState(&Prcb->ProcessorState);
|
||||||
|
|
||||||
/* Initialize Idle process */
|
/* Initialize Idle process */
|
||||||
RtlInitializeListHead(&KepProcessListHead);
|
RtlInitializeListHead(&KepProcessListHead);
|
||||||
PageDirectory[0] = 0;
|
PageDirectory[0] = 0;
|
||||||
|
@ -51,3 +51,50 @@ KeGetCurrentThread(VOID)
|
|||||||
{
|
{
|
||||||
return (PKTHREAD)ArReadGSQuadWord(FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread));
|
return (PKTHREAD)ArReadGSQuadWord(FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the current processor state.
|
||||||
|
*
|
||||||
|
* @param State
|
||||||
|
* Supplies a pointer to the processor state structure.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepSaveProcessorState(OUT PKPROCESSOR_STATE CpuState)
|
||||||
|
{
|
||||||
|
/* Save CR registers */
|
||||||
|
CpuState->SpecialRegisters.Cr0 = ArReadControlRegister(0);
|
||||||
|
CpuState->SpecialRegisters.Cr2 = ArReadControlRegister(2);
|
||||||
|
CpuState->SpecialRegisters.Cr3 = ArReadControlRegister(3);
|
||||||
|
CpuState->SpecialRegisters.Cr4 = ArReadControlRegister(4);
|
||||||
|
CpuState->SpecialRegisters.Cr8 = ArReadControlRegister(8);
|
||||||
|
|
||||||
|
/* Save DR registers */
|
||||||
|
CpuState->SpecialRegisters.KernelDr0 = ArReadDebugRegister(0);
|
||||||
|
CpuState->SpecialRegisters.KernelDr1 = ArReadDebugRegister(1);
|
||||||
|
CpuState->SpecialRegisters.KernelDr2 = ArReadDebugRegister(2);
|
||||||
|
CpuState->SpecialRegisters.KernelDr3 = ArReadDebugRegister(3);
|
||||||
|
CpuState->SpecialRegisters.KernelDr6 = ArReadDebugRegister(6);
|
||||||
|
CpuState->SpecialRegisters.KernelDr7 = ArReadDebugRegister(7);
|
||||||
|
|
||||||
|
/* Save MSR registers */
|
||||||
|
CpuState->SpecialRegisters.MsrGsBase = ArReadModelSpecificRegister(X86_MSR_GSBASE);
|
||||||
|
CpuState->SpecialRegisters.MsrGsSwap = ArReadModelSpecificRegister(X86_MSR_KERNEL_GSBASE);
|
||||||
|
CpuState->SpecialRegisters.MsrCStar = ArReadModelSpecificRegister(X86_MSR_CSTAR);
|
||||||
|
CpuState->SpecialRegisters.MsrLStar = ArReadModelSpecificRegister(X86_MSR_LSTAR);
|
||||||
|
CpuState->SpecialRegisters.MsrStar = ArReadModelSpecificRegister(X86_MSR_STAR);
|
||||||
|
CpuState->SpecialRegisters.MsrSyscallMask = ArReadModelSpecificRegister(X86_MSR_FMASK);
|
||||||
|
|
||||||
|
/* Save XMM control/status register */
|
||||||
|
CpuState->SpecialRegisters.MxCsr = ArReadMxCsrRegister();
|
||||||
|
|
||||||
|
/* Save GDT, IDT, LDT and TaskRegister */
|
||||||
|
ArStoreGlobalDescriptorTable(&CpuState->SpecialRegisters.Gdtr.Limit);
|
||||||
|
ArStoreInterruptDescriptorTable(&CpuState->SpecialRegisters.Idtr.Limit);
|
||||||
|
ArStoreLocalDescriptorTable(&CpuState->SpecialRegisters.Ldtr);
|
||||||
|
ArStoreTaskRegister(&CpuState->SpecialRegisters.Tr);
|
||||||
|
}
|
||||||
|
@ -35,6 +35,9 @@ KepInitializeKernel(VOID)
|
|||||||
/* Initialize CPU power state structures */
|
/* Initialize CPU power state structures */
|
||||||
PoInitializeProcessorControlBlock(Prcb);
|
PoInitializeProcessorControlBlock(Prcb);
|
||||||
|
|
||||||
|
/* Save processor state */
|
||||||
|
KepSaveProcessorState(&Prcb->ProcessorState);
|
||||||
|
|
||||||
/* Initialize Idle process */
|
/* Initialize Idle process */
|
||||||
RtlInitializeListHead(&KepProcessListHead);
|
RtlInitializeListHead(&KepProcessListHead);
|
||||||
PageDirectory[0] = 0;
|
PageDirectory[0] = 0;
|
||||||
|
@ -51,3 +51,41 @@ KeGetCurrentThread(VOID)
|
|||||||
{
|
{
|
||||||
return (PKTHREAD)ArReadFSDualWord(FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread));
|
return (PKTHREAD)ArReadFSDualWord(FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the current processor state.
|
||||||
|
*
|
||||||
|
* @param State
|
||||||
|
* Supplies a pointer to the processor state structure.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepSaveProcessorState(OUT PKPROCESSOR_STATE CpuState)
|
||||||
|
{
|
||||||
|
/* Save CR registers */
|
||||||
|
CpuState->SpecialRegisters.Cr0 = ArReadControlRegister(0);
|
||||||
|
CpuState->SpecialRegisters.Cr2 = ArReadControlRegister(2);
|
||||||
|
CpuState->SpecialRegisters.Cr3 = ArReadControlRegister(3);
|
||||||
|
CpuState->SpecialRegisters.Cr4 = ArReadControlRegister(4);
|
||||||
|
|
||||||
|
/* Save DR registers */
|
||||||
|
CpuState->SpecialRegisters.KernelDr0 = ArReadDebugRegister(0);
|
||||||
|
CpuState->SpecialRegisters.KernelDr1 = ArReadDebugRegister(1);
|
||||||
|
CpuState->SpecialRegisters.KernelDr2 = ArReadDebugRegister(2);
|
||||||
|
CpuState->SpecialRegisters.KernelDr3 = ArReadDebugRegister(3);
|
||||||
|
CpuState->SpecialRegisters.KernelDr6 = ArReadDebugRegister(6);
|
||||||
|
CpuState->SpecialRegisters.KernelDr7 = ArReadDebugRegister(7);
|
||||||
|
|
||||||
|
/* Save XMM control/status register */
|
||||||
|
CpuState->SpecialRegisters.MxCsr = ArReadMxCsrRegister();
|
||||||
|
|
||||||
|
/* Save GDT, IDT, LDT and TaskRegister */
|
||||||
|
ArStoreGlobalDescriptorTable(&CpuState->SpecialRegisters.Gdtr.Limit);
|
||||||
|
ArStoreInterruptDescriptorTable(&CpuState->SpecialRegisters.Idtr.Limit);
|
||||||
|
ArStoreLocalDescriptorTable(&CpuState->SpecialRegisters.Ldtr);
|
||||||
|
ArStoreTaskRegister(&CpuState->SpecialRegisters.Tr);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user