forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/arch/x86/kvm/lapic.h
....@@ -10,11 +10,15 @@
1010 #define KVM_APIC_SIPI 1
1111 #define KVM_APIC_LVT_NUM 6
1212
13
-#define KVM_APIC_SHORT_MASK 0xc0000
14
-#define KVM_APIC_DEST_MASK 0x800
13
+#define APIC_SHORT_MASK 0xc0000
14
+#define APIC_DEST_NOSHORT 0x0
15
+#define APIC_DEST_MASK 0x800
1516
1617 #define APIC_BUS_CYCLE_NS 1
1718 #define APIC_BUS_FREQUENCY (1000000000ULL / APIC_BUS_CYCLE_NS)
19
+
20
+#define APIC_BROADCAST 0xFF
21
+#define X2APIC_BROADCAST 0xFFFFFFFFul
1822
1923 enum lapic_mode {
2024 LAPIC_MODE_DISABLED = 0,
....@@ -31,6 +35,8 @@
3135 u32 timer_mode_mask;
3236 u64 tscdeadline;
3337 u64 expired_tscdeadline;
38
+ u32 timer_advance_ns;
39
+ s64 advance_expire_delta;
3440 atomic_t pending; /* accumulated triggered timers */
3541 bool hv_timer_in_use;
3642 };
....@@ -62,7 +68,7 @@
6268
6369 struct dest_map;
6470
65
-int kvm_create_lapic(struct kvm_vcpu *vcpu);
71
+int kvm_create_lapic(struct kvm_vcpu *vcpu, int timer_advance_ns);
6672 void kvm_free_lapic(struct kvm_vcpu *vcpu);
6773
6874 int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu);
....@@ -75,22 +81,26 @@
7581 void kvm_lapic_set_eoi(struct kvm_vcpu *vcpu);
7682 void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value);
7783 u64 kvm_lapic_get_base(struct kvm_vcpu *vcpu);
84
+void kvm_recalculate_apic_map(struct kvm *kvm);
7885 void kvm_apic_set_version(struct kvm_vcpu *vcpu);
7986 int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val);
8087 int kvm_lapic_reg_read(struct kvm_lapic *apic, u32 offset, int len,
8188 void *data);
8289 bool kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source,
83
- int short_hand, unsigned int dest, int dest_mode);
84
-
90
+ int shorthand, unsigned int dest, int dest_mode);
91
+int kvm_apic_compare_prio(struct kvm_vcpu *vcpu1, struct kvm_vcpu *vcpu2);
92
+void kvm_apic_clear_irr(struct kvm_vcpu *vcpu, int vec);
8593 bool __kvm_apic_update_irr(u32 *pir, void *regs, int *max_irr);
8694 bool kvm_apic_update_irr(struct kvm_vcpu *vcpu, u32 *pir, int *max_irr);
8795 void kvm_apic_update_ppr(struct kvm_vcpu *vcpu);
8896 int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq,
8997 struct dest_map *dest_map);
9098 int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type);
99
+void kvm_apic_update_apicv(struct kvm_vcpu *vcpu);
91100
92101 bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
93102 struct kvm_lapic_irq *irq, int *r, struct dest_map *dest_map);
103
+void kvm_apic_send_ipi(struct kvm_lapic *apic, u32 icr_low, u32 icr_high);
94104
95105 u64 kvm_get_apic_base(struct kvm_vcpu *vcpu);
96106 int kvm_set_apic_base(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
....@@ -127,6 +137,11 @@
127137 #define VEC_POS(v) ((v) & (32 - 1))
128138 #define REG_POS(v) (((v) >> 5) << 4)
129139
140
+static inline void kvm_lapic_clear_vector(int vec, void *bitmap)
141
+{
142
+ clear_bit(VEC_POS(vec), (bitmap) + REG_POS(vec));
143
+}
144
+
130145 static inline void kvm_lapic_set_vector(int vec, void *bitmap)
131146 {
132147 set_bit(VEC_POS(vec), (bitmap) + REG_POS(vec));
....@@ -147,9 +162,14 @@
147162 return *((u32 *) (apic->regs + reg_off));
148163 }
149164
165
+static inline void __kvm_lapic_set_reg(char *regs, int reg_off, u32 val)
166
+{
167
+ *((u32 *) (regs + reg_off)) = val;
168
+}
169
+
150170 static inline void kvm_lapic_set_reg(struct kvm_lapic *apic, int reg_off, u32 val)
151171 {
152
- *((u32 *) (apic->regs + reg_off)) = val;
172
+ __kvm_lapic_set_reg(apic->regs, reg_off, val);
153173 }
154174
155175 extern struct static_key kvm_no_apic_vcpu;
....@@ -217,7 +237,10 @@
217237
218238 bool kvm_apic_pending_eoi(struct kvm_vcpu *vcpu, int vector);
219239
220
-void wait_lapic_expire(struct kvm_vcpu *vcpu);
240
+void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu);
241
+
242
+void kvm_bitmap_or_dest_vcpus(struct kvm *kvm, struct kvm_lapic_irq *irq,
243
+ unsigned long *vcpu_bitmap);
221244
222245 bool kvm_intr_is_single_vcpu_fast(struct kvm *kvm, struct kvm_lapic_irq *irq,
223246 struct kvm_vcpu **dest_vcpu);
....@@ -228,10 +251,16 @@
228251 void kvm_lapic_expired_hv_timer(struct kvm_vcpu *vcpu);
229252 bool kvm_lapic_hv_timer_in_use(struct kvm_vcpu *vcpu);
230253 void kvm_lapic_restart_hv_timer(struct kvm_vcpu *vcpu);
254
+bool kvm_can_use_hv_timer(struct kvm_vcpu *vcpu);
231255
232256 static inline enum lapic_mode kvm_apic_mode(u64 apic_base)
233257 {
234258 return apic_base & (MSR_IA32_APICBASE_ENABLE | X2APIC_ENABLE);
235259 }
236260
261
+static inline u8 kvm_xapic_id(struct kvm_lapic *apic)
262
+{
263
+ return kvm_lapic_get_reg(apic, APIC_ID) >> 24;
264
+}
265
+
237266 #endif