Merge branch 'x86-paravirt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 paravirt changes from Ingo Molnar: "Hypervisor signature detection cleanup and fixes - the goal is to make KVM guests run better on MS/Hyperv and to generalize and factor out the code a bit" * 'x86-paravirt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86: Correctly detect hypervisor x86, kvm: Switch to use hypervisor_cpuid_base() xen: Switch to use hypervisor_cpuid_base() x86: Introduce hypervisor_cpuid_base()
This commit is contained in:
@@ -25,11 +25,6 @@
|
||||
#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[] =
|
||||
{
|
||||
#ifdef CONFIG_XEN_PVHVM
|
||||
@@ -49,15 +44,19 @@ static inline void __init
|
||||
detect_hypervisor_vendor(void)
|
||||
{
|
||||
const struct hypervisor_x86 *h, * const *p;
|
||||
uint32_t pri, max_pri = 0;
|
||||
|
||||
for (p = hypervisors; p < hypervisors + ARRAY_SIZE(hypervisors); p++) {
|
||||
h = *p;
|
||||
if (h->detect()) {
|
||||
pri = h->detect();
|
||||
if (pri != 0 && pri > max_pri) {
|
||||
max_pri = pri;
|
||||
x86_hyper = h;
|
||||
printk(KERN_INFO "Hypervisor detected: %s\n", h->name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (max_pri)
|
||||
printk(KERN_INFO "Hypervisor detected: %s\n", x86_hyper->name);
|
||||
}
|
||||
|
||||
void init_hypervisor(struct cpuinfo_x86 *c)
|
||||
|
@@ -27,20 +27,23 @@
|
||||
struct ms_hyperv_info ms_hyperv;
|
||||
EXPORT_SYMBOL_GPL(ms_hyperv);
|
||||
|
||||
static bool __init ms_hyperv_platform(void)
|
||||
static uint32_t __init ms_hyperv_platform(void)
|
||||
{
|
||||
u32 eax;
|
||||
u32 hyp_signature[3];
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_HYPERVISOR))
|
||||
return false;
|
||||
return 0;
|
||||
|
||||
cpuid(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS,
|
||||
&eax, &hyp_signature[0], &hyp_signature[1], &hyp_signature[2]);
|
||||
|
||||
return eax >= HYPERV_CPUID_MIN &&
|
||||
eax <= HYPERV_CPUID_MAX &&
|
||||
!memcmp("Microsoft Hv", hyp_signature, 12);
|
||||
if (eax >= HYPERV_CPUID_MIN &&
|
||||
eax <= HYPERV_CPUID_MAX &&
|
||||
!memcmp("Microsoft Hv", hyp_signature, 12))
|
||||
return HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cycle_t read_hv_clock(struct clocksource *arg)
|
||||
|
@@ -93,7 +93,7 @@ static void __init vmware_platform_setup(void)
|
||||
* serial key should be enough, as this will always have a VMware
|
||||
* specific string when running under VMware hypervisor.
|
||||
*/
|
||||
static bool __init vmware_platform(void)
|
||||
static uint32_t __init vmware_platform(void)
|
||||
{
|
||||
if (cpu_has_hypervisor) {
|
||||
unsigned int eax;
|
||||
@@ -102,12 +102,12 @@ static bool __init vmware_platform(void)
|
||||
cpuid(CPUID_VMWARE_INFO_LEAF, &eax, &hyper_vendor_id[0],
|
||||
&hyper_vendor_id[1], &hyper_vendor_id[2]);
|
||||
if (!memcmp(hyper_vendor_id, "VMwareVMware", 12))
|
||||
return true;
|
||||
return CPUID_VMWARE_INFO_LEAF;
|
||||
} else if (dmi_available && dmi_name_in_serial("VMware") &&
|
||||
__vmware_platform())
|
||||
return true;
|
||||
return 1;
|
||||
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -498,11 +498,9 @@ void __init kvm_guest_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool __init kvm_detect(void)
|
||||
static uint32_t __init kvm_detect(void)
|
||||
{
|
||||
if (!kvm_para_available())
|
||||
return false;
|
||||
return true;
|
||||
return kvm_cpuid_base();
|
||||
}
|
||||
|
||||
const struct hypervisor_x86 x86_hyper_kvm __refconst = {
|
||||
|
Reference in New Issue
Block a user