title "Processor State Save Restore" ;++ ; ; Copyright (c) 1989 Microsoft Corporation ; ; Module Name: ; ; procstat.asm ; ; Abstract: ; ; This module implements procedures for saving and restoring ; processor control state, and processor run&control state. ; These procedures support debugging of UP and MP systems. ; ; Author: ; ; Shie-Lin Tzong (shielint) 30-Aug-1990 ; ; Environment: ; ; Kernel mode only. ; ; Revision History: ; ;-- .386p .xlist include ks386.inc include i386\kimacro.inc include callconv.inc .list EXTRNP _KeContextToKframes,5 EXTRNP _KeContextFromKframes,3 extrn _KeFeatureBits:DWORD page ,132 _TEXT SEGMENT DWORD PUBLIC 'CODE' ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING subttl "Save Processor State" ;++ ; ; KiSaveProcessorState( ; PKTRAP_FRAME TrapFrame, ; PKEXCEPTION_FRAME ExceptionFrame ; ); ; ; Routine Description: ; ; This routine saves the processor state for debugger. When the current ; processor receives the request of IPI_FREEZE, it saves all the registers ; in a save area in the PRCB so the debugger can get access to them. ; ; Arguments: ; ; TrapFrame (esp+4) - Pointer to machine trap frame ; ; ExceptionFrame (esp+8) - Pointer to exception frame ; (IGNORED on the x86!) ; ; Return Value: ; ; None. ; ;-- cPublicProc _KiSaveProcessorState ,2 mov eax, [esp+4] ; (eax) -> TrapFrame mov edx, PCR[PcPrcb] ; (edx)->PrcbData add edx, PbProcessorState ; (edx)->ProcessorState push edx ; ; Copy the whole TrapFrame to our ProcessorState ; lea ecx, [edx].PsContextFrame mov dword ptr [ecx].CsContextFlags, CONTEXT_FULL OR CONTEXT_DEBUG_REGISTERS ; ecx - ContextFrame ; 0 - ExceptionFrame == NULL ; eax - TrapFrame stdCall _KeContextFromKframes, ; ; Save special registers for debugger ; ; TOS = PKPROCESSOR_STATE call _KiSaveProcessorControlState@4 stdRET _KiSaveProcessorState stdENDP _KiSaveProcessorState 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: ; ; Return Value: ; ; None. ; ;-- cPublicProc _KiSaveProcessorControlState ,1 mov edx, [esp+4] ; ProcessorState ; ; 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 test _KeFeatureBits, KF_CR4 jz short @f .586p mov eax, cr4 mov [edx].PsSpecialRegisters.SrCr4, eax .486p @@: 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 State" ;++ ; ; KiRestoreProcessorState( ; PKTRAP_FRAME TrapFrame, ; PKEXCEPTION_FRAME ExceptionFrame ; ); ; ; Routine Description: ; ; This routine Restores the processor state for debugger. When the ; control returns from debugger (UnFreezeExecution), this function ; restores the entire processor state. ; ; Arguments: ; ; TrapFrame (esp+4) - Pointer to machine trap frame ; ; ExceptionFrame (esp+8) - Pointer to exception frame ; (IGNORED on the x86!) ; ; Return Value: ; ; None. ; ;-- cPublicProc _KiRestoreProcessorState ,2 mov eax, [esp+4] ; (eax) -> TrapFrame mov edx, PCR[PcPrcb] ; (edx)->PrcbData add edx, PbProcessorState ; (edx)->ProcessorState push edx ; ; Copy the whole ContextFrame to TrapFrame ; lea ecx, [edx].PsContextFrame mov edx, [edx].PsContextFrame.CsSegCs and edx, MODE_MASK ; edx - Previous mode ; ecx - ContextFrame ; 0 - ExceptionFrame == NULL ; eax - TrapFrame stdCall _KeContextToKframes, ; ; Save special registers for debugger ; ; TOS = KPROCESSOR_STATE call _KiRestoreProcessorControlState@4 stdRET _KiRestoreProcessorState stdENDP _KiRestoreProcessorState page ,132 subttl "Restore Processor Control State" ;++ ; ; KiRestoreProcessorControlState( ; ); ; ; 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: ; ; 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 test _KeFeatureBits, KF_CR4 jz short @f .586p mov eax, [edx].PsSpecialRegisters.SrCr4 mov cr4, eax .486p @@: 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 ; ; Force the TSS descriptor into a non-busy state, so we don't fault ; when we load the TR. ; mov eax, [edx].PsSpecialRegisters.SrGdtr+2 ; (eax)->GDT base xor ecx, ecx mov cx, word ptr [edx].PsSpecialRegisters.SrTr add eax, 5 add eax, ecx ; (eax)->TSS Desc. Byte and byte ptr [eax],NOT 2 ltr word ptr [edx].PsSpecialRegisters.SrTr lldt word ptr [edx].PsSpecialRegisters.SrLdtr stdRET _KiRestoreProcessorControlState stdENDP _KiRestoreProcessorControlState _TEXT ENDS END