mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-08-04 01:41:08 +00:00
HV: Use the CPUID(0x16) to obtain tsc_hz when zero tsc_hz is returned by 0x15 cpuid
Sometimes the CPUID(0x15) still returns the zero tsc frequency. In such case the base frequency of cpuid(0x16) is used as tsc frequency. Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
7d83abb4a5
commit
197706ff16
@ -278,10 +278,12 @@ static uint64_t pit_calibrate_tsc(uint32_t cal_ms_arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine TSC frequency via CPUID 0x15
|
* Determine TSC frequency via CPUID 0x15 and 0x16.
|
||||||
*/
|
*/
|
||||||
static uint64_t native_calibrate_tsc(void)
|
static uint64_t native_calibrate_tsc(void)
|
||||||
{
|
{
|
||||||
|
uint64_t tsc_hz = 0;
|
||||||
|
|
||||||
if (boot_cpu_data.cpuid_level >= 0x15U) {
|
if (boot_cpu_data.cpuid_level >= 0x15U) {
|
||||||
uint32_t eax_denominator, ebx_numerator, ecx_hz, reserved;
|
uint32_t eax_denominator, ebx_numerator, ecx_hz, reserved;
|
||||||
|
|
||||||
@ -289,12 +291,18 @@ static uint64_t native_calibrate_tsc(void)
|
|||||||
&ecx_hz, &reserved);
|
&ecx_hz, &reserved);
|
||||||
|
|
||||||
if ((eax_denominator != 0U) && (ebx_numerator != 0U)) {
|
if ((eax_denominator != 0U) && (ebx_numerator != 0U)) {
|
||||||
return ((uint64_t) ecx_hz *
|
tsc_hz = ((uint64_t) ecx_hz *
|
||||||
ebx_numerator) / eax_denominator;
|
ebx_numerator) / eax_denominator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
if ((tsc_hz == 0) && (boot_cpu_data.cpuid_level >= 0x16U)) {
|
||||||
|
uint32_t eax_base_mhz, ebx_max_mhz, ecx_bus_mhz, edx;
|
||||||
|
cpuid(0x16U, &eax_base_mhz, &ebx_max_mhz, &ecx_bus_mhz, &edx);
|
||||||
|
tsc_hz = (uint64_t) eax_base_mhz * 1000000U;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsc_hz;
|
||||||
}
|
}
|
||||||
|
|
||||||
void calibrate_tsc(void)
|
void calibrate_tsc(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user