diff options
Diffstat (limited to 'src/common/x64')
| -rw-r--r-- | src/common/x64/cpu_detect.cpp | 13 | ||||
| -rw-r--r-- | src/common/x64/cpu_detect.h | 5 |
2 files changed, 18 insertions, 0 deletions
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index 322aa1f08..4230b2da6 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp | |||
| @@ -161,6 +161,19 @@ static CPUCaps Detect() { | |||
| 161 | caps.invariant_tsc = Common::Bit<8>(cpu_id[3]); | 161 | caps.invariant_tsc = Common::Bit<8>(cpu_id[3]); |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | if (max_std_fn >= 0x15) { | ||
| 165 | __cpuid(cpu_id, 0x15); | ||
| 166 | caps.tsc_crystal_ratio_denominator = cpu_id[0]; | ||
| 167 | caps.tsc_crystal_ratio_numerator = cpu_id[1]; | ||
| 168 | caps.crystal_frequency = cpu_id[2]; | ||
| 169 | // Some CPU models might not return a crystal frequency. | ||
| 170 | // The CPU model can be detected to use the values from turbostat | ||
| 171 | // https://github.com/torvalds/linux/blob/master/tools/power/x86/turbostat/turbostat.c#L5569 | ||
| 172 | // but it's easier to just estimate the TSC tick rate for these cases. | ||
| 173 | caps.tsc_frequency = static_cast<u64>(caps.crystal_frequency) * | ||
| 174 | caps.tsc_crystal_ratio_numerator / caps.tsc_crystal_ratio_denominator; | ||
| 175 | } | ||
| 176 | |||
| 164 | if (max_std_fn >= 0x16) { | 177 | if (max_std_fn >= 0x16) { |
| 165 | __cpuid(cpu_id, 0x16); | 178 | __cpuid(cpu_id, 0x16); |
| 166 | caps.base_frequency = cpu_id[0]; | 179 | caps.base_frequency = cpu_id[0]; |
diff --git a/src/common/x64/cpu_detect.h b/src/common/x64/cpu_detect.h index 9bdc9dbfa..6830f3795 100644 --- a/src/common/x64/cpu_detect.h +++ b/src/common/x64/cpu_detect.h | |||
| @@ -30,6 +30,11 @@ struct CPUCaps { | |||
| 30 | u32 max_frequency; | 30 | u32 max_frequency; |
| 31 | u32 bus_frequency; | 31 | u32 bus_frequency; |
| 32 | 32 | ||
| 33 | u32 tsc_crystal_ratio_denominator; | ||
| 34 | u32 tsc_crystal_ratio_numerator; | ||
| 35 | u32 crystal_frequency; | ||
| 36 | u64 tsc_frequency; // Derived from the above three values | ||
| 37 | |||
| 33 | bool sse : 1; | 38 | bool sse : 1; |
| 34 | bool sse2 : 1; | 39 | bool sse2 : 1; |
| 35 | bool sse3 : 1; | 40 | bool sse3 : 1; |