mirror of https://github.com/lianthony/NT4.0
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
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
|