e08cae4181
Clean up the hypervisor layer and the hypervisor drivers, using an ops structure instead of an enumeration with if statements. The identity of the hypervisor, if needed, can be tested by testing the pointer value in x86_hyper. The MS-HyperV private state is moved into a normal global variable (it's per-system state, not per-CPU state). Being a normal bss variable, it will be left at all zero on non-HyperV platforms, and so can generally be tested for HyperV-specific features without additional qualification. Signed-off-by: H. Peter Anvin <hpa@zytor.com> Acked-by: Greg KH <greg@kroah.com> Cc: Hank Janssen <hjanssen@microsoft.com> Cc: Alok Kataria <akataria@vmware.com> Cc: Ky Srinivasan <ksrinivasan@novell.com> LKML-Reference: <4BE49778.6060800@zytor.com>
73 lines
1.9 KiB
C
73 lines
1.9 KiB
C
/*
|
|
* Common hypervisor code
|
|
*
|
|
* Copyright (C) 2008, VMware, Inc.
|
|
* Author : Alok N Kataria <akataria@vmware.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
|
|
* NON INFRINGEMENT. See the GNU General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
*/
|
|
|
|
#include <asm/processor.h>
|
|
#include <asm/hypervisor.h>
|
|
|
|
/*
|
|
* Hypervisor detect order. This is specified explicitly here because
|
|
* some hypervisors might implement compatibility modes for other
|
|
* hypervisors and therefore need to be detected in specific sequence.
|
|
*/
|
|
static const __initconst struct hypervisor_x86 * const hypervisors[] =
|
|
{
|
|
&x86_hyper_vmware,
|
|
&x86_hyper_ms_hyperv,
|
|
};
|
|
|
|
const struct hypervisor_x86 *x86_hyper;
|
|
|
|
static inline void __init
|
|
detect_hypervisor_vendor(void)
|
|
{
|
|
const struct hypervisor_x86 *h, * const *p;
|
|
|
|
for (p = hypervisors; p < hypervisors + ARRAY_SIZE(hypervisors); p++) {
|
|
h = *p;
|
|
if (h->detect()) {
|
|
x86_hyper = h;
|
|
printk(KERN_INFO "Hypervisor detected: %s\n", h->name);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void __cpuinit init_hypervisor(struct cpuinfo_x86 *c)
|
|
{
|
|
if (x86_hyper && x86_hyper->set_cpu_features)
|
|
x86_hyper->set_cpu_features(c);
|
|
}
|
|
|
|
void __init init_hypervisor_platform(void)
|
|
{
|
|
|
|
detect_hypervisor_vendor();
|
|
|
|
if (!x86_hyper)
|
|
return;
|
|
|
|
init_hypervisor(&boot_cpu_data);
|
|
|
|
if (x86_hyper->init_platform)
|
|
x86_hyper->init_platform();
|
|
}
|