title "Processor State Save Restore" ;++ ; ; Copyright (c) 1996 Microsoft Corporation ; ; Module Name: ; ; procstat.asm ; ; Abstract: ; ; This module implements procedures for saving and restoring ; processor control state. ; ; Author: ; ; Shie-Lin Tzong (shielint) 30-Aug-1990 ; ; Environment: ; ; Kernel mode only. ; ; Revision History: ; ;-- .486p .xlist include ks386.inc include i386\kimacro.inc include callconv.inc .list page ,132 _TEXT SEGMENT DWORD PUBLIC 'CODE' ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING page ,132 subttl "Save Processor Control State" ;++ ; ; KiSaveProcessorControlState( ; PKPROCESSOR_STATE ProcessorState ; ); ; ; Routine Description: ; ; This routine saves the control subset of the processor state. ; (Saves the same information as KiSaveProcessorState EXCEPT that ; data in TrapFrame/ExceptionFrame=Context record is NOT saved.) ; Called by the debug subsystem, and KiSaveProcessorState() ; ; N.B. This procedure will save Dr7, and then 0 it. This prevents ; recursive hardware trace breakpoints and allows debuggers ; to work. ; ; Arguments: ; ; ProcessorState - Supplies the address of the processor state. ; Return Value: ; ; None. ; ;-- cPublicProc _KiSaveProcessorControlState ,1 mov edx, [esp+4] ; get processor state address ; ; Save special registers for debugger ; xor ecx,ecx mov eax, cr0 mov [edx].PsSpecialRegisters.SrCr0, eax mov eax, cr2 mov [edx].PsSpecialRegisters.SrCr2, eax mov eax, cr3 mov [edx].PsSpecialRegisters.SrCr3, eax mov [edx].PsSpecialRegisters.SrCr4, ecx mov eax,dr0 mov [edx].PsSpecialRegisters.SrKernelDr0,eax mov eax,dr1 mov [edx].PsSpecialRegisters.SrKernelDr1,eax mov eax,dr2 mov [edx].PsSpecialRegisters.SrKernelDr2,eax mov eax,dr3 mov [edx].PsSpecialRegisters.SrKernelDr3,eax mov eax,dr6 mov [edx].PsSpecialRegisters.SrKernelDr6,eax mov eax,dr7 mov dr7,ecx mov [edx].PsSpecialRegisters.SrKernelDr7,eax sgdt fword ptr [edx].PsSpecialRegisters.SrGdtr sidt fword ptr [edx].PsSpecialRegisters.SrIdtr str word ptr [edx].PsSpecialRegisters.SrTr sldt word ptr [edx].PsSpecialRegisters.SrLdtr stdRET _KiSaveProcessorControlState stdENDP _KiSaveProcessorControlState page ,132 subttl "Restore Processor Control State" ;++ ; ; KiRestoreProcessorControlState( ; PKPROCESSOR_STATE ProcessorState ; ); ; ; Routine Description: ; ; This routine restores the control subset of the processor state. ; (Restores the same information as KiRestoreProcessorState EXCEPT that ; data in TrapFrame/ExceptionFrame=Context record is NOT restored.) ; Called by the debug subsystem, and KiRestoreProcessorState() ; ; Arguments: ; ; ProcessorState - Supplies the address of the processor state. ; ; Return Value: ; ; None. ; ;-- cPublicProc _KiRestoreProcessorControlState,1 mov edx, [esp+4] ; (edx)->ProcessorState ; ; Restore special registers for debugger ; mov eax, [edx].PsSpecialRegisters.SrCr0 mov cr0, eax mov eax, [edx].PsSpecialRegisters.SrCr2 mov cr2, eax mov eax, [edx].PsSpecialRegisters.SrCr3 mov cr3, eax mov eax, [edx].PsSpecialRegisters.SrKernelDr0 mov dr0, eax mov eax, [edx].PsSpecialRegisters.SrKernelDr1 mov dr1, eax mov eax, [edx].PsSpecialRegisters.SrKernelDr2 mov dr2, eax mov eax, [edx].PsSpecialRegisters.SrKernelDr3 mov dr3, eax mov eax, [edx].PsSpecialRegisters.SrKernelDr6 mov dr6, eax mov eax, [edx].PsSpecialRegisters.SrKernelDr7 mov dr7, eax lgdt fword ptr [edx].PsSpecialRegisters.SrGdtr lidt fword ptr [edx].PsSpecialRegisters.SrIdtr lldt word ptr [edx].PsSpecialRegisters.SrLdtr stdRET _KiRestoreProcessorControlState stdENDP _KiRestoreProcessorControlState _TEXT ENDS END