27 #include "precompiled.h"
49 #if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729
52 # define __cpuidex(regsArray, level, index)\
53 __asm__ __volatile__ ("cpuid"\
54 : "=a" ((regsArray)[0]), "=b" ((regsArray)[1]), "=c" ((regsArray)[2]), "=d" ((regsArray)[3])\
55 : "0" (level), "2" (index));
57 # error "compiler not supported"
76 cassert(
sizeof(*regs) == 4*
sizeof(
int));
77 __cpuidex((
int*)regs, regs->
eax, regs->
ecx);
91 regs.
eax = 0x80000000;
103 const u32 function = regs->
eax;
132 regs.
eax = 0x80000001;
146 const size_t index = cap >> 5;
147 const size_t bit = cap & 0x1F;
181 char vendorString[13];
182 memcpy(&vendorString[0], ®s.
ebx, 4);
183 memcpy(&vendorString[4], ®s.
edx, 4);
184 memcpy(&vendorString[8], ®s.
ecx, 4);
185 vendorString[12] =
'\0';
187 if(!strcmp(vendorString,
"AuthenticAMD"))
189 else if(!strcmp(vendorString,
"GenuineIntel"))
223 const size_t extendedModel =
bits(regs.
eax, 16, 19);
224 const size_t extendedFamily =
bits(regs.
eax, 20, 27);
228 model += extendedModel << 4;
262 const size_t substring_length = strlen(substring);
265 char* substring_pos = strstr(
m_string, substring);
268 const size_t substring_ofs = substring_pos -
m_string;
269 const size_t num_chars =
m_max_chars - substring_ofs - substring_length;
270 memmove(substring_pos, substring_pos+substring_length, num_chars);
286 bool gotBrandString =
true;
287 for(
u32 function = 0x80000002;
function <= 0x80000004;
function++)
291 gotBrandString &=
cpuid(®s);
292 memcpy(pos, ®s, 16);
312 if(model == 3 || model == 7)
332 else if(model == 3 || model == 5)
349 const char*
const undesiredStrings[] = {
"(tm)",
"(TM)",
"(R)",
"CPU ",
" " };
350 std::for_each(undesiredStrings, undesiredStrings+
ARRAY_SIZE(undesiredStrings),
372 #if !MSC_VERSION // ensure not already defined in header
378 __asm__ __volatile__ (
"rdtsc" :
"=a" (lo),
"=d" (hi));
393 __asm__ __volatile__ (
"int $3");
447 size_t numSamples = 16;
453 std::vector<double> samples(numSamples);
455 for(
size_t i = 0; i < numSamples; i++)
488 const double freq = dc / dt;
492 std::sort(samples.begin(), samples.end());
498 const size_t lo = numSamples/4, hi = 3*numSamples/4;
499 for(
size_t i = lo; i < hi; i++)
502 const double clockFrequency = sum / (hi-lo);
503 return clockFrequency;
int pthread_setschedparam(pthread_t thread, int policy, const struct sched_param *param)
const char * cpu_IdentifierString()
static ModuleInitState signatureInitState
static u32 cpuid_maxFunction
static ModuleInitState capsInitState
void operator()(const char *substring)
static ModuleInitState initState
StringStripper(char *string, size_t max_chars)
static char identifierString[48+1]
intptr_t ModuleInitState
initialization state of a module (class, source file, etc.) must be initialized to zero (e...
bool cpuid(CpuidRegs *regs)
invoke CPUID instruction.
Caps
bit indices of CPU capability flags (128 bits).
functor to remove substrings from the CPU identifier string
bool IsBitSet(T value, size_t index)
double ClockFrequency()
measure the CPU clock frequency via rdtsc and timer_Time.
void DebugBreak()
trigger a breakpoint inside this function when it is called.
const Status INVALID_PARAM
void GetCapBits(u32 *d0, u32 *d1, u32 *d2, u32 *d3)
static Status InitIdentifierString()
i64 Status
Error handling system.
T bits(T num, size_t lo_idx, size_t hi_idx)
extract the value of bits hi_idx:lo_idx within num
const Status CPU_FEATURE_MISSING
int pthread_getschedparam(pthread_t thread, int *policy, struct sched_param *param)
#define DEBUG_WARN_ERR(status)
display the error dialog with text corresponding to the given error code.
const Status CPU_UNKNOWN_VENDOR
static void Invoke_cpuid(CpuidRegs *regs)
double timer_Resolution()
static u32 cpuid_maxExtendedFunction
u64 u64_from_u32(u32 hi, u32 lo)
return lower 16-bits
#define sched_get_priority_max(policy)
registers used/returned by cpuid
int strcpy_s(char *dst, size_t max_dst_chars, const char *src)
#define cassert(expr)
Compile-time assertion.
ScopedSetPriority(int newPriority)
static Status InitSignature()
static const char * IdentifierString()
Status ModuleInit(volatile ModuleInitState *initState, Status(*init)())
calls a user-defined init function if initState is zero.
static Status InitCpuid()
static Status InitVendor()