212 lines
4.5 KiB
C
212 lines
4.5 KiB
C
|
//===== Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ======//
|
|||
|
//
|
|||
|
// Purpose:
|
|||
|
//
|
|||
|
// $NoKeywords: $
|
|||
|
//
|
|||
|
//===========================================================================//
|
|||
|
#ifndef PMELIB_H
|
|||
|
#define PMELIB_H
|
|||
|
|
|||
|
//#include "windows.h"
|
|||
|
|
|||
|
#include "tier0/platform.h"
|
|||
|
|
|||
|
// Get rid of a bunch of STL warnings!
|
|||
|
#pragma warning( push, 3 )
|
|||
|
#pragma warning( disable : 4018 )
|
|||
|
|
|||
|
#define VERSION "1.0.2"
|
|||
|
|
|||
|
// uncomment this list to add some runtime checks
|
|||
|
//#define PME_DEBUG
|
|||
|
|
|||
|
#include "tier0/valve_off.h"
|
|||
|
#include <string>
|
|||
|
#include "tier0/valve_on.h"
|
|||
|
|
|||
|
using namespace std;
|
|||
|
|
|||
|
// RDTSC Instruction macro
|
|||
|
#ifdef COMPILER_MSVC64
|
|||
|
#define RDTSC(var) (var = __rdtsc())
|
|||
|
#else
|
|||
|
#define RDTSC(var) \
|
|||
|
_asm RDTSC \
|
|||
|
_asm mov DWORD PTR var,eax \
|
|||
|
_asm mov DWORD PTR var+4,edx
|
|||
|
#endif
|
|||
|
|
|||
|
// RDPMC Instruction macro
|
|||
|
#ifdef COMPILER_MSVC64
|
|||
|
#define RDPMC(counter, var) (var = __readpmc(counter))
|
|||
|
#else
|
|||
|
#define RDPMC(counter, var) \
|
|||
|
_asm mov ecx, counter \
|
|||
|
_asm RDPMC \
|
|||
|
_asm mov DWORD PTR var,eax \
|
|||
|
_asm mov DWORD PTR var+4,edx
|
|||
|
#endif
|
|||
|
|
|||
|
// RDPMC Instruction macro, for performance counter 1 (ecx = 1)
|
|||
|
#ifdef COMPILER_MSVC64
|
|||
|
#define RDPMC0(var) (var = __readpmc(0))
|
|||
|
#else
|
|||
|
#define RDPMC0(var) \
|
|||
|
_asm mov ecx, 0 \
|
|||
|
_asm RDPMC \
|
|||
|
_asm mov DWORD PTR var,eax \
|
|||
|
_asm mov DWORD PTR var+4,edx
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef COMPILER_MSVC64
|
|||
|
#define RDPMC1(var) (var = __readpmc(1))
|
|||
|
#else
|
|||
|
#define RDPMC1(var) \
|
|||
|
_asm mov ecx, 1 \
|
|||
|
_asm RDPMC \
|
|||
|
_asm mov DWORD PTR var,eax \
|
|||
|
_asm mov DWORD PTR var+4,edx
|
|||
|
#endif
|
|||
|
|
|||
|
#define EVENT_TYPE(mode) EventType##mode
|
|||
|
#define EVENT_MASK(mode) EventMask##mode
|
|||
|
|
|||
|
#include "ia32detect.h"
|
|||
|
|
|||
|
enum ProcessPriority
|
|||
|
{
|
|||
|
ProcessPriorityNormal,
|
|||
|
ProcessPriorityHigh,
|
|||
|
};
|
|||
|
|
|||
|
enum PrivilegeCapture
|
|||
|
{
|
|||
|
OS_Only, // ring 0, kernel level
|
|||
|
USR_Only, // app level
|
|||
|
OS_and_USR, // all levels
|
|||
|
};
|
|||
|
|
|||
|
enum CompareMethod
|
|||
|
{
|
|||
|
CompareGreater, //
|
|||
|
CompareLessEqual, //
|
|||
|
};
|
|||
|
|
|||
|
enum EdgeState
|
|||
|
{
|
|||
|
RisingEdgeDisabled, //
|
|||
|
RisingEdgeEnabled, //
|
|||
|
};
|
|||
|
|
|||
|
enum CompareState
|
|||
|
{
|
|||
|
CompareDisable, //
|
|||
|
CompareEnable, //
|
|||
|
};
|
|||
|
|
|||
|
// Singletion Class
|
|||
|
class PME : public ia32detect
|
|||
|
{
|
|||
|
public:
|
|||
|
//private:
|
|||
|
|
|||
|
static PME* _singleton;
|
|||
|
|
|||
|
HANDLE hFile;
|
|||
|
bool bDriverOpen;
|
|||
|
double m_CPUClockSpeed;
|
|||
|
|
|||
|
//ia32detect detect;
|
|||
|
HRESULT Init();
|
|||
|
HRESULT Close();
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
PME()
|
|||
|
{
|
|||
|
hFile = NULL;
|
|||
|
bDriverOpen = FALSE;
|
|||
|
m_CPUClockSpeed = 0;
|
|||
|
Init();
|
|||
|
}
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
static PME* Instance(); // gives back a real object
|
|||
|
|
|||
|
~PME()
|
|||
|
{
|
|||
|
Close();
|
|||
|
}
|
|||
|
|
|||
|
double GetCPUClockSpeedSlow( void );
|
|||
|
double GetCPUClockSpeedFast( void );
|
|||
|
|
|||
|
HRESULT SelectP5P6PerformanceEvent( uint32 dw_event, uint32 dw_counter, bool b_user, bool b_kernel );
|
|||
|
|
|||
|
HRESULT ReadMSR( uint32 dw_reg, int64 * pi64_value );
|
|||
|
HRESULT ReadMSR( uint32 dw_reg, uint64 * pi64_value );
|
|||
|
|
|||
|
HRESULT WriteMSR( uint32 dw_reg, const int64 & i64_value );
|
|||
|
HRESULT WriteMSR( uint32 dw_reg, const uint64 & i64_value );
|
|||
|
|
|||
|
void SetProcessPriority( ProcessPriority priority )
|
|||
|
{
|
|||
|
switch( priority )
|
|||
|
{
|
|||
|
case ProcessPriorityNormal:
|
|||
|
{
|
|||
|
SetPriorityClass (GetCurrentProcess(),NORMAL_PRIORITY_CLASS);
|
|||
|
SetThreadPriority (GetCurrentThread(),THREAD_PRIORITY_NORMAL);
|
|||
|
break;
|
|||
|
}
|
|||
|
case ProcessPriorityHigh:
|
|||
|
{
|
|||
|
SetPriorityClass (GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
|
|||
|
SetThreadPriority (GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
// Return the family of the processor
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
CPUVendor GetVendor(void)
|
|||
|
{
|
|||
|
return vendor;
|
|||
|
}
|
|||
|
|
|||
|
int GetProcessorFamily(void)
|
|||
|
{
|
|||
|
return version.Family;
|
|||
|
}
|
|||
|
|
|||
|
#ifdef DBGFLAG_VALIDATE
|
|||
|
void Validate( CValidator &validator, tchar *pchName ); // Validate our internal structures
|
|||
|
#endif // DBGFLAG_VALIDATE
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
#include "p5p6performancecounters.h"
|
|||
|
#include "p4performancecounters.h"
|
|||
|
#include "k8performancecounters.h"
|
|||
|
|
|||
|
enum PerfErrors
|
|||
|
{
|
|||
|
E_UNKNOWN_CPU_VENDOR = -1,
|
|||
|
E_BAD_COUNTER = -2,
|
|||
|
E_UNKNOWN_CPU = -3,
|
|||
|
E_CANT_OPEN_DRIVER = -4,
|
|||
|
E_DRIVER_ALREADY_OPEN = -5,
|
|||
|
E_DRIVER_NOT_OPEN = -6,
|
|||
|
E_DISABLED = -7,
|
|||
|
E_BAD_DATA = -8,
|
|||
|
E_CANT_CLOSE = -9,
|
|||
|
E_ILLEGAL_OPERATION = -10,
|
|||
|
};
|
|||
|
|
|||
|
#pragma warning( pop )
|
|||
|
|
|||
|
#endif // PMELIB_H
|