Lines Matching refs:synic

49 static inline u64 synic_read_sint(struct kvm_vcpu_hv_synic *synic, int sint)  in synic_read_sint()  argument
51 return atomic64_read(&synic->sint[sint]); in synic_read_sint()
61 static bool synic_has_vector_connected(struct kvm_vcpu_hv_synic *synic, in synic_has_vector_connected() argument
66 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_has_vector_connected()
67 if (synic_get_sint_vector(synic_read_sint(synic, i)) == vector) in synic_has_vector_connected()
73 static bool synic_has_vector_auto_eoi(struct kvm_vcpu_hv_synic *synic, in synic_has_vector_auto_eoi() argument
79 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_has_vector_auto_eoi()
80 sint_value = synic_read_sint(synic, i); in synic_has_vector_auto_eoi()
88 static void synic_update_vector(struct kvm_vcpu_hv_synic *synic, in synic_update_vector() argument
91 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_update_vector()
98 if (synic_has_vector_connected(synic, vector)) in synic_update_vector()
99 __set_bit(vector, synic->vec_bitmap); in synic_update_vector()
101 __clear_bit(vector, synic->vec_bitmap); in synic_update_vector()
103 auto_eoi_old = bitmap_weight(synic->auto_eoi_bitmap, 256); in synic_update_vector()
105 if (synic_has_vector_auto_eoi(synic, vector)) in synic_update_vector()
106 __set_bit(vector, synic->auto_eoi_bitmap); in synic_update_vector()
108 __clear_bit(vector, synic->auto_eoi_bitmap); in synic_update_vector()
110 auto_eoi_new = bitmap_weight(synic->auto_eoi_bitmap, 256); in synic_update_vector()
129 static int synic_set_sint(struct kvm_vcpu_hv_synic *synic, int sint, in synic_set_sint() argument
151 old_vector = synic_read_sint(synic, sint) & HV_SYNIC_SINT_VECTOR_MASK; in synic_set_sint()
153 atomic64_set(&synic->sint[sint], data); in synic_set_sint()
155 synic_update_vector(synic, old_vector); in synic_set_sint()
157 synic_update_vector(synic, vector); in synic_set_sint()
160 kvm_make_request(KVM_REQ_SCAN_IOAPIC, hv_synic_to_vcpu(synic)); in synic_set_sint()
184 struct kvm_vcpu_hv_synic *synic; in synic_get() local
189 synic = to_hv_synic(vcpu); in synic_get()
190 return (synic->active) ? synic : NULL; in synic_get()
196 struct kvm_vcpu_hv_synic *synic = to_hv_synic(vcpu); in kvm_hv_notify_acked_sint() local
213 gsi = atomic_read(&synic->sint_to_gsi[sint]); in kvm_hv_notify_acked_sint()
219 static void synic_exit(struct kvm_vcpu_hv_synic *synic, u32 msr) in synic_exit() argument
221 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_exit()
225 hv_vcpu->exit.u.synic.msr = msr; in synic_exit()
226 hv_vcpu->exit.u.synic.control = synic->control; in synic_exit()
227 hv_vcpu->exit.u.synic.evt_page = synic->evt_page; in synic_exit()
228 hv_vcpu->exit.u.synic.msg_page = synic->msg_page; in synic_exit()
233 static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, in synic_set_msr() argument
236 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_set_msr()
239 if (!synic->active && !host) in synic_set_msr()
247 synic->control = data; in synic_set_msr()
249 synic_exit(synic, msr); in synic_set_msr()
256 synic->version = data; in synic_set_msr()
260 !synic->dont_zero_synic_pages) in synic_set_msr()
266 synic->evt_page = data; in synic_set_msr()
268 synic_exit(synic, msr); in synic_set_msr()
272 !synic->dont_zero_synic_pages) in synic_set_msr()
278 synic->msg_page = data; in synic_set_msr()
280 synic_exit(synic, msr); in synic_set_msr()
285 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) in synic_set_msr()
290 ret = synic_set_sint(synic, msr - HV_X64_MSR_SINT0, data, host); in synic_set_msr()
408 static int synic_get_msr(struct kvm_vcpu_hv_synic *synic, u32 msr, u64 *pdata, in synic_get_msr() argument
413 if (!synic->active && !host) in synic_get_msr()
419 *pdata = synic->control; in synic_get_msr()
422 *pdata = synic->version; in synic_get_msr()
425 *pdata = synic->evt_page; in synic_get_msr()
428 *pdata = synic->msg_page; in synic_get_msr()
434 *pdata = atomic64_read(&synic->sint[msr - HV_X64_MSR_SINT0]); in synic_get_msr()
443 static int synic_set_irq(struct kvm_vcpu_hv_synic *synic, u32 sint) in synic_set_irq() argument
445 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_set_irq()
449 if (sint >= ARRAY_SIZE(synic->sint)) in synic_set_irq()
452 vector = synic_get_sint_vector(synic_read_sint(synic, sint)); in synic_set_irq()
470 struct kvm_vcpu_hv_synic *synic; in kvm_hv_synic_set_irq() local
472 synic = synic_get(kvm, vpidx); in kvm_hv_synic_set_irq()
473 if (!synic) in kvm_hv_synic_set_irq()
476 return synic_set_irq(synic, sint); in kvm_hv_synic_set_irq()
481 struct kvm_vcpu_hv_synic *synic = to_hv_synic(vcpu); in kvm_hv_synic_send_eoi() local
486 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) in kvm_hv_synic_send_eoi()
487 if (synic_get_sint_vector(synic_read_sint(synic, i)) == vector) in kvm_hv_synic_send_eoi()
493 struct kvm_vcpu_hv_synic *synic; in kvm_hv_set_sint_gsi() local
495 synic = synic_get(kvm, vpidx); in kvm_hv_set_sint_gsi()
496 if (!synic) in kvm_hv_set_sint_gsi()
499 if (sint >= ARRAY_SIZE(synic->sint_to_gsi)) in kvm_hv_set_sint_gsi()
502 atomic_set(&synic->sint_to_gsi[sint], gsi); in kvm_hv_set_sint_gsi()
524 static void synic_init(struct kvm_vcpu_hv_synic *synic) in synic_init() argument
528 memset(synic, 0, sizeof(*synic)); in synic_init()
529 synic->version = HV_SYNIC_VERSION_1; in synic_init()
530 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_init()
531 atomic64_set(&synic->sint[i], HV_SYNIC_SINT_MASKED); in synic_init()
532 atomic_set(&synic->sint_to_gsi[i], -1); in synic_init()
659 struct kvm_vcpu_hv_synic *synic = to_hv_synic(vcpu); in stimer_set_config() local
661 if (!synic->active && !host) in stimer_set_config()
688 struct kvm_vcpu_hv_synic *synic = to_hv_synic(vcpu); in stimer_set_count() local
690 if (!synic->active && !host) in stimer_set_count()
721 static int synic_deliver_msg(struct kvm_vcpu_hv_synic *synic, u32 sint, in synic_deliver_msg() argument
724 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_deliver_msg()
730 if (!(synic->msg_page & HV_SYNIC_SIMP_ENABLE)) in synic_deliver_msg()
733 msg_page_gfn = synic->msg_page >> PAGE_SHIFT; in synic_deliver_msg()
770 r = synic_set_irq(synic, sint); in synic_deliver_msg()
936 synic_init(&hv_vcpu->synic); in kvm_hv_vcpu_init()
949 struct kvm_vcpu_hv_synic *synic; in kvm_hv_activate_synic() local
958 synic = to_hv_synic(vcpu); in kvm_hv_activate_synic()
960 synic->active = true; in kvm_hv_activate_synic()
961 synic->dont_zero_synic_pages = dont_zero_synic_pages; in kvm_hv_activate_synic()
962 synic->control = HV_SYNIC_CONTROL_ENABLE; in kvm_hv_activate_synic()