Lines Matching refs:synic
39 static inline u64 synic_read_sint(struct kvm_vcpu_hv_synic *synic, int sint) in synic_read_sint() argument
41 return atomic64_read(&synic->sint[sint]); in synic_read_sint()
51 static bool synic_has_vector_connected(struct kvm_vcpu_hv_synic *synic, in synic_has_vector_connected() argument
56 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_has_vector_connected()
57 if (synic_get_sint_vector(synic_read_sint(synic, i)) == vector) in synic_has_vector_connected()
63 static bool synic_has_vector_auto_eoi(struct kvm_vcpu_hv_synic *synic, in synic_has_vector_auto_eoi() argument
69 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_has_vector_auto_eoi()
70 sint_value = synic_read_sint(synic, i); in synic_has_vector_auto_eoi()
78 static void synic_update_vector(struct kvm_vcpu_hv_synic *synic, in synic_update_vector() argument
84 if (synic_has_vector_connected(synic, vector)) in synic_update_vector()
85 __set_bit(vector, synic->vec_bitmap); in synic_update_vector()
87 __clear_bit(vector, synic->vec_bitmap); in synic_update_vector()
89 if (synic_has_vector_auto_eoi(synic, vector)) in synic_update_vector()
90 __set_bit(vector, synic->auto_eoi_bitmap); in synic_update_vector()
92 __clear_bit(vector, synic->auto_eoi_bitmap); in synic_update_vector()
95 static int synic_set_sint(struct kvm_vcpu_hv_synic *synic, int sint, in synic_set_sint() argument
117 old_vector = synic_read_sint(synic, sint) & HV_SYNIC_SINT_VECTOR_MASK; in synic_set_sint()
119 atomic64_set(&synic->sint[sint], data); in synic_set_sint()
121 synic_update_vector(synic, old_vector); in synic_set_sint()
123 synic_update_vector(synic, vector); in synic_set_sint()
126 kvm_make_request(KVM_REQ_SCAN_IOAPIC, synic_to_vcpu(synic)); in synic_set_sint()
148 struct kvm_vcpu_hv_synic *synic; in synic_get() local
153 synic = vcpu_to_synic(vcpu); in synic_get()
154 return (synic->active) ? synic : NULL; in synic_get()
157 static void synic_clear_sint_msg_pending(struct kvm_vcpu_hv_synic *synic, in synic_clear_sint_msg_pending() argument
160 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_clear_sint_msg_pending()
166 gpa = synic->msg_page & PAGE_MASK; in synic_clear_sint_msg_pending()
186 struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); in kvm_hv_notify_acked_sint() local
193 if (synic->msg_page & HV_SYNIC_SIMP_ENABLE) in kvm_hv_notify_acked_sint()
194 synic_clear_sint_msg_pending(synic, sint); in kvm_hv_notify_acked_sint()
212 gsi = atomic_read(&synic->sint_to_gsi[sint]); in kvm_hv_notify_acked_sint()
218 static void synic_exit(struct kvm_vcpu_hv_synic *synic, u32 msr) in synic_exit() argument
220 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_exit()
224 hv_vcpu->exit.u.synic.msr = msr; in synic_exit()
225 hv_vcpu->exit.u.synic.control = synic->control; in synic_exit()
226 hv_vcpu->exit.u.synic.evt_page = synic->evt_page; in synic_exit()
227 hv_vcpu->exit.u.synic.msg_page = synic->msg_page; in synic_exit()
232 static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, in synic_set_msr() argument
235 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_set_msr()
238 if (!synic->active && !host) in synic_set_msr()
246 synic->control = data; in synic_set_msr()
248 synic_exit(synic, msr); in synic_set_msr()
255 synic->version = data; in synic_set_msr()
259 !synic->dont_zero_synic_pages) in synic_set_msr()
265 synic->evt_page = data; in synic_set_msr()
267 synic_exit(synic, msr); in synic_set_msr()
271 !synic->dont_zero_synic_pages) in synic_set_msr()
277 synic->msg_page = data; in synic_set_msr()
279 synic_exit(synic, msr); in synic_set_msr()
284 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) in synic_set_msr()
289 ret = synic_set_sint(synic, msr - HV_X64_MSR_SINT0, data, host); in synic_set_msr()
298 static int synic_get_msr(struct kvm_vcpu_hv_synic *synic, u32 msr, u64 *pdata, in synic_get_msr() argument
303 if (!synic->active && !host) in synic_get_msr()
309 *pdata = synic->control; in synic_get_msr()
312 *pdata = synic->version; in synic_get_msr()
315 *pdata = synic->evt_page; in synic_get_msr()
318 *pdata = synic->msg_page; in synic_get_msr()
324 *pdata = atomic64_read(&synic->sint[msr - HV_X64_MSR_SINT0]); in synic_get_msr()
333 static int synic_set_irq(struct kvm_vcpu_hv_synic *synic, u32 sint) in synic_set_irq() argument
335 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_set_irq()
339 if (sint >= ARRAY_SIZE(synic->sint)) in synic_set_irq()
342 vector = synic_get_sint_vector(synic_read_sint(synic, sint)); in synic_set_irq()
360 struct kvm_vcpu_hv_synic *synic; in kvm_hv_synic_set_irq() local
362 synic = synic_get(kvm, vpidx); in kvm_hv_synic_set_irq()
363 if (!synic) in kvm_hv_synic_set_irq()
366 return synic_set_irq(synic, sint); in kvm_hv_synic_set_irq()
371 struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); in kvm_hv_synic_send_eoi() local
376 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) in kvm_hv_synic_send_eoi()
377 if (synic_get_sint_vector(synic_read_sint(synic, i)) == vector) in kvm_hv_synic_send_eoi()
383 struct kvm_vcpu_hv_synic *synic; in kvm_hv_set_sint_gsi() local
385 synic = synic_get(kvm, vpidx); in kvm_hv_set_sint_gsi()
386 if (!synic) in kvm_hv_set_sint_gsi()
389 if (sint >= ARRAY_SIZE(synic->sint_to_gsi)) in kvm_hv_set_sint_gsi()
392 atomic_set(&synic->sint_to_gsi[sint], gsi); in kvm_hv_set_sint_gsi()
414 static void synic_init(struct kvm_vcpu_hv_synic *synic) in synic_init() argument
418 memset(synic, 0, sizeof(*synic)); in synic_init()
419 synic->version = HV_SYNIC_VERSION_1; in synic_init()
420 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_init()
421 atomic64_set(&synic->sint[i], HV_SYNIC_SINT_MASKED); in synic_init()
422 atomic_set(&synic->sint_to_gsi[i], -1); in synic_init()
584 static int synic_deliver_msg(struct kvm_vcpu_hv_synic *synic, u32 sint, in synic_deliver_msg() argument
587 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_deliver_msg()
594 if (!(synic->msg_page & HV_SYNIC_SIMP_ENABLE)) in synic_deliver_msg()
597 gpa = synic->msg_page & PAGE_MASK; in synic_deliver_msg()
613 r = synic_set_irq(synic, sint); in synic_deliver_msg()
721 synic_init(&hv_vcpu->synic); in kvm_hv_vcpu_init()
737 struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); in kvm_hv_activate_synic() local
744 synic->active = true; in kvm_hv_activate_synic()
745 synic->dont_zero_synic_pages = dont_zero_synic_pages; in kvm_hv_activate_synic()