Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
x86
kernel
cpu
mshyperv.c
Go to the documentation of this file.
1
/*
2
* HyperV Detection code.
3
*
4
* Copyright (C) 2010, Novell, Inc.
5
* Author : K. Y. Srinivasan <ksrinivasan@novell.com>
6
*
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; version 2 of the License.
10
*
11
*/
12
13
#include <linux/types.h>
14
#include <linux/time.h>
15
#include <
linux/clocksource.h
>
16
#include <linux/module.h>
17
#include <asm/processor.h>
18
#include <asm/hypervisor.h>
19
#include <
asm/hyperv.h
>
20
#include <
asm/mshyperv.h
>
21
22
struct
ms_hyperv_info
ms_hyperv
;
23
EXPORT_SYMBOL_GPL
(
ms_hyperv
);
24
25
static
bool
__init
ms_hyperv_platform(
void
)
26
{
27
u32
eax;
28
u32
hyp_signature[3];
29
30
if
(!boot_cpu_has(
X86_FEATURE_HYPERVISOR
))
31
return
false
;
32
33
cpuid
(
HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS
,
34
&eax, &hyp_signature[0], &hyp_signature[1], &hyp_signature[2]);
35
36
return
eax >=
HYPERV_CPUID_MIN
&&
37
eax <=
HYPERV_CPUID_MAX
&&
38
!
memcmp
(
"Microsoft Hv"
, hyp_signature, 12);
39
}
40
41
static
cycle_t
read_hv_clock(
struct
clocksource
*
arg
)
42
{
43
cycle_t
current_tick;
44
/*
45
* Read the partition counter to get the current tick count. This count
46
* is set to 0 when the partition is created and is incremented in
47
* 100 nanosecond units.
48
*/
49
rdmsrl(
HV_X64_MSR_TIME_REF_COUNT
, current_tick);
50
return
current_tick;
51
}
52
53
static
struct
clocksource
hyperv_cs = {
54
.name =
"hyperv_clocksource"
,
55
.rating = 400,
/* use this when running on Hyperv*/
56
.read = read_hv_clock,
57
.mask =
CLOCKSOURCE_MASK
(64),
58
};
59
60
static
void
__init
ms_hyperv_init_platform(
void
)
61
{
62
/*
63
* Extract the features and hints
64
*/
65
ms_hyperv
.features = cpuid_eax(
HYPERV_CPUID_FEATURES
);
66
ms_hyperv
.hints = cpuid_eax(
HYPERV_CPUID_ENLIGHTMENT_INFO
);
67
68
printk
(
KERN_INFO
"HyperV: features 0x%x, hints 0x%x\n"
,
69
ms_hyperv
.features,
ms_hyperv
.hints);
70
71
clocksource_register_hz(&hyperv_cs,
NSEC_PER_SEC
/100);
72
}
73
74
const
__refconst
struct
hypervisor_x86
x86_hyper_ms_hyperv
= {
75
.name =
"Microsoft HyperV"
,
76
.detect = ms_hyperv_platform,
77
.init_platform = ms_hyperv_init_platform,
78
};
79
EXPORT_SYMBOL
(x86_hyper_ms_hyperv);
Generated on Thu Jan 10 2013 13:20:33 for Linux Kernel by
1.8.2