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