windows-nt/Source/XPSP1/NT/base/ntos/ex/alpha/gettick.s
2020-09-26 16:20:57 +08:00

85 lines
2.4 KiB
ArmAsm
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// TITLE("Get Tick Count")
//++
//
// Copyright (c) 1992 Microsoft Corporation
// Copyright (c) 1992 Digital Equipment Corporation
//
// Module Name:
//
// gettick.s
//
// Abstract:
//
// This module contains the implementation for the get tick count
// system service that returns the number of milliseconds since the
// system was booted.
//
// Author:
//
// David N. Cutler (davec) 10-Sep-1992
//
// Environment:
//
// Kernel mode.
//
// Revision History:
//
// Thomas Van Baak (tvb) 5-Oct-1992
//
// Adapted for Alpha AXP.
//
//--
#include "ksalpha.h"
SBTTL("Get Tick Count")
//++
//
// ULONG
// NtGetTickCount (
// VOID
// )
//
// Routine Description:
//
// This function computes the number of milliseconds since the system
// was booted. The computation is performed by multiplying the clock
// interrupt count by a scaled fixed binary multiplier and then right
// shifting the 64-bit result to extract the 32-bit millisecond count.
//
// The multiplier fraction is scaled by 24 bits. Thus for a 100 Hz clock
// rate, there are 10 ticks per millisecond, and the multiplier is
// 0x0a000000 (10 << 24). For a 128 Hz clock rate, there are 7.8125, or
// 7 13/16 ticks per millisecond, and so the multiplier is 0x07d00000.
//
// This effectively replaces a (slow) divide instruction with a (fast)
// multiply instruction. The multiplier value is only calculated once
// based on the TimeIncrement value (clock tick interval in 100ns units).
//
// N.B. The tick count value wraps every 2^32 milliseconds (49.71 days).
//
// Arguments:
//
// None.
//
// Return Value:
//
// The number of milliseconds since the system was booted is returned
// as the function value.
//
//--
LEAF_ENTRY(NtGetTickCount)
ldl t0, KeTickCount // get current tick count value
zap t0, 0xf0, t0 // convert to unsigned longword
ldl t1, ExpTickCountMultiplier // get tick count multiplier
zap t1, 0xf0, t1 // convert to unsigned longword
mulq t0, t1, v0 // compute 64-bit product
srl v0, 24, v0 // shift off 24-bit fraction part
addl v0, 0, v0 // keep 32-bit canonical ULONG integer part
ret zero, (ra) // return
.end NtGetTickCount