Lines Matching refs:synic

68 static inline u64 synic_read_sint(struct kvm_vcpu_hv_synic *synic, int sint)  in synic_read_sint()  argument
70 return atomic64_read(&synic->sint[sint]); in synic_read_sint()
80 static bool synic_has_vector_connected(struct kvm_vcpu_hv_synic *synic, in synic_has_vector_connected() argument
85 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_has_vector_connected()
86 if (synic_get_sint_vector(synic_read_sint(synic, i)) == vector) in synic_has_vector_connected()
92 static bool synic_has_vector_auto_eoi(struct kvm_vcpu_hv_synic *synic, in synic_has_vector_auto_eoi() argument
98 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_has_vector_auto_eoi()
99 sint_value = synic_read_sint(synic, i); in synic_has_vector_auto_eoi()
107 static void synic_update_vector(struct kvm_vcpu_hv_synic *synic, in synic_update_vector() argument
110 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_update_vector()
117 if (synic_has_vector_connected(synic, vector)) in synic_update_vector()
118 __set_bit(vector, synic->vec_bitmap); in synic_update_vector()
120 __clear_bit(vector, synic->vec_bitmap); in synic_update_vector()
122 auto_eoi_old = !bitmap_empty(synic->auto_eoi_bitmap, 256); in synic_update_vector()
124 if (synic_has_vector_auto_eoi(synic, vector)) in synic_update_vector()
125 __set_bit(vector, synic->auto_eoi_bitmap); in synic_update_vector()
127 __clear_bit(vector, synic->auto_eoi_bitmap); in synic_update_vector()
129 auto_eoi_new = !bitmap_empty(synic->auto_eoi_bitmap, 256); in synic_update_vector()
155 static int synic_set_sint(struct kvm_vcpu_hv_synic *synic, int sint, in synic_set_sint() argument
177 old_vector = synic_read_sint(synic, sint) & HV_SYNIC_SINT_VECTOR_MASK; in synic_set_sint()
179 atomic64_set(&synic->sint[sint], data); in synic_set_sint()
181 synic_update_vector(synic, old_vector); in synic_set_sint()
183 synic_update_vector(synic, vector); in synic_set_sint()
186 kvm_make_request(KVM_REQ_SCAN_IOAPIC, hv_synic_to_vcpu(synic)); in synic_set_sint()
210 struct kvm_vcpu_hv_synic *synic; in synic_get() local
215 synic = to_hv_synic(vcpu); in synic_get()
216 return (synic->active) ? synic : NULL; in synic_get()
222 struct kvm_vcpu_hv_synic *synic = to_hv_synic(vcpu); in kvm_hv_notify_acked_sint() local
239 gsi = atomic_read(&synic->sint_to_gsi[sint]); in kvm_hv_notify_acked_sint()
245 static void synic_exit(struct kvm_vcpu_hv_synic *synic, u32 msr) in synic_exit() argument
247 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_exit()
251 hv_vcpu->exit.u.synic.msr = msr; in synic_exit()
252 hv_vcpu->exit.u.synic.control = synic->control; in synic_exit()
253 hv_vcpu->exit.u.synic.evt_page = synic->evt_page; in synic_exit()
254 hv_vcpu->exit.u.synic.msg_page = synic->msg_page; in synic_exit()
259 static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, in synic_set_msr() argument
262 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_set_msr()
265 if (!synic->active && (!host || data)) in synic_set_msr()
273 synic->control = data; in synic_set_msr()
275 synic_exit(synic, msr); in synic_set_msr()
282 synic->version = data; in synic_set_msr()
286 !synic->dont_zero_synic_pages) in synic_set_msr()
292 synic->evt_page = data; in synic_set_msr()
294 synic_exit(synic, msr); in synic_set_msr()
298 !synic->dont_zero_synic_pages) in synic_set_msr()
304 synic->msg_page = data; in synic_set_msr()
306 synic_exit(synic, msr); in synic_set_msr()
311 if (!synic->active) in synic_set_msr()
314 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) in synic_set_msr()
319 ret = synic_set_sint(synic, msr - HV_X64_MSR_SINT0, data, host); in synic_set_msr()
437 static int synic_get_msr(struct kvm_vcpu_hv_synic *synic, u32 msr, u64 *pdata, in synic_get_msr() argument
442 if (!synic->active && !host) in synic_get_msr()
448 *pdata = synic->control; in synic_get_msr()
451 *pdata = synic->version; in synic_get_msr()
454 *pdata = synic->evt_page; in synic_get_msr()
457 *pdata = synic->msg_page; in synic_get_msr()
463 *pdata = atomic64_read(&synic->sint[msr - HV_X64_MSR_SINT0]); in synic_get_msr()
472 static int synic_set_irq(struct kvm_vcpu_hv_synic *synic, u32 sint) in synic_set_irq() argument
474 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_set_irq()
481 if (sint >= ARRAY_SIZE(synic->sint)) in synic_set_irq()
484 vector = synic_get_sint_vector(synic_read_sint(synic, sint)); in synic_set_irq()
502 struct kvm_vcpu_hv_synic *synic; in kvm_hv_synic_set_irq() local
504 synic = synic_get(kvm, vpidx); in kvm_hv_synic_set_irq()
505 if (!synic) in kvm_hv_synic_set_irq()
508 return synic_set_irq(synic, sint); in kvm_hv_synic_set_irq()
513 struct kvm_vcpu_hv_synic *synic = to_hv_synic(vcpu); in kvm_hv_synic_send_eoi() local
518 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) in kvm_hv_synic_send_eoi()
519 if (synic_get_sint_vector(synic_read_sint(synic, i)) == vector) in kvm_hv_synic_send_eoi()
525 struct kvm_vcpu_hv_synic *synic; in kvm_hv_set_sint_gsi() local
527 synic = synic_get(kvm, vpidx); in kvm_hv_set_sint_gsi()
528 if (!synic) in kvm_hv_set_sint_gsi()
531 if (sint >= ARRAY_SIZE(synic->sint_to_gsi)) in kvm_hv_set_sint_gsi()
534 atomic_set(&synic->sint_to_gsi[sint], gsi); in kvm_hv_set_sint_gsi()
556 static void synic_init(struct kvm_vcpu_hv_synic *synic) in synic_init() argument
560 memset(synic, 0, sizeof(*synic)); in synic_init()
561 synic->version = HV_SYNIC_VERSION_1; in synic_init()
562 for (i = 0; i < ARRAY_SIZE(synic->sint); i++) { in synic_init()
563 atomic64_set(&synic->sint[i], HV_SYNIC_SINT_MASKED); in synic_init()
564 atomic_set(&synic->sint_to_gsi[i], -1); in synic_init()
691 struct kvm_vcpu_hv_synic *synic = to_hv_synic(vcpu); in stimer_set_config() local
693 if (!synic->active && (!host || config)) in stimer_set_config()
720 struct kvm_vcpu_hv_synic *synic = to_hv_synic(vcpu); in stimer_set_count() local
722 if (!synic->active && (!host || count)) in stimer_set_count()
753 static int synic_deliver_msg(struct kvm_vcpu_hv_synic *synic, u32 sint, in synic_deliver_msg() argument
756 struct kvm_vcpu *vcpu = hv_synic_to_vcpu(synic); in synic_deliver_msg()
762 if (!(synic->msg_page & HV_SYNIC_SIMP_ENABLE)) in synic_deliver_msg()
765 msg_page_gfn = synic->msg_page >> PAGE_SHIFT; in synic_deliver_msg()
802 r = synic_set_irq(synic, sint); in synic_deliver_msg()
973 synic_init(&hv_vcpu->synic); in kvm_hv_vcpu_init()
991 struct kvm_vcpu_hv_synic *synic; in kvm_hv_activate_synic() local
998 synic = to_hv_synic(vcpu); in kvm_hv_activate_synic()
1000 synic->active = true; in kvm_hv_activate_synic()
1001 synic->dont_zero_synic_pages = dont_zero_synic_pages; in kvm_hv_activate_synic()
1002 synic->control = HV_SYNIC_CONTROL_ENABLE; in kvm_hv_activate_synic()