mirror of https://github.com/tongzx/nt5src
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.
146 lines
2.7 KiB
146 lines
2.7 KiB
/**
|
|
*** Copyright (C) 1996-97 Intel Corporation. All rights reserved.
|
|
***
|
|
*** The information and source code contained herein is the exclusive
|
|
*** property of Intel Corporation and may not be disclosed, examined
|
|
*** or reproduced in whole or in part without explicit written authorization
|
|
*** from the company.
|
|
**/
|
|
|
|
// TITLE("Manipulate Interrupt Request Level")
|
|
//++
|
|
//
|
|
// Module Name:
|
|
//
|
|
// emclk.s
|
|
//
|
|
// Abstract:
|
|
//
|
|
// This module implements the code necessary to adjust the ITM for time slicing,
|
|
// to calibrate the ITC to determine the Time Base fundamental unit value (the
|
|
// closest value for an update of 100ns).
|
|
//
|
|
//
|
|
// Author:
|
|
//
|
|
// Edward G. Chron (echron) 29-Apr-1996
|
|
//
|
|
// Environment:
|
|
//
|
|
// Kernel mode only.
|
|
//
|
|
// Revision History:
|
|
//
|
|
// 29-Apr-1996 Initial Version for EAS2.1
|
|
//
|
|
//--
|
|
|
|
#include "ksia64.h"
|
|
|
|
.file "emclk.s"
|
|
|
|
.global HalpPerformanceFrequency
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// HalpCalibrateTB (
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This function calibrates the time base by determining the frequency
|
|
// that the ITC is running at to determine the interval value for a
|
|
// 100 ns time increment (used by clock and profile).
|
|
//
|
|
// Arguments:
|
|
//
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
LEAF_ENTRY(HalpCalibrateTB)
|
|
|
|
add t2 = @gprel(HalpPerformanceFrequency), gp
|
|
add t1 = 1, r0
|
|
;;
|
|
st8 [t2] = t1
|
|
|
|
(p0) br.ret.sptk brp
|
|
|
|
LEAF_EXIT(HalpCalibrateTB)
|
|
//++
|
|
//
|
|
// VOID
|
|
// HalpUpdateITM (
|
|
// ULONGLONG HalpClockCount
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This function updates the ITM based on the current value of the
|
|
// ITC combined with the arguement supplied.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// HalpClockCount (a0) - Supplies the increment to be added to the current ITC value.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
LEAF_ENTRY(HalpUpdateITM)
|
|
|
|
mov t1 = ar.itc // get the current clock value
|
|
;;
|
|
add t1 = t1, a0 // current time plus interval
|
|
;;
|
|
mov cr.itm = t1 // update the itm with the new target time
|
|
|
|
(p0) br.ret.sptk brp
|
|
|
|
LEAF_EXIT(HalpUpdateITM)
|
|
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// HalpEnableInterrupts (
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This function enables interrupts.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
LEAF_ENTRY(HalpEnableInterrupts)
|
|
|
|
FAST_ENABLE_INTERRUPTS
|
|
|
|
(p0) br.ret.sptk brp
|
|
|
|
LEAF_EXIT(HalpEnableInterrupts)
|
|
|
|
|
|
LEAF_ENTRY(HalProcessorIdle)
|
|
|
|
FAST_ENABLE_INTERRUPTS
|
|
nop.m 0
|
|
br.ret.sptk b0
|
|
|
|
LEAF_EXIT(HalProcessorIdle)
|