Lines Matching refs:synic

44 static inline u64 synic_read_sint(struct kvm_vcpu_hv_synic *synic, int sint)  in synic_read_sint()  argument
46 return atomic64_read(&synic->sint[sint]); in synic_read_sint()
56 static bool synic_has_vector_connected(struct kvm_vcpu_hv_synic *synic, in synic_has_vector_connected() argument
61 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_has_vector_connected()
62 if (synic_get_sint_vector(synic_read_sint(synic, i)) == vector) in synic_has_vector_connected()
68 static bool synic_has_vector_auto_eoi(struct kvm_vcpu_hv_synic *synic, in synic_has_vector_auto_eoi() argument
74 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_has_vector_auto_eoi()
75 sint_value = synic_read_sint(synic, i); in synic_has_vector_auto_eoi()
83 static void synic_update_vector(struct kvm_vcpu_hv_synic *synic, in synic_update_vector() argument
89 if (synic_has_vector_connected(synic, vector)) in synic_update_vector()
90 __set_bit(vector, synic->vec_bitmap); in synic_update_vector()
92 __clear_bit(vector, synic->vec_bitmap); in synic_update_vector()
94 if (synic_has_vector_auto_eoi(synic, vector)) in synic_update_vector()
95 __set_bit(vector, synic->auto_eoi_bitmap); in synic_update_vector()
97 __clear_bit(vector, synic->auto_eoi_bitmap); in synic_update_vector()
100 static int synic_set_sint(struct kvm_vcpu_hv_synic *synic, int sint, in synic_set_sint() argument
122 old_vector = synic_read_sint(synic, sint) & HV_SYNIC_SINT_VECTOR_MASK; in synic_set_sint()
124 atomic64_set(&synic->sint[sint], data); in synic_set_sint()
126 synic_update_vector(synic, old_vector); in synic_set_sint()
128 synic_update_vector(synic, vector); in synic_set_sint()
131 kvm_make_request(KVM_REQ_SCAN_IOAPIC, synic_to_vcpu(synic)); in synic_set_sint()
155 struct kvm_vcpu_hv_synic *synic; in synic_get() local
160 synic = vcpu_to_synic(vcpu); in synic_get()
161 return (synic->active) ? synic : NULL; in synic_get()
167 struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); in kvm_hv_notify_acked_sint() local
184 gsi = atomic_read(&synic->sint_to_gsi[sint]); in kvm_hv_notify_acked_sint()
190 static void synic_exit(struct kvm_vcpu_hv_synic *synic, u32 msr) in synic_exit() argument
192 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_exit()
196 hv_vcpu->exit.u.synic.msr = msr; in synic_exit()
197 hv_vcpu->exit.u.synic.control = synic->control; in synic_exit()
198 hv_vcpu->exit.u.synic.evt_page = synic->evt_page; in synic_exit()
199 hv_vcpu->exit.u.synic.msg_page = synic->msg_page; in synic_exit()
204 static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, in synic_set_msr() argument
207 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_set_msr()
210 if (!synic->active && (!host || data)) in synic_set_msr()
218 synic->control = data; in synic_set_msr()
220 synic_exit(synic, msr); in synic_set_msr()
227 synic->version = data; in synic_set_msr()
231 !synic->dont_zero_synic_pages) in synic_set_msr()
237 synic->evt_page = data; in synic_set_msr()
239 synic_exit(synic, msr); in synic_set_msr()
243 !synic->dont_zero_synic_pages) in synic_set_msr()
249 synic->msg_page = data; in synic_set_msr()
251 synic_exit(synic, msr); in synic_set_msr()
256 if (!synic->active) in synic_set_msr()
259 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) in synic_set_msr()
264 ret = synic_set_sint(synic, msr - HV_X64_MSR_SINT0, data, host); in synic_set_msr()
390 static int synic_get_msr(struct kvm_vcpu_hv_synic *synic, u32 msr, u64 *pdata, in synic_get_msr() argument
395 if (!synic->active && !host) in synic_get_msr()
401 *pdata = synic->control; in synic_get_msr()
404 *pdata = synic->version; in synic_get_msr()
407 *pdata = synic->evt_page; in synic_get_msr()
410 *pdata = synic->msg_page; in synic_get_msr()
416 *pdata = atomic64_read(&synic->sint[msr - HV_X64_MSR_SINT0]); in synic_get_msr()
425 static int synic_set_irq(struct kvm_vcpu_hv_synic *synic, u32 sint) in synic_set_irq() argument
427 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_set_irq()
434 if (sint >= ARRAY_SIZE(synic->sint)) in synic_set_irq()
437 vector = synic_get_sint_vector(synic_read_sint(synic, sint)); in synic_set_irq()
455 struct kvm_vcpu_hv_synic *synic; in kvm_hv_synic_set_irq() local
457 synic = synic_get(kvm, vpidx); in kvm_hv_synic_set_irq()
458 if (!synic) in kvm_hv_synic_set_irq()
461 return synic_set_irq(synic, sint); in kvm_hv_synic_set_irq()
466 struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); in kvm_hv_synic_send_eoi() local
471 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) in kvm_hv_synic_send_eoi()
472 if (synic_get_sint_vector(synic_read_sint(synic, i)) == vector) in kvm_hv_synic_send_eoi()
478 struct kvm_vcpu_hv_synic *synic; in kvm_hv_set_sint_gsi() local
480 synic = synic_get(kvm, vpidx); in kvm_hv_set_sint_gsi()
481 if (!synic) in kvm_hv_set_sint_gsi()
484 if (sint >= ARRAY_SIZE(synic->sint_to_gsi)) in kvm_hv_set_sint_gsi()
487 atomic_set(&synic->sint_to_gsi[sint], gsi); in kvm_hv_set_sint_gsi()
509 static void synic_init(struct kvm_vcpu_hv_synic *synic) in synic_init() argument
513 memset(synic, 0, sizeof(*synic)); in synic_init()
514 synic->version = HV_SYNIC_VERSION_1; in synic_init()
515 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_init()
516 atomic64_set(&synic->sint[i], HV_SYNIC_SINT_MASKED); in synic_init()
517 atomic_set(&synic->sint_to_gsi[i], -1); in synic_init()
643 struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); in stimer_set_config() local
645 if (!synic->active && (!host || config)) in stimer_set_config()
667 struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); in stimer_set_count() local
669 if (!synic->active && (!host || count)) in stimer_set_count()
700 static int synic_deliver_msg(struct kvm_vcpu_hv_synic *synic, u32 sint, in synic_deliver_msg() argument
703 struct kvm_vcpu *vcpu = synic_to_vcpu(synic); in synic_deliver_msg()
709 if (!(synic->msg_page & HV_SYNIC_SIMP_ENABLE)) in synic_deliver_msg()
712 msg_page_gfn = synic->msg_page >> PAGE_SHIFT; in synic_deliver_msg()
749 r = synic_set_irq(synic, sint); in synic_deliver_msg()
894 synic_init(&hv_vcpu->synic); in kvm_hv_vcpu_init()
910 struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); in kvm_hv_activate_synic() local
918 synic->active = true; in kvm_hv_activate_synic()
919 synic->dont_zero_synic_pages = dont_zero_synic_pages; in kvm_hv_activate_synic()
920 synic->control = HV_SYNIC_CONTROL_ENABLE; in kvm_hv_activate_synic()