x86: Hypervisor detection and get tsc_freq from hypervisor
authorAlok Kataria <akataria@vmware.com>
Mon, 27 Oct 2008 17:41:46 +0000 (10:41 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 2 Nov 2008 01:57:08 +0000 (18:57 -0700)
commit88b094fb8d4fe43b7025ea8d487059e8813e02cd
treefa2fc5386aeb1d62d3901c9a39c8fbb2b6be43d2
parent49ab56ac6e1b907b7dadb72a4012460359feaf0e
x86: Hypervisor detection and get tsc_freq from hypervisor

Impact: Changes timebase calibration on Vmware.

v3->v2 : Abstract the hypervisor detection and feature (tsc_freq) request
 behind a hypervisor.c file
v2->v1 : Add a x86_hyper_vendor field to the cpuinfo_x86 structure.
 This avoids multiple calls to the hypervisor detection function.

This patch adds function to detect if we are running under VMware.
The current way to check if we are on VMware is following,
#  check if "hypervisor present bit" is set, if so read the 0x40000000
   cpuid leaf and check for "VMwareVMware" signature.
#  if the above fails, check the DMI vendors name for "VMware" string
   if we find one we query the VMware hypervisor port to check if we are
   under VMware.

The DMI + "VMware hypervisor port check" is needed for older VMware products,
which don't implement the hypervisor signature cpuid leaf.
Also note that since we are checking for the DMI signature the hypervisor
port should never be accessed on native hardware.

This patch also adds a hypervisor_get_tsc_freq function, instead of
calibrating the frequency which can be error prone in virtualized
environment, we ask the hypervisor for it. We get the frequency from
the hypervisor by accessing the hypervisor port if we are running on VMware.
Other hypervisors too can add code to the generic routine to get frequency on
their platform.

Signed-off-by: Alok N Kataria <akataria@vmware.com>
Signed-off-by: Dan Hecht <dhecht@vmware.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/include/asm/hypervisor.h [new file with mode: 0644]
arch/x86/include/asm/processor.h
arch/x86/include/asm/vmware.h [new file with mode: 0644]
arch/x86/kernel/cpu/Makefile
arch/x86/kernel/cpu/common.c
arch/x86/kernel/cpu/hypervisor.c [new file with mode: 0644]
arch/x86/kernel/cpu/vmware.c [new file with mode: 0644]
arch/x86/kernel/setup.c
arch/x86/kernel/tsc.c