Author: tkreuzer
Date: Sun Aug 24 18:51:55 2008
New Revision: 35617
URL:
http://svn.reactos.org/svn/reactos?rev=35617&view=rev
Log:
Implement KiSaveProcessorControlState and KiRestoreProcessorControlState
Modified:
branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/cpu.c
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/cpu.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntosk…
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/cpu.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/cpu.c [iso-8859-1] Sun Aug 24
18:51:55 2008
@@ -493,6 +493,86 @@
VOID
NTAPI
+KiRestoreProcessorControlState(PKPROCESSOR_STATE ProcessorState)
+{
+ /* Save the CR registers */
+ __writecr0(ProcessorState->SpecialRegisters.Cr0);
+// __writecr2(ProcessorState->SpecialRegisters.Cr2);
+ __writecr3(ProcessorState->SpecialRegisters.Cr3);
+ __writecr4(ProcessorState->SpecialRegisters.Cr4);
+ __writecr8(ProcessorState->SpecialRegisters.Cr8);
+
+ /* Save the DR registers */
+ __writedr(0, ProcessorState->SpecialRegisters.KernelDr0);
+ __writedr(1, ProcessorState->SpecialRegisters.KernelDr1);
+ __writedr(2, ProcessorState->SpecialRegisters.KernelDr2);
+ __writedr(3, ProcessorState->SpecialRegisters.KernelDr3);
+ __writedr(6, ProcessorState->SpecialRegisters.KernelDr6);
+ __writedr(7, ProcessorState->SpecialRegisters.KernelDr7);
+
+ /* Save GDT, IDT, LDT and TSS */
+ __lgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
+ __lldt(&ProcessorState->SpecialRegisters.Ldtr);
+ __ltr(&ProcessorState->SpecialRegisters.Tr);
+ __lidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
+
+ __ldmxcsr(&ProcessorState->SpecialRegisters.MxCsr);
+// ProcessorState->SpecialRegisters.DebugControl
+// ProcessorState->SpecialRegisters.LastBranchToRip
+// ProcessorState->SpecialRegisters.LastBranchFromRip
+// ProcessorState->SpecialRegisters.LastExceptionToRip
+// ProcessorState->SpecialRegisters.LastExceptionFromRip
+ __writemsr(X86_MSR_GSBASE, ProcessorState->SpecialRegisters.MsrGsBase);
+ __writemsr(X86_MSR_KERNEL_GSBASE, ProcessorState->SpecialRegisters.MsrGsSwap);
+ __writemsr(X86_MSR_STAR, ProcessorState->SpecialRegisters.MsrStar);
+ __writemsr(X86_MSR_LSTAR, ProcessorState->SpecialRegisters.MsrLStar);
+ __writemsr(X86_MSR_CSTAR, ProcessorState->SpecialRegisters.MsrCStar);
+ __writemsr(X86_MSR_SFMASK, ProcessorState->SpecialRegisters.MsrSyscallMask);
+
+}
+
+VOID
+NTAPI
+KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState)
+{
+ /* Save the CR registers */
+ ProcessorState->SpecialRegisters.Cr0 = __readcr0();
+ ProcessorState->SpecialRegisters.Cr2 = __readcr2();
+ ProcessorState->SpecialRegisters.Cr3 = __readcr3();
+ ProcessorState->SpecialRegisters.Cr4 = __readcr4();
+ ProcessorState->SpecialRegisters.Cr8 = __readcr8();
+
+ /* Save the DR registers */
+ ProcessorState->SpecialRegisters.KernelDr0 = __readdr(0);
+ ProcessorState->SpecialRegisters.KernelDr1 = __readdr(1);
+ ProcessorState->SpecialRegisters.KernelDr2 = __readdr(2);
+ ProcessorState->SpecialRegisters.KernelDr3 = __readdr(3);
+ ProcessorState->SpecialRegisters.KernelDr6 = __readdr(6);
+ ProcessorState->SpecialRegisters.KernelDr7 = __readdr(7);
+
+ /* Save GDT, IDT, LDT and TSS */
+ __sgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
+ __sldt(&ProcessorState->SpecialRegisters.Ldtr);
+ __str(&ProcessorState->SpecialRegisters.Tr);
+ __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
+
+ __stmxcsr(&ProcessorState->SpecialRegisters.MxCsr);
+// ProcessorState->SpecialRegisters.DebugControl =
+// ProcessorState->SpecialRegisters.LastBranchToRip =
+// ProcessorState->SpecialRegisters.LastBranchFromRip =
+// ProcessorState->SpecialRegisters.LastExceptionToRip =
+// ProcessorState->SpecialRegisters.LastExceptionFromRip =
+ ProcessorState->SpecialRegisters.MsrGsBase = __readmsr(X86_MSR_GSBASE);
+ ProcessorState->SpecialRegisters.MsrGsSwap = __readmsr(X86_MSR_KERNEL_GSBASE);
+ ProcessorState->SpecialRegisters.MsrStar = __readmsr(X86_MSR_STAR);
+ ProcessorState->SpecialRegisters.MsrLStar = __readmsr(X86_MSR_LSTAR);
+ ProcessorState->SpecialRegisters.MsrCStar = __readmsr(X86_MSR_CSTAR);
+ ProcessorState->SpecialRegisters.MsrSyscallMask = __readmsr(X86_MSR_SFMASK);
+}
+
+
+VOID
+NTAPI
KiInitializeMachineType(VOID)
{
/* Set the Machine Type we got from NTLDR */