You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
282 lines
7.4 KiB
282 lines
7.4 KiB
title "Processor State Save Restore"
|
|
;++
|
|
;
|
|
; Copyright (c) 2000 Microsoft Corporation
|
|
;
|
|
; Module Name:
|
|
;
|
|
; procstat.asm
|
|
;
|
|
; Abstract:
|
|
;
|
|
; This module implements routines to save and restore processor control
|
|
; state.
|
|
;
|
|
; Author:
|
|
;
|
|
; David N. Cutler (davec) 24-Aug-2000
|
|
;
|
|
; Environment:
|
|
;
|
|
; Kernel mode only.
|
|
;
|
|
;--
|
|
|
|
include ksamd64.inc
|
|
|
|
subttl "Restore Processor Control State"
|
|
;++
|
|
;
|
|
; KiRestoreProcessorControlState (
|
|
; VOID
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This routine restores the control state of the current processor.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; ProcessorState (rcx) - Supplies a pointer to a processor state structure.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY KiRestoreProcessorControlState, _TEXT$00
|
|
|
|
mov rax, PsCr0[rcx] ; restore processor control registers
|
|
mov cr0, rax ;
|
|
mov rax, PsCr3[rcx] ;
|
|
mov cr3, rax ;
|
|
mov rax, PsCr4[rcx] ;
|
|
mov cr4, rax ;
|
|
mov rax, PsCr8[rcx] ;
|
|
mov cr8, rax ;
|
|
|
|
xor eax, eax ; restore debug registers
|
|
mov dr7, rax ;
|
|
mov rax, PsKernelDr0[rcx] ;
|
|
mov dr0, rax ;
|
|
mov rax, PsKernelDr1[rcx] ;
|
|
mov dr1, rax ;
|
|
mov rax, PsKernelDr2[rcx] ;
|
|
mov dr2, rax ;
|
|
mov rax, PsKernelDr3[rcx] ;
|
|
mov dr3, rax ;
|
|
xor edx, edx ;
|
|
mov dr6, rdx ;
|
|
mov rax, PsKernelDr7[rcx] ;
|
|
mov dr7, rax ;
|
|
|
|
lgdt fword ptr PsGdtr[rcx] ; restore GDTR
|
|
lidt fword ptr PsIdtr[rcx] ; restore IDTR
|
|
|
|
;
|
|
; Force the TSS descriptor into a non-busy state, so we don't fault
|
|
; when we load the TR.
|
|
;
|
|
|
|
movzx eax, word ptr PsTr[rcx] ; rax == TSS selector
|
|
add rax, PsGdtr[rcx]+2 ; rax -> TSS GDT entry
|
|
and byte ptr [rax]+5, NOT 2 ; Busy bit clear
|
|
ltr word ptr PsTr[rcx] ; restore TR
|
|
|
|
sub eax, eax ; load a NULL selector into the ldt
|
|
lldt ax
|
|
|
|
ldmxcsr dword ptr PsMxCsr[rcx] ; restore XMM control/status
|
|
ret ; return
|
|
|
|
LEAF_END KiRestoreProcessorControlState, _TEXT$00
|
|
|
|
subttl "Save Processor Control State"
|
|
;++
|
|
;
|
|
; KiSaveProcessorControlState (
|
|
; PKPROCESSOR_STATE ProcessorState
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This routine saves the control state of the current processor.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; ProcessorState (rcx) - Supplies a pointer to a processor state structure.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY KiSaveProcessorControlState, _TEXT$00
|
|
|
|
mov rax, cr0 ; save processor control state
|
|
mov PsCr0[rcx], rax ;
|
|
mov rax, cr2 ;
|
|
mov PsCr2[rcx], rax ;
|
|
mov rax, cr3 ;
|
|
mov PsCr3[rcx], rax ;
|
|
mov rax, cr4 ;
|
|
mov PsCr4[rcx], rax ;
|
|
mov rax, cr8 ;
|
|
mov PsCr8[rcx], rax ;
|
|
|
|
mov rax, dr0 ; save debug registers
|
|
mov PsKernelDr0[rcx], rax ;
|
|
mov rax, dr1 ;
|
|
mov PsKernelDr1[rcx], rax ;
|
|
mov rax, dr2 ;
|
|
mov PsKernelDr2[rcx], rax ;
|
|
mov rax, dr3 ;
|
|
mov PsKernelDr3[rcx], rax ;
|
|
mov rax, dr6 ;
|
|
mov PsKernelDr6[rcx], rax ;
|
|
mov rax, dr7 ;
|
|
mov PsKernelDr7[rcx], rax ;
|
|
xor eax, eax ;
|
|
mov dr7, rax ;
|
|
|
|
sgdt fword ptr PsGdtr[rcx] ; save GDTR
|
|
sidt fword ptr PsIdtr[rcx] ; save IDTR
|
|
|
|
str word ptr PsTr[rcx] ; save TR
|
|
sldt word ptr PsLdtr[rcx] ; save LDTR
|
|
|
|
stmxcsr dword ptr PsMxCsr[rcx] ; save XMM control/status
|
|
ret ; return
|
|
|
|
LEAF_END KiSaveProcessorControlState, _TEXT$00
|
|
|
|
subttl "Restore Floating Point State"
|
|
;++
|
|
;
|
|
; NTSTATUS
|
|
; KeRestoreFloatingPointState (
|
|
; PKFLOATING_STATE SaveArea
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This routine restore the floating status and control information from
|
|
; the specified save area.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; SaveArea (rcx) - Supplies a pointer to a floating state save area.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; STATUS_SUCCESS.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY KeRestoreFloatingPointState, _TEXT$00
|
|
|
|
ldmxcsr FsMxCsr[rcx] ; restore floating status/control
|
|
xor eax, eax ; set success status
|
|
ret ; return
|
|
|
|
LEAF_END KeRestoreFloatingPointState, _TEXT$00
|
|
|
|
subttl "Save Floating Point State"
|
|
;++
|
|
;
|
|
; NTSTATUS
|
|
; KeSaveFloatingPointState (
|
|
; PKFLOATING_STATE SaveArea
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This routine saves the floating status and control information in the
|
|
; specified save area and sets the control information to the system
|
|
; defautl value.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; SaveArea (rcx) - Supplies a pointer to a floating state save area.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; STATUS_SUCCESS.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY KeSaveFloatingPointState, _TEXT$00
|
|
|
|
stmxcsr FsMxCsr[rcx] ; save floating status/control
|
|
ldmxcsr dword ptr gs:[PcMxCsr] ; set default XMM control/status
|
|
xor eax, eax ; set success status
|
|
ret ;
|
|
|
|
LEAF_END KeSaveFloatingPointState, _TEXT$00
|
|
|
|
subttl "Restore Legacy Floating Point State"
|
|
;++
|
|
;
|
|
; VOID
|
|
; KeRestoreLegacyFloatingPointState (
|
|
; PLEGACY_SAVE_AREA NpxFrame
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This routine restores the legacy floating point state for the current
|
|
; thread.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; NpxFrame (rcx) - Supplies the address of the legacy floating save area.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY KeRestoreLegacyFloatingPointState, _TEXT$00
|
|
|
|
mov ax, LfControlWord[rcx] ; save current control word
|
|
mov word ptr LfControlWord[rcx], 03fh ; set to mask all exceptions
|
|
frstord [rcx] ; restore legacy floating state
|
|
mov LfControlWord[rcx], ax ; restore control word
|
|
fldcw word ptr LfControlWord[rcx] ; load legacy control word
|
|
ret ; return
|
|
|
|
LEAF_END KeRestoreLegacyFloatingPointState, _TEXT$00
|
|
|
|
subttl "Save Legacy Floating Point State"
|
|
;++
|
|
;
|
|
; VOID
|
|
; KeSaveLegacyFloatingPointState (
|
|
; PLEGACY_SAVE_AREA NpxFrame
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This routine saves the legacy floating state for the current thread.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; NpxFrame (rcx) - Supplies the address of the legacy floating save area.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY KeSaveLegacyFloatingPointState, _TEXT$00
|
|
|
|
fnsaved [rcx] ; save legacy floating state
|
|
ret ;
|
|
|
|
LEAF_END KeSaveLegacyFloatingPointState, _TEXT$00
|
|
|
|
end
|