diff options
Diffstat (limited to 'arch/x86/kvm/lapic.h')
-rw-r--r-- | arch/x86/kvm/lapic.h | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index 4af5405ae1e..e5ebf9f3571 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h | |||
@@ -2,10 +2,17 @@ | |||
2 | #define __KVM_X86_LAPIC_H | 2 | #define __KVM_X86_LAPIC_H |
3 | 3 | ||
4 | #include "iodev.h" | 4 | #include "iodev.h" |
5 | #include "kvm_timer.h" | ||
6 | 5 | ||
7 | #include <linux/kvm_host.h> | 6 | #include <linux/kvm_host.h> |
8 | 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 | |||
9 | struct kvm_lapic { | 16 | struct kvm_lapic { |
10 | unsigned long base_address; | 17 | unsigned long base_address; |
11 | struct kvm_io_device dev; | 18 | struct kvm_io_device dev; |
@@ -45,11 +52,13 @@ int kvm_apic_match_logical_addr(struct kvm_lapic *apic, u8 mda); | |||
45 | int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq); | 52 | int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq); |
46 | int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type); | 53 | int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type); |
47 | 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 | |||
48 | u64 kvm_get_apic_base(struct kvm_vcpu *vcpu); | 58 | u64 kvm_get_apic_base(struct kvm_vcpu *vcpu); |
49 | void kvm_set_apic_base(struct kvm_vcpu *vcpu, u64 data); | 59 | void kvm_set_apic_base(struct kvm_vcpu *vcpu, u64 data); |
50 | void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu); | 60 | void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu, |
51 | int kvm_lapic_enabled(struct kvm_vcpu *vcpu); | 61 | struct kvm_lapic_state *s); |
52 | bool kvm_apic_present(struct kvm_vcpu *vcpu); | ||
53 | int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu); | 62 | int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu); |
54 | 63 | ||
55 | u64 kvm_get_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu); | 64 | u64 kvm_get_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu); |
@@ -71,4 +80,48 @@ static inline bool kvm_hv_vapic_assist_page_enabled(struct kvm_vcpu *vcpu) | |||
71 | } | 80 | } |
72 | 81 | ||
73 | int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data); | 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 | |||
74 | #endif | 127 | #endif |