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.
342 lines
5.7 KiB
342 lines
5.7 KiB
/*++
|
|
|
|
Copyright (c) 1994 Digital Equipment Corporation
|
|
|
|
Module Name:
|
|
|
|
evxprof.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the Profile Counter using the performance
|
|
counters within the EV5 core. This module is appropriate for all
|
|
machines based on microprocessors using the EV5 core.
|
|
|
|
N.B. - This module assumes that all processors in a multiprocessor
|
|
system are running the microprocessor at the same clock speed.
|
|
|
|
Author:
|
|
|
|
Michael D. Kinney 14-Aug-1995
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "halp.h"
|
|
|
|
BOOLEAN
|
|
Hal21064QueryProfileInterval(
|
|
IN KPROFILE_SOURCE Source
|
|
);
|
|
|
|
BOOLEAN
|
|
Hal21164QueryProfileInterval(
|
|
IN KPROFILE_SOURCE Source
|
|
);
|
|
|
|
NTSTATUS
|
|
Hal21064SetProfileSourceInterval(
|
|
IN KPROFILE_SOURCE ProfileSource,
|
|
IN OUT ULONG *Interval
|
|
);
|
|
|
|
NTSTATUS
|
|
Hal21164SetProfileSourceInterval(
|
|
IN KPROFILE_SOURCE ProfileSource,
|
|
IN OUT ULONG *Interval
|
|
);
|
|
|
|
ULONG
|
|
Hal21064SetProfileInterval (
|
|
IN ULONG Interval
|
|
);
|
|
|
|
ULONG
|
|
Hal21164SetProfileInterval (
|
|
IN ULONG Interval
|
|
);
|
|
|
|
VOID
|
|
Hal21064StartProfileInterrupt (
|
|
KPROFILE_SOURCE ProfileSource
|
|
);
|
|
|
|
VOID
|
|
Hal21164StartProfileInterrupt (
|
|
KPROFILE_SOURCE ProfileSource
|
|
);
|
|
|
|
VOID
|
|
Hal21064StopProfileInterrupt (
|
|
KPROFILE_SOURCE ProfileSource
|
|
);
|
|
|
|
VOID
|
|
Hal21164StopProfileInterrupt (
|
|
KPROFILE_SOURCE ProfileSource
|
|
);
|
|
|
|
|
|
BOOLEAN
|
|
HalQueryProfileInterval(
|
|
IN KPROFILE_SOURCE Source
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Given a profile source, returns whether or not that source is
|
|
supported.
|
|
|
|
Arguments:
|
|
|
|
Source - Supplies the profile source
|
|
|
|
Return Value:
|
|
|
|
TRUE - Profile source is supported
|
|
|
|
FALSE - Profile source is not supported
|
|
|
|
--*/
|
|
|
|
{
|
|
if (HalpIoArchitectureType == EV5_PROCESSOR_MODULE) {
|
|
return(Hal21164QueryProfileInterval(Source));
|
|
} else {
|
|
return(Hal21064QueryProfileInterval(Source));
|
|
}
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
HalSetProfileSourceInterval(
|
|
IN KPROFILE_SOURCE ProfileSource,
|
|
IN OUT ULONG *Interval
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Sets the profile interval for a specified profile source
|
|
|
|
Arguments:
|
|
|
|
ProfileSource - Supplies the profile source
|
|
|
|
Interval - Supplies the specified profile interval
|
|
Returns the actual profile interval
|
|
|
|
Return Value:
|
|
|
|
NTSTATUS
|
|
|
|
--*/
|
|
|
|
{
|
|
if (HalpIoArchitectureType == EV5_PROCESSOR_MODULE) {
|
|
return(Hal21164SetProfileSourceInterval(ProfileSource,Interval));
|
|
} else {
|
|
return(Hal21064SetProfileSourceInterval(ProfileSource,Interval));
|
|
}
|
|
}
|
|
|
|
|
|
ULONG
|
|
HalSetProfileInterval (
|
|
IN ULONG Interval
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sets the profile interrupt interval.
|
|
|
|
Arguments:
|
|
|
|
Interval - Supplies the desired profile interval in 100ns units.
|
|
|
|
Return Value:
|
|
|
|
The actual profile interval.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (HalpIoArchitectureType == EV5_PROCESSOR_MODULE) {
|
|
return(Hal21164SetProfileInterval(Interval));
|
|
} else {
|
|
return(Hal21064SetProfileInterval(Interval));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
HalStartProfileInterrupt (
|
|
KPROFILE_SOURCE ProfileSource
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine turns on the profile interrupt.
|
|
|
|
N.B. This routine must be called at PROCLK_LEVEL while holding the
|
|
profile lock.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (HalpIoArchitectureType == EV5_PROCESSOR_MODULE) {
|
|
Hal21164StartProfileInterrupt(ProfileSource);
|
|
} else {
|
|
Hal21064StartProfileInterrupt(ProfileSource);
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
HalStopProfileInterrupt (
|
|
KPROFILE_SOURCE ProfileSource
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine turns off the profile interrupt.
|
|
|
|
N.B. This routine must be called at PROCLK_LEVEL while holding the
|
|
profile lock.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (HalpIoArchitectureType == EV5_PROCESSOR_MODULE) {
|
|
Hal21164StopProfileInterrupt(ProfileSource);
|
|
} else {
|
|
Hal21064StopProfileInterrupt(ProfileSource);
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
HalpInitializeProfiler(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine is called during initialization to initialize profiling
|
|
for each processor in the system.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (HalpIoArchitectureType == EV5_PROCESSOR_MODULE) {
|
|
Halp21164InitializeProfiler();
|
|
} else {
|
|
Halp21064InitializeProfiler();
|
|
}
|
|
}
|
|
|
|
NTSTATUS
|
|
HalpProfileSourceInformation (
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferLength,
|
|
OUT PULONG ReturnedLength
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Returns the HAL_PROFILE_SOURCE_INFORMATION for this processor.
|
|
|
|
Arguments:
|
|
|
|
Buffer - output buffer
|
|
BufferLength - length of buffer on input
|
|
ReturnedLength - The length of data returned
|
|
|
|
Return Value:
|
|
|
|
STATUS_SUCCESS
|
|
STATUS_BUFFER_TOO_SMALL - The ReturnedLength contains the buffersize
|
|
currently needed.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (HalpIoArchitectureType == EV5_PROCESSOR_MODULE) {
|
|
return(Halp21164ProfileSourceInformation(Buffer,BufferLength,ReturnedLength));
|
|
} else {
|
|
return(Halp21064ProfileSourceInformation(Buffer,BufferLength,ReturnedLength));
|
|
}
|
|
}
|
|
|
|
NTSTATUS
|
|
HalpProfileSourceInterval (
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferLength
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Returns the HAL_PROFILE_SOURCE_INTERVAL for this processor.
|
|
|
|
Arguments:
|
|
|
|
Buffer - output buffer
|
|
BufferLength - length of buffer on input
|
|
|
|
Return Value:
|
|
|
|
STATUS_SUCCESS
|
|
STATUS_BUFFER_TOO_SMALL - The ReturnedLength contains the buffersize
|
|
currently needed.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (HalpIoArchitectureType == EV5_PROCESSOR_MODULE) {
|
|
return(Halp21164ProfileSourceInterval(Buffer,BufferLength));
|
|
} else {
|
|
return(Halp21064ProfileSourceInterval(Buffer,BufferLength));
|
|
}
|
|
}
|