Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

251 lines
6.6 KiB

title "Stall Execution Support"
;++
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
; aststall.asm
;
; Abstract:
; This module implements the code necessary to initialize the per
; microsecond count used by the KeStallExecution.
; This implementation is very specific to the AST Manhattan system.
;
; Author:
; Shie-Lin Tzong (shielint) 12-Jan-1990
;
; Environment:
; Kernel mode only.
;
; Revision History:
;
; bryanwi 20-Sep-90
; Add KiSetProfileInterval, KiStartProfileInterrupt,
; KiStopProfileInterrupt procedures.
; KiProfileInterrupt ISR.
; KiProfileList, KiProfileLock are delcared here.
;
; shielint 10-Dec-90
; Add performance counter support.
; Move system clock to irq8, ie we now use RTC to generate system
; clock. Performance count and Profile use timer 1 counter 0.
; The interval of the irq0 interrupt can be changed by
; KiSetProfileInterval. Performance counter does not care about the
; interval of the interrupt as long as it knows the rollover count.
; Note: Currently I implemented 1 performance counter for the whole
; i386 NT.
;
; John Vert (jvert) 11-Jul-1991
; Moved from ke\i386 to hal\i386. Removed non-HAL stuff
;
; shie-lin tzong (shielint) 13-March-92
; Move System clock back to irq0 and use RTC (irq8) to generate
; profile interrupt. Performance counter and system clock use time1
; counter 0 of 8254.
;
; Landy Wang (corollary!landy) 04-Dec-92
; Created this module by moving routines from ixclock.asm to here.
;
; Quang Phan (v-quangp) 07-Jan-93
; Modified for AST MP system.
;--
.386p
.xlist
include hal386.inc
include callconv.inc ; calling convention macros
include i386\ix8259.inc
include i386\kimacro.inc
include mac386.inc
include i386\ixcmos.inc
include i386\astmp.inc
include i386\astebi2.inc
.list
EXTRNP _DbgBreakPoint,0,IMPORT
extrn _EBI2_CallTab:DWORD
extrn _EBI2_MMIOTable:DWORD
;
; Constants
;
BaseStallCount EQU 40h ; Init. count
UpperLimitCount EQU 400h ; Upper limit count for debbuging
SysTimerUpperLimit EQU 0FFFFFFC0h ; SysTimer nears wrap arround
_DATA SEGMENT DWORD PUBLIC 'DATA'
EBI2_SysTimerCount dd 0 ;loc for EBI2GetSysTimer data
_DATA ends
_TEXT SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
page ,132
subttl "Initialize Stall Execution Counter"
;++
;
; VOID
; HalpInitializeStallExecution (
; IN CCHAR ProcessorNumber
; )
;
; Routine Description:
; This routine initialize the per Microsecond counter for
; KeStallExecutionProcessor.
;
; This function does not use the interval clock interrupt. Instead,
; it use the global system timer of 1 microsecond available in the
; AST Manhattan system.
;
; Arguments:
; ProcessorNumber - Processor Number
;
; Return Value:
; None.
;
; Note:
;--
cPublicProc _HalpInitializeStallExecution ,1
pushfd ; save caller's eflag
cli ; make sure interrupts are disabled
push ebx ; save ebx for internal use
mov ecx,BaseStallCount
;
;Sync on transition of the system timer.
;
Kise10:
lea eax, EBI2_SysTimerCount ;ptr to data
push eax
CALL_EBI2 GetSysTimer,2
if DBG
or eax,eax
je @f
int 3 ;trap for debugging
@@:
endif
mov ebx, EBI2_SysTimerCount ;save last SysTimer
lea eax, EBI2_SysTimerCount ;ptr to data
push eax
CALL_EBI2 GetSysTimer,2
if DBG
or eax,eax
je @f
int 3 ;trap for debugging
@@:
endif
cmp ebx, EBI2_SysTimerCount ;cmp with last SysTimer
jae Kise10 ;if wrap or the same.
mov ebx, EBI2_SysTimerCount ;last SysTimer
cmp ebx, SysTimerUpperLimit ; if near wrap around
ja kise10 ; then try again.
add ebx, 32 ;sample in 32 us.
mov eax, ecx ;init loop count
ALIGN 4
@@:
sub eax, 1 ; dec loop count
jnz short @b
;
;Check if system timer roll over.
;
lea eax, EBI2_SysTimerCount ;ptr to data
push eax
CALL_EBI2 GetSysTimer,2
if DBG
or eax,eax
je short @f
int 3 ;trap for debugging
@@:
endif
cmp EBI2_SysTimerCount, ebx ;cmp with last SysTimer
jb Kise30 ;go increment BaseStallCount
shr ecx,5 ;/32=count for 1us
mov PCR[PcStallScaleFactor], ecx
if DBG
cmp ecx, 0
jnz short @f
stdCall _DbgBreakPoint
@@:
cmp ecx, UpperLimitCount
jb short @f
stdCall _DbgBreakPoint
@@:
endif
pop ebx
popfd ; restore caller's eflags
stdRET _HalpInitializeStallExecution
;-------
;
;SysTimer does not reach the reference yet, increment stall count then retry.
;
Kise30:
inc ecx
jmp Kise10 ;try again
stdENDP _HalpInitializeStallExecution
page ,132
subttl "Stall Execution"
;++
;
; VOID
; KeStallExecutionProcessor (
; IN ULONG MicroSeconds
; )
;
; Routine Description:
; This function stalls execution for the specified number of microseconds.
; KeStallExecutionProcessor
;
; Arguments:
; MicroSeconds - Supplies the number of microseconds that execution is to be
; stalled.
;
; Return Value:
; None.
;
;--
MicroSeconds equ [esp + 4]
cPublicProc _KeStallExecutionProcessor ,1
mov ecx, MicroSeconds ; (ecx) = Microseconds
jecxz short kese10 ; return if no loop needed
mov eax, PCR[PcStallScaleFactor] ; get per microsecond
; loop count for the processor
mul ecx ; (eax) = desired loop count
if DBG
;
; Make sure we the loopcount is less than 4G and is not equal to zero
;
cmp edx, 0
jz short @f
int 3
@@: cmp eax,0
jnz short @f
int 3
@@:
endif
ALIGN 4
@@: sub eax, 1 ; (eax) = (eax) - 1
jnz short @b
kese10:
stdRET _KeStallExecutionProcessor
stdENDP _KeStallExecutionProcessor
_TEXT ends
end