Save processor state during kernel initialization
Some checks failed
Builds / ExectOS (amd64) (push) Successful in 29s
Builds / ExectOS (i686) (push) Failing after 16s

This commit is contained in:
Rafal Kupiec 2023-11-15 15:00:38 +01:00
parent ccd0514416
commit d35dd4fce3
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
6 changed files with 99 additions and 0 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);
}

View File

@ -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;

View File

@ -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);
}