Skip to content

Commit

Permalink
x86: VMware: Fix vmware_get_tsc code
Browse files Browse the repository at this point in the history
Impact: Fix possible failure to calibrate the TSC on Vmware near 4 GHz

The current version of the code to get the tsc frequency from
the VMware hypervisor, will be broken on processor with frequency
(4G-1) HZ, because on such processors eax will have UINT_MAX
and that would be legitimate.
We instead check that EBX did change to decide if we were able to
read the frequency from the hypervisor.

Signed-off-by: Alok N Kataria <akataria@vmware.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
  • Loading branch information
Alok Kataria authored and H. Peter Anvin committed Nov 3, 2008
1 parent 395628e commit 6bdbfe9
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions arch/x86/kernel/cpu/vmware.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : \
"0"(VMWARE_HYPERVISOR_MAGIC), \
"1"(VMWARE_PORT_CMD_##cmd), \
"2"(VMWARE_HYPERVISOR_PORT), "3"(0) : \
"2"(VMWARE_HYPERVISOR_PORT), "3"(UINT_MAX) : \
"memory");

static inline int __vmware_platform(void)
Expand All @@ -53,7 +53,7 @@ static unsigned long __vmware_get_tsc_khz(void)

VMWARE_PORT(GETHZ, eax, ebx, ecx, edx);

if (eax == (uint32_t)-1)
if (ebx == UINT_MAX)
return 0;
tsc_hz = eax | (((uint64_t)ebx) << 32);
do_div(tsc_hz, 1000);
Expand Down

0 comments on commit 6bdbfe9

Please sign in to comment.