[ros-diffs] [tkreuzer] 35617: Implement KiSaveProcessorControlState and KiRestoreProcessorControlState

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Mon Aug 25 01:51:56 CEST 2008


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/ntoskrnl/ke/amd64/cpu.c?rev=35617&r1=35616&r2=35617&view=diff
==============================================================================
--- 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 */



More information about the Ros-diffs mailing list