Lines Matching refs:hc

1752 static u64 kvm_get_sparse_vp_set(struct kvm *kvm, struct kvm_hv_hcall *hc,  in kvm_get_sparse_vp_set()  argument
1759 if (hc->var_cnt > 64) in kvm_get_sparse_vp_set()
1763 var_cnt = min_t(u16, hc->var_cnt, KVM_HV_MAX_SPARSE_VCPU_SET_BITS); in kvm_get_sparse_vp_set()
1765 if (hc->fast) { in kvm_get_sparse_vp_set()
1770 if (hc->var_cnt > 2 * HV_HYPERCALL_MAX_XMM_REGISTERS - consumed_xmm_halves) in kvm_get_sparse_vp_set()
1775 sparse_banks[i] = sse128_hi(hc->xmm[j / 2]); in kvm_get_sparse_vp_set()
1777 sparse_banks[i] = sse128_lo(hc->xmm[j / 2]); in kvm_get_sparse_vp_set()
1782 return kvm_read_guest(kvm, hc->ingpa + offset, sparse_banks, in kvm_get_sparse_vp_set()
1786 static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc) in kvm_hv_flush_tlb() argument
1804 if (hc->code == HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST || in kvm_hv_flush_tlb()
1805 hc->code == HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE) { in kvm_hv_flush_tlb()
1806 if (hc->fast) { in kvm_hv_flush_tlb()
1807 flush.address_space = hc->ingpa; in kvm_hv_flush_tlb()
1808 flush.flags = hc->outgpa; in kvm_hv_flush_tlb()
1809 flush.processor_mask = sse128_lo(hc->xmm[0]); in kvm_hv_flush_tlb()
1811 if (unlikely(kvm_read_guest(kvm, hc->ingpa, in kvm_hv_flush_tlb()
1832 if (hc->fast) { in kvm_hv_flush_tlb()
1833 flush_ex.address_space = hc->ingpa; in kvm_hv_flush_tlb()
1834 flush_ex.flags = hc->outgpa; in kvm_hv_flush_tlb()
1836 &hc->xmm[0], sizeof(hc->xmm[0])); in kvm_hv_flush_tlb()
1838 if (unlikely(kvm_read_guest(kvm, hc->ingpa, &flush_ex, in kvm_hv_flush_tlb()
1852 if (hc->var_cnt != hweight64(valid_bank_mask)) in kvm_hv_flush_tlb()
1858 if (!hc->var_cnt) in kvm_hv_flush_tlb()
1861 if (kvm_get_sparse_vp_set(kvm, hc, 2, sparse_banks, in kvm_hv_flush_tlb()
1883 ((u64)hc->rep_cnt << HV_HYPERCALL_REP_COMP_OFFSET); in kvm_hv_flush_tlb()
1905 static u64 kvm_hv_send_ipi(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc) in kvm_hv_send_ipi() argument
1916 if (hc->code == HVCALL_SEND_IPI) { in kvm_hv_send_ipi()
1917 if (!hc->fast) { in kvm_hv_send_ipi()
1918 if (unlikely(kvm_read_guest(kvm, hc->ingpa, &send_ipi, in kvm_hv_send_ipi()
1925 if (unlikely(hc->ingpa >> 32 != 0)) in kvm_hv_send_ipi()
1927 sparse_banks[0] = hc->outgpa; in kvm_hv_send_ipi()
1928 vector = (u32)hc->ingpa; in kvm_hv_send_ipi()
1935 if (!hc->fast) { in kvm_hv_send_ipi()
1936 if (unlikely(kvm_read_guest(kvm, hc->ingpa, &send_ipi_ex, in kvm_hv_send_ipi()
1940 send_ipi_ex.vector = (u32)hc->ingpa; in kvm_hv_send_ipi()
1941 send_ipi_ex.vp_set.format = hc->outgpa; in kvm_hv_send_ipi()
1942 send_ipi_ex.vp_set.valid_bank_mask = sse128_lo(hc->xmm[0]); in kvm_hv_send_ipi()
1953 if (hc->var_cnt != hweight64(valid_bank_mask)) in kvm_hv_send_ipi()
1959 if (!hc->var_cnt) in kvm_hv_send_ipi()
1962 if (kvm_get_sparse_vp_set(kvm, hc, 1, sparse_banks, in kvm_hv_send_ipi()
2076 static u16 kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc) in kvm_hvcall_signal_event() argument
2081 if (unlikely(!hc->fast)) { in kvm_hvcall_signal_event()
2083 gpa_t gpa = hc->ingpa; in kvm_hvcall_signal_event()
2085 if ((gpa & (__alignof__(hc->ingpa) - 1)) || in kvm_hvcall_signal_event()
2086 offset_in_page(gpa) + sizeof(hc->ingpa) > PAGE_SIZE) in kvm_hvcall_signal_event()
2090 &hc->ingpa, sizeof(hc->ingpa)); in kvm_hvcall_signal_event()
2100 if (hc->ingpa & 0xffff00000000ULL) in kvm_hvcall_signal_event()
2103 if (hc->ingpa & ~KVM_HYPERV_CONN_ID_MASK) in kvm_hvcall_signal_event()
2108 eventfd = idr_find(&hv->conn_to_evt, hc->ingpa); in kvm_hvcall_signal_event()
2117 static bool is_xmm_fast_hypercall(struct kvm_hv_hcall *hc) in is_xmm_fast_hypercall() argument
2119 switch (hc->code) { in is_xmm_fast_hypercall()
2131 static void kvm_hv_hypercall_read_xmm(struct kvm_hv_hcall *hc) in kvm_hv_hypercall_read_xmm() argument
2137 _kvm_read_sse_reg(reg, &hc->xmm[reg]); in kvm_hv_hypercall_read_xmm()
2191 struct kvm_hv_hcall hc; in kvm_hv_hypercall() local
2205 hc.param = kvm_rcx_read(vcpu); in kvm_hv_hypercall()
2206 hc.ingpa = kvm_rdx_read(vcpu); in kvm_hv_hypercall()
2207 hc.outgpa = kvm_r8_read(vcpu); in kvm_hv_hypercall()
2211 hc.param = ((u64)kvm_rdx_read(vcpu) << 32) | in kvm_hv_hypercall()
2213 hc.ingpa = ((u64)kvm_rbx_read(vcpu) << 32) | in kvm_hv_hypercall()
2215 hc.outgpa = ((u64)kvm_rdi_read(vcpu) << 32) | in kvm_hv_hypercall()
2219 hc.code = hc.param & 0xffff; in kvm_hv_hypercall()
2220 hc.var_cnt = (hc.param & HV_HYPERCALL_VARHEAD_MASK) >> HV_HYPERCALL_VARHEAD_OFFSET; in kvm_hv_hypercall()
2221 hc.fast = !!(hc.param & HV_HYPERCALL_FAST_BIT); in kvm_hv_hypercall()
2222 hc.rep_cnt = (hc.param >> HV_HYPERCALL_REP_COMP_OFFSET) & 0xfff; in kvm_hv_hypercall()
2223 hc.rep_idx = (hc.param >> HV_HYPERCALL_REP_START_OFFSET) & 0xfff; in kvm_hv_hypercall()
2224 hc.rep = !!(hc.rep_cnt || hc.rep_idx); in kvm_hv_hypercall()
2226 trace_kvm_hv_hypercall(hc.code, hc.fast, hc.var_cnt, hc.rep_cnt, in kvm_hv_hypercall()
2227 hc.rep_idx, hc.ingpa, hc.outgpa); in kvm_hv_hypercall()
2229 if (unlikely(!hv_check_hypercall_access(hv_vcpu, hc.code))) { in kvm_hv_hypercall()
2234 if (unlikely(hc.param & HV_HYPERCALL_RSVD_MASK)) { in kvm_hv_hypercall()
2239 if (hc.fast && is_xmm_fast_hypercall(&hc)) { in kvm_hv_hypercall()
2247 kvm_hv_hypercall_read_xmm(&hc); in kvm_hv_hypercall()
2250 switch (hc.code) { in kvm_hv_hypercall()
2252 if (unlikely(hc.rep || hc.var_cnt)) { in kvm_hv_hypercall()
2259 if (unlikely(hc.rep || hc.var_cnt)) { in kvm_hv_hypercall()
2263 ret = kvm_hvcall_signal_event(vcpu, &hc); in kvm_hv_hypercall()
2269 if (unlikely(hc.rep || hc.var_cnt || !to_hv_synic(vcpu)->active)) { in kvm_hv_hypercall()
2275 vcpu->run->hyperv.u.hcall.input = hc.param; in kvm_hv_hypercall()
2276 vcpu->run->hyperv.u.hcall.params[0] = hc.ingpa; in kvm_hv_hypercall()
2277 vcpu->run->hyperv.u.hcall.params[1] = hc.outgpa; in kvm_hv_hypercall()
2282 if (unlikely(hc.var_cnt)) { in kvm_hv_hypercall()
2288 if (unlikely(!hc.rep_cnt || hc.rep_idx)) { in kvm_hv_hypercall()
2292 ret = kvm_hv_flush_tlb(vcpu, &hc); in kvm_hv_hypercall()
2295 if (unlikely(hc.var_cnt)) { in kvm_hv_hypercall()
2301 if (unlikely(hc.rep)) { in kvm_hv_hypercall()
2305 ret = kvm_hv_flush_tlb(vcpu, &hc); in kvm_hv_hypercall()
2308 if (unlikely(hc.var_cnt)) { in kvm_hv_hypercall()
2314 if (unlikely(hc.rep)) { in kvm_hv_hypercall()
2318 ret = kvm_hv_send_ipi(vcpu, &hc); in kvm_hv_hypercall()
2322 if (unlikely(hc.fast)) { in kvm_hv_hypercall()
2341 vcpu->run->hyperv.u.hcall.input = hc.param; in kvm_hv_hypercall()
2342 vcpu->run->hyperv.u.hcall.params[0] = hc.ingpa; in kvm_hv_hypercall()
2343 vcpu->run->hyperv.u.hcall.params[1] = hc.outgpa; in kvm_hv_hypercall()