2010-05-06 12:08:41 -07:00
/*
* HyperV Detection code .
*
* Copyright ( C ) 2010 , Novell , Inc .
* Author : K . Y . Srinivasan < ksrinivasan @ novell . 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
2010-05-07 16:55:41 -07:00
* the Free Software Foundation ; version 2 of the License .
2010-05-06 12:08:41 -07:00
*
*/
# include <linux/types.h>
2010-05-09 22:46:54 -07:00
# include <linux/module.h>
2010-05-06 12:08:41 -07:00
# include <asm/processor.h>
2010-05-07 16:57:28 -07:00
# include <asm/hypervisor.h>
2010-05-06 12:08:41 -07:00
# include <asm/hyperv.h>
# include <asm/mshyperv.h>
2010-05-07 16:57:28 -07:00
struct ms_hyperv_info ms_hyperv ;
2010-06-28 08:48:55 -06:00
EXPORT_SYMBOL_GPL ( ms_hyperv ) ;
2010-05-06 12:08:41 -07:00
2010-05-07 16:57:28 -07:00
static bool __init ms_hyperv_platform ( void )
2010-05-06 12:08:41 -07:00
{
2010-05-07 16:57:28 -07:00
u32 eax ;
u32 hyp_signature [ 3 ] ;
2010-05-06 12:08:41 -07:00
2010-05-07 16:57:28 -07:00
if ( ! boot_cpu_has ( X86_FEATURE_HYPERVISOR ) )
return false ;
2010-05-06 12:08:41 -07:00
2010-05-07 16:57:28 -07:00
cpuid ( HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS ,
& eax , & hyp_signature [ 0 ] , & hyp_signature [ 1 ] , & hyp_signature [ 2 ] ) ;
2010-05-06 12:08:41 -07:00
2010-05-07 16:57:28 -07:00
return eax > = HYPERV_CPUID_MIN & &
eax < = HYPERV_CPUID_MAX & &
! memcmp ( " Microsoft Hv " , hyp_signature , 12 ) ;
2010-05-06 12:08:41 -07:00
}
2010-05-07 16:57:28 -07:00
static void __init ms_hyperv_init_platform ( void )
2010-05-06 12:08:41 -07:00
{
/*
2010-05-07 16:57:28 -07:00
* Extract the features and hints
2010-05-06 12:08:41 -07:00
*/
2010-05-07 16:57:28 -07:00
ms_hyperv . features = cpuid_eax ( HYPERV_CPUID_FEATURES ) ;
ms_hyperv . hints = cpuid_eax ( HYPERV_CPUID_ENLIGHTMENT_INFO ) ;
2010-05-06 12:08:41 -07:00
2010-05-07 16:57:28 -07:00
printk ( KERN_INFO " HyperV: features 0x%x, hints 0x%x \n " ,
ms_hyperv . features , ms_hyperv . hints ) ;
2010-05-06 12:08:41 -07:00
}
2010-05-07 16:57:28 -07:00
const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
. name = " Microsoft HyperV " ,
. detect = ms_hyperv_platform ,
. init_platform = ms_hyperv_init_platform ,
} ;
2010-05-09 01:10:34 -07:00
EXPORT_SYMBOL ( x86_hyper_ms_hyperv ) ;