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