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