Leaked source code of windows server 2003
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.
 
 
 
 
 
 

352 lines
7.0 KiB

;++
;
; Copyright (c) 2002 Microsoft Corporation
;
; Module Name:
;
; irqli386.inc - 386 machine specific IRQL manipulation routines
;
; Abstract:
;
; This module provides macros to raise, lower and get current IRQL.
; These routines are abstracted through macros in order to facilitate
; generation of a kernel that manipulates IRQL directly.
;
; If _APIC_TPR_ is defined, IRQL is manipulated directly via the PIC.
; Otherwise, the appropriate HAL routine is called.
;
; Author:
;
; Forrest Foltz (forrestf) 1/30/2001
;
;
; This module exposes four public macros:
;
; CurrentIrql
; RaiseIrql
; LowerIrql
; LowerIrqlRet
;
ifdef _APIC_TPR_
APIC_TPR equ dword ptr ds:0FFFE0080h
extrn _HalpIRQLToTPR:DWORD
extrn _HalpVectorToIRQL:DWORD
;++
;
; CurrentIrql
;
; Macro Description:
;
; This macro retrieves the current IRQL in eax
;
; Arguments:
;
; None
;
; Return Value:
;
; The current IRQL is returned in EAX.
;
;--
CurrentIrql macro
mov eax, APIC_TPR
shr eax, 4
add eax, _HalpVectorToIRQL
movzx eax, BYTE PTR [eax]
endm
;++
;
; SetIrql Irql
;
; Macro Description:
;
; This macro sets IRQL to the supplied value. This macro is an
; internal routine only.
;
; Arguments:
;
; Irql - provides the value for the desired new IRQL. It is supplied in
; one of three forms:
;
; cl - the value is zero-extended into ecx before use
; ecx - cl has already been zero-extended
; const - Constant expression is used directly
;
; Return Value:
;
; None.
;
;--
SetIrql macro Irql
ifidn <Irql>, <ecx>
add ecx, _HalpIRQLToTPR
movzx ecx, BYTE PTR [ecx]
else
ifidn <Irql>, <cl>
movzx ecx, cl
add ecx, _HalpIRQLToTPR
movzx ecx, BYTE PTR [ecx]
else
ifnb <Irql>
mov ecx, _HalpIRQLToTPR
movzx ecx, BYTE PTR [ecx+Irql]
else
.err Irqlparm not supplied to SetIrql
endif
endif
endif
mov APIC_TPR, ecx
endm
;++
;
; LowerIrql Irql
;
; Macro Description:
;
; This macro lowers IRQL to the supplied value.
;
; Arguments:
;
; Irql - provides the value for the desired new IRQL. It is supplied in
; one of three forms:
;
; cl - the value is zero-extended into ecx before use
; ecx - cl has already been zero-extended
; const - Constant expression is used directly
;
; Return Value:
;
; None.
;
;--
LowerIrql macro Irql
SetIrql Irql
mov ecx, APIC_TPR
endm
;++
;
; LowerIrqlRet Irql
;
; Macro Description:
;
; This macro lowers IRQL to the supplied value and returns to the calling
; routine.
;
; Arguments:
;
; Irql - provides the value for the desired new IRQL. It is supplied in
; one of three forms:
;
; cl - the value is zero-extended into ecx before use
; ecx - cl has already been zero-extended
; const - Constant expression is used directly
;
; Return Value:
;
; None.
;
; Comments:
;
; This macro should be used only in cases where the function epilogue is
; known to be identical to that of KfLowerIrql().
;
;--
LowerIrqlRet macro Irql
LowerIrql Irql
ret
endm
;++
;
; RaiseIrql Irql [,NoOld]
;
; Macro Description:
;
; This macro raises IRQL to the supplied value.
;
; Arguments:
;
; Irql - provides the value for the desired new IRQL. It is supplied in
; one of three forms:
;
; cl - the value is zero-extended into ecx before use
; ecx - cl has already been zero-extended
; const - Constant expression is used directly
;
; NoOld - Optional. If supplied, no value is returned in eax.
;
; Return Value:
;
; Unless the NoOld flag is supplied, eax contains the zero-extended
; value of the IRQL before raising.
;
;--
RaiseIrql macro Irql, nooldirql
ifidn <nooldirql>, <NoOld>
else
ifnb <nooldirql>
.err RaiseIrql used with optional parm other than NoOld
else
CurrentIrql
endif
endif
SetIrql Irql
endm
else
extrn __imp_@KfRaiseIrql@4:DWORD
extrn __imp_@KfLowerIrql@4:DWORD
extrn __imp__KeGetCurrentIrql@0:DWORD
;++
;
; CurrentIrql
;
; Macro Description:
;
; This macro retrieves the current IRQL in eax
;
; Arguments:
;
; None
;
; Return Value:
;
; The current IRQL is returned in EAX.
;
;--
CurrentIrql macro
call __imp__KeGetCurrentIrql@0
endm
;++
;
; LowerIrql Irql
;
; Macro Description:
;
; This macro lowers IRQL to the supplied value.
;
; Arguments:
;
; Irql - provides the value for the desired new IRQL. It is supplied in
; one of three forms:
;
; cl - the value is zero-extended into ecx before use
; ecx - cl has already been zero-extended
; const - Constant expression is used directly
;
; Return Value:
;
; None.
;
;--
LowerIrql macro Irql
ifidn <Irql>, <cl>
else
ifidn <Irql>, <ecx>
else
mov ecx, Irql
endif
endif
call __imp_@KfLowerIrql@4
endm
;++
;
; LowerIrqlRet Irql
;
; Macro Description:
;
; This macro lowers IRQL to the supplied value and returns to the calling
; routine.
;
; Arguments:
;
; Irql - provides the value for the desired new IRQL. It is supplied in
; one of three forms:
;
; cl - the value is zero-extended into ecx before use
; ecx - cl has already been zero-extended
; const - Constant expression is used directly
;
; Return Value:
;
; None.
;
; Comments:
;
; This macro should be used only in cases where the function epilogue is
; known to be identical to that of KfLowerIrql().
;
;--
LowerIrqlRet macro Irql
ifidn <Irql>, <cl>
else
ifidn <Irql>, <ecx>
else
mov ecx, Irql
endif
endif
jmp __imp_@KfLowerIrql@4
endm
;++
;
; RaiseIrql Irql [,NoOld]
;
; Macro Description:
;
; This macro raises IRQL to the supplied value.
;
; Arguments:
;
; Irql - provides the value for the desired new IRQL. It is supplied in
; one of three forms:
;
; cl - the value is zero-extended into ecx before use
; ecx - cl has already been zero-extended
; const - Constant expression is used directly
;
; NoOld - Optional. If supplied, no value is returned in eax.
;
; Return Value:
;
; Unless the NoOld flag is supplied, eax contains the zero-extended
; value of the IRQL before raising.
;
;--
RaiseIrql macro Irql
ifidn <Irql>, <cl>
else
ifidn <Irql>, <ecx>
else
mov ecx, Irql
endif
endif
call __imp_@KfRaiseIrql@4
endm
endif