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
kvm
lapic.h
Go to the documentation of this file.
1
#ifndef __KVM_X86_LAPIC_H
2
#define __KVM_X86_LAPIC_H
3
4
#include "
iodev.h
"
5
6
#include <
linux/kvm_host.h
>
7
8
struct
kvm_timer
{
9
struct
hrtimer
timer
;
10
s64
period
;
/* unit: ns */
11
u32
timer_mode_mask
;
12
u64
tscdeadline
;
13
atomic_t
pending
;
/* accumulated triggered timers */
14
};
15
16
struct
kvm_lapic
{
17
unsigned
long
base_address
;
18
struct
kvm_io_device
dev
;
19
struct
kvm_timer
lapic_timer
;
20
u32
divide_count
;
21
struct
kvm_vcpu
*
vcpu
;
22
bool
irr_pending
;
23
/* Number of bits set in ISR. */
24
s16
isr_count
;
25
/* The highest vector set in ISR; if -1 - invalid, must scan ISR. */
26
int
highest_isr_cache
;
32
void
*
regs
;
33
gpa_t
vapic_addr
;
34
struct
page
*
vapic_page
;
35
};
36
int
kvm_create_lapic
(
struct
kvm_vcpu
*vcpu);
37
void
kvm_free_lapic
(
struct
kvm_vcpu
*vcpu);
38
39
int
kvm_apic_has_interrupt
(
struct
kvm_vcpu
*vcpu);
40
int
kvm_apic_accept_pic_intr
(
struct
kvm_vcpu
*vcpu);
41
int
kvm_get_apic_interrupt
(
struct
kvm_vcpu
*vcpu);
42
void
kvm_lapic_reset
(
struct
kvm_vcpu
*vcpu);
43
u64
kvm_lapic_get_cr8
(
struct
kvm_vcpu
*vcpu);
44
void
kvm_lapic_set_tpr
(
struct
kvm_vcpu
*vcpu,
unsigned
long
cr8
);
45
void
kvm_lapic_set_eoi
(
struct
kvm_vcpu
*vcpu);
46
void
kvm_lapic_set_base
(
struct
kvm_vcpu
*vcpu,
u64
value
);
47
u64
kvm_lapic_get_base
(
struct
kvm_vcpu
*vcpu);
48
void
kvm_apic_set_version
(
struct
kvm_vcpu
*vcpu);
49
50
int
kvm_apic_match_physical_addr
(
struct
kvm_lapic
*
apic
,
u16
dest
);
51
int
kvm_apic_match_logical_addr
(
struct
kvm_lapic
*
apic
,
u8
mda
);
52
int
kvm_apic_set_irq
(
struct
kvm_vcpu
*vcpu,
struct
kvm_lapic_irq
*irq);
53
int
kvm_apic_local_deliver
(
struct
kvm_lapic
*
apic
,
int
lvt_type);
54
55
bool
kvm_irq_delivery_to_apic_fast
(
struct
kvm
*
kvm
,
struct
kvm_lapic
*
src
,
56
struct
kvm_lapic_irq
*irq,
int
*
r
);
57
58
u64
kvm_get_apic_base
(
struct
kvm_vcpu
*vcpu);
59
void
kvm_set_apic_base
(
struct
kvm_vcpu
*vcpu,
u64
data
);
60
void
kvm_apic_post_state_restore
(
struct
kvm_vcpu
*vcpu,
61
struct
kvm_lapic_state
*
s
);
62
int
kvm_lapic_find_highest_irr
(
struct
kvm_vcpu
*vcpu);
63
64
u64
kvm_get_lapic_tscdeadline_msr
(
struct
kvm_vcpu
*vcpu);
65
void
kvm_set_lapic_tscdeadline_msr
(
struct
kvm_vcpu
*vcpu,
u64
data
);
66
67
void
kvm_lapic_set_vapic_addr
(
struct
kvm_vcpu
*vcpu,
gpa_t
vapic_addr);
68
void
kvm_lapic_sync_from_vapic
(
struct
kvm_vcpu
*vcpu);
69
void
kvm_lapic_sync_to_vapic
(
struct
kvm_vcpu
*vcpu);
70
71
int
kvm_x2apic_msr_write
(
struct
kvm_vcpu
*vcpu,
u32
msr,
u64
data
);
72
int
kvm_x2apic_msr_read
(
struct
kvm_vcpu
*vcpu,
u32
msr,
u64
*
data
);
73
74
int
kvm_hv_vapic_msr_write
(
struct
kvm_vcpu
*vcpu,
u32
msr,
u64
data
);
75
int
kvm_hv_vapic_msr_read
(
struct
kvm_vcpu
*vcpu,
u32
msr,
u64
*
data
);
76
77
static
inline
bool
kvm_hv_vapic_assist_page_enabled(
struct
kvm_vcpu
*vcpu)
78
{
79
return
vcpu->
arch
.hv_vapic &
HV_X64_MSR_APIC_ASSIST_PAGE_ENABLE
;
80
}
81
82
int
kvm_lapic_enable_pv_eoi
(
struct
kvm_vcpu
*vcpu,
u64
data
);
83
void
kvm_lapic_init
(
void
);
84
85
static
inline
u32
kvm_apic_get_reg(
struct
kvm_lapic
*
apic
,
int
reg_off)
86
{
87
return
*((
u32
*) (apic->
regs
+ reg_off));
88
}
89
90
extern
struct
static_key
kvm_no_apic_vcpu
;
91
92
static
inline
bool
kvm_vcpu_has_lapic(
struct
kvm_vcpu
*vcpu)
93
{
94
if
(static_key_false(&kvm_no_apic_vcpu))
95
return
vcpu->
arch
.apic;
96
return
true
;
97
}
98
99
extern
struct
static_key_deferred
apic_hw_disabled
;
100
101
static
inline
int
kvm_apic_hw_enabled(
struct
kvm_lapic
*apic)
102
{
103
if
(static_key_false(&
apic_hw_disabled
.key))
104
return
apic->
vcpu
->arch.apic_base &
MSR_IA32_APICBASE_ENABLE
;
105
return
MSR_IA32_APICBASE_ENABLE
;
106
}
107
108
extern
struct
static_key_deferred
apic_sw_disabled
;
109
110
static
inline
int
kvm_apic_sw_enabled(
struct
kvm_lapic
*apic)
111
{
112
if
(static_key_false(&
apic_sw_disabled
.key))
113
return
kvm_apic_get_reg(apic,
APIC_SPIV
) &
APIC_SPIV_APIC_ENABLED
;
114
return
APIC_SPIV_APIC_ENABLED
;
115
}
116
117
static
inline
bool
kvm_apic_present
(
struct
kvm_vcpu
*vcpu)
118
{
119
return
kvm_vcpu_has_lapic(vcpu) && kvm_apic_hw_enabled(vcpu->
arch
.apic);
120
}
121
122
static
inline
int
kvm_lapic_enabled
(
struct
kvm_vcpu
*vcpu)
123
{
124
return
kvm_apic_present
(vcpu) && kvm_apic_sw_enabled(vcpu->
arch
.apic);
125
}
126
127
#endif
Generated on Thu Jan 10 2013 13:07:02 for Linux Kernel by
1.8.2