hyperv.c (bd38b32053eb1c53ddb7030cf0fc6d700f7f1d82) | hyperv.c (5974565bc26d6a599189db7c0b1f79eaa9af8eb9) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * KVM Microsoft Hyper-V emulation 4 * 5 * derived from arch/x86/kvm/x86.c 6 * 7 * Copyright (C) 2006 Qumranet, Inc. 8 * Copyright (C) 2008 Qumranet, Inc. --- 22 unchanged lines hidden (view full) --- 31#include <linux/sched/cputime.h> 32#include <linux/eventfd.h> 33 34#include <asm/apicdef.h> 35#include <trace/events/kvm.h> 36 37#include "trace.h" 38#include "irq.h" | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * KVM Microsoft Hyper-V emulation 4 * 5 * derived from arch/x86/kvm/x86.c 6 * 7 * Copyright (C) 2006 Qumranet, Inc. 8 * Copyright (C) 2008 Qumranet, Inc. --- 22 unchanged lines hidden (view full) --- 31#include <linux/sched/cputime.h> 32#include <linux/eventfd.h> 33 34#include <asm/apicdef.h> 35#include <trace/events/kvm.h> 36 37#include "trace.h" 38#include "irq.h" |
39#include "fpu.h" |
|
39 40/* "Hv#1" signature */ 41#define HYPERV_CPUID_SIGNATURE_EAX 0x31237648 42 43#define KVM_HV_MAX_SPARSE_VCPU_SET_BITS DIV_ROUND_UP(KVM_MAX_VCPUS, 64) 44 45static void stimer_mark_pending(struct kvm_vcpu_hv_stimer *stimer, 46 bool vcpu_kick); --- 1588 unchanged lines hidden (view full) --- 1635 u64 param; 1636 u64 ingpa; 1637 u64 outgpa; 1638 u16 code; 1639 u16 rep_cnt; 1640 u16 rep_idx; 1641 bool fast; 1642 bool rep; | 40 41/* "Hv#1" signature */ 42#define HYPERV_CPUID_SIGNATURE_EAX 0x31237648 43 44#define KVM_HV_MAX_SPARSE_VCPU_SET_BITS DIV_ROUND_UP(KVM_MAX_VCPUS, 64) 45 46static void stimer_mark_pending(struct kvm_vcpu_hv_stimer *stimer, 47 bool vcpu_kick); --- 1588 unchanged lines hidden (view full) --- 1636 u64 param; 1637 u64 ingpa; 1638 u64 outgpa; 1639 u16 code; 1640 u16 rep_cnt; 1641 u16 rep_idx; 1642 bool fast; 1643 bool rep; |
1644 sse128_t xmm[HV_HYPERCALL_MAX_XMM_REGISTERS]; |
|
1643}; 1644 1645static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc, bool ex) 1646{ | 1645}; 1646 1647static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc, bool ex) 1648{ |
1649 int i; 1650 gpa_t gpa; |
|
1647 struct kvm *kvm = vcpu->kvm; 1648 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); 1649 struct hv_tlb_flush_ex flush_ex; 1650 struct hv_tlb_flush flush; 1651 u64 vp_bitmap[KVM_HV_MAX_SPARSE_VCPU_SET_BITS]; 1652 DECLARE_BITMAP(vcpu_bitmap, KVM_MAX_VCPUS); 1653 unsigned long *vcpu_mask; 1654 u64 valid_bank_mask; 1655 u64 sparse_banks[64]; 1656 int sparse_banks_len; 1657 bool all_cpus; 1658 1659 if (!ex) { | 1651 struct kvm *kvm = vcpu->kvm; 1652 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); 1653 struct hv_tlb_flush_ex flush_ex; 1654 struct hv_tlb_flush flush; 1655 u64 vp_bitmap[KVM_HV_MAX_SPARSE_VCPU_SET_BITS]; 1656 DECLARE_BITMAP(vcpu_bitmap, KVM_MAX_VCPUS); 1657 unsigned long *vcpu_mask; 1658 u64 valid_bank_mask; 1659 u64 sparse_banks[64]; 1660 int sparse_banks_len; 1661 bool all_cpus; 1662 1663 if (!ex) { |
1660 if (unlikely(kvm_read_guest(kvm, hc->ingpa, &flush, sizeof(flush)))) 1661 return HV_STATUS_INVALID_HYPERCALL_INPUT; | 1664 if (hc->fast) { 1665 flush.address_space = hc->ingpa; 1666 flush.flags = hc->outgpa; 1667 flush.processor_mask = sse128_lo(hc->xmm[0]); 1668 } else { 1669 if (unlikely(kvm_read_guest(kvm, hc->ingpa, 1670 &flush, sizeof(flush)))) 1671 return HV_STATUS_INVALID_HYPERCALL_INPUT; 1672 } |
1662 1663 trace_kvm_hv_flush_tlb(flush.processor_mask, 1664 flush.address_space, flush.flags); 1665 1666 valid_bank_mask = BIT_ULL(0); 1667 sparse_banks[0] = flush.processor_mask; 1668 1669 /* 1670 * Work around possible WS2012 bug: it sends hypercalls 1671 * with processor_mask = 0x0 and HV_FLUSH_ALL_PROCESSORS clear, 1672 * while also expecting us to flush something and crashing if 1673 * we don't. Let's treat processor_mask == 0 same as 1674 * HV_FLUSH_ALL_PROCESSORS. 1675 */ 1676 all_cpus = (flush.flags & HV_FLUSH_ALL_PROCESSORS) || 1677 flush.processor_mask == 0; 1678 } else { | 1673 1674 trace_kvm_hv_flush_tlb(flush.processor_mask, 1675 flush.address_space, flush.flags); 1676 1677 valid_bank_mask = BIT_ULL(0); 1678 sparse_banks[0] = flush.processor_mask; 1679 1680 /* 1681 * Work around possible WS2012 bug: it sends hypercalls 1682 * with processor_mask = 0x0 and HV_FLUSH_ALL_PROCESSORS clear, 1683 * while also expecting us to flush something and crashing if 1684 * we don't. Let's treat processor_mask == 0 same as 1685 * HV_FLUSH_ALL_PROCESSORS. 1686 */ 1687 all_cpus = (flush.flags & HV_FLUSH_ALL_PROCESSORS) || 1688 flush.processor_mask == 0; 1689 } else { |
1679 if (unlikely(kvm_read_guest(kvm, hc->ingpa, &flush_ex, 1680 sizeof(flush_ex)))) 1681 return HV_STATUS_INVALID_HYPERCALL_INPUT; | 1690 if (hc->fast) { 1691 flush_ex.address_space = hc->ingpa; 1692 flush_ex.flags = hc->outgpa; 1693 memcpy(&flush_ex.hv_vp_set, 1694 &hc->xmm[0], sizeof(hc->xmm[0])); 1695 } else { 1696 if (unlikely(kvm_read_guest(kvm, hc->ingpa, &flush_ex, 1697 sizeof(flush_ex)))) 1698 return HV_STATUS_INVALID_HYPERCALL_INPUT; 1699 } |
1682 1683 trace_kvm_hv_flush_tlb_ex(flush_ex.hv_vp_set.valid_bank_mask, 1684 flush_ex.hv_vp_set.format, 1685 flush_ex.address_space, 1686 flush_ex.flags); 1687 1688 valid_bank_mask = flush_ex.hv_vp_set.valid_bank_mask; 1689 all_cpus = flush_ex.hv_vp_set.format != 1690 HV_GENERIC_SET_SPARSE_4K; 1691 | 1700 1701 trace_kvm_hv_flush_tlb_ex(flush_ex.hv_vp_set.valid_bank_mask, 1702 flush_ex.hv_vp_set.format, 1703 flush_ex.address_space, 1704 flush_ex.flags); 1705 1706 valid_bank_mask = flush_ex.hv_vp_set.valid_bank_mask; 1707 all_cpus = flush_ex.hv_vp_set.format != 1708 HV_GENERIC_SET_SPARSE_4K; 1709 |
1692 sparse_banks_len = 1693 bitmap_weight((unsigned long *)&valid_bank_mask, 64) * 1694 sizeof(sparse_banks[0]); | 1710 sparse_banks_len = bitmap_weight((unsigned long *)&valid_bank_mask, 64); |
1695 1696 if (!sparse_banks_len && !all_cpus) 1697 goto ret_success; 1698 | 1711 1712 if (!sparse_banks_len && !all_cpus) 1713 goto ret_success; 1714 |
1699 if (!all_cpus && 1700 kvm_read_guest(kvm, 1701 hc->ingpa + offsetof(struct hv_tlb_flush_ex, 1702 hv_vp_set.bank_contents), 1703 sparse_banks, 1704 sparse_banks_len)) 1705 return HV_STATUS_INVALID_HYPERCALL_INPUT; | 1715 if (!all_cpus) { 1716 if (hc->fast) { 1717 if (sparse_banks_len > HV_HYPERCALL_MAX_XMM_REGISTERS - 1) 1718 return HV_STATUS_INVALID_HYPERCALL_INPUT; 1719 for (i = 0; i < sparse_banks_len; i += 2) { 1720 sparse_banks[i] = sse128_lo(hc->xmm[i / 2 + 1]); 1721 sparse_banks[i + 1] = sse128_hi(hc->xmm[i / 2 + 1]); 1722 } 1723 } else { 1724 gpa = hc->ingpa + offsetof(struct hv_tlb_flush_ex, 1725 hv_vp_set.bank_contents); 1726 if (unlikely(kvm_read_guest(kvm, gpa, sparse_banks, 1727 sparse_banks_len * 1728 sizeof(sparse_banks[0])))) 1729 return HV_STATUS_INVALID_HYPERCALL_INPUT; 1730 } 1731 } |
1706 } 1707 1708 cpumask_clear(&hv_vcpu->tlb_flush); 1709 1710 vcpu_mask = all_cpus ? NULL : 1711 sparse_set_to_vcpu_mask(kvm, sparse_banks, valid_bank_mask, 1712 vp_bitmap, vcpu_bitmap); 1713 --- 179 unchanged lines hidden (view full) --- 1893 rcu_read_unlock(); 1894 if (!eventfd) 1895 return HV_STATUS_INVALID_PORT_ID; 1896 1897 eventfd_signal(eventfd, 1); 1898 return HV_STATUS_SUCCESS; 1899} 1900 | 1732 } 1733 1734 cpumask_clear(&hv_vcpu->tlb_flush); 1735 1736 vcpu_mask = all_cpus ? NULL : 1737 sparse_set_to_vcpu_mask(kvm, sparse_banks, valid_bank_mask, 1738 vp_bitmap, vcpu_bitmap); 1739 --- 179 unchanged lines hidden (view full) --- 1919 rcu_read_unlock(); 1920 if (!eventfd) 1921 return HV_STATUS_INVALID_PORT_ID; 1922 1923 eventfd_signal(eventfd, 1); 1924 return HV_STATUS_SUCCESS; 1925} 1926 |
1927static bool is_xmm_fast_hypercall(struct kvm_hv_hcall *hc) 1928{ 1929 switch (hc->code) { 1930 case HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST: 1931 case HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE: 1932 case HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST_EX: 1933 case HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX: 1934 return true; 1935 } 1936 1937 return false; 1938} 1939 1940static void kvm_hv_hypercall_read_xmm(struct kvm_hv_hcall *hc) 1941{ 1942 int reg; 1943 1944 kvm_fpu_get(); 1945 for (reg = 0; reg < HV_HYPERCALL_MAX_XMM_REGISTERS; reg++) 1946 _kvm_read_sse_reg(reg, &hc->xmm[reg]); 1947 kvm_fpu_put(); 1948} 1949 |
|
1901int kvm_hv_hypercall(struct kvm_vcpu *vcpu) 1902{ 1903 struct kvm_hv_hcall hc; 1904 u64 ret = HV_STATUS_SUCCESS; 1905 1906 /* 1907 * hypercall generates UD from non zero cpl and real mode 1908 * per HYPER-V spec --- 20 unchanged lines hidden (view full) --- 1929 } 1930 1931 hc.code = hc.param & 0xffff; 1932 hc.fast = !!(hc.param & HV_HYPERCALL_FAST_BIT); 1933 hc.rep_cnt = (hc.param >> HV_HYPERCALL_REP_COMP_OFFSET) & 0xfff; 1934 hc.rep_idx = (hc.param >> HV_HYPERCALL_REP_START_OFFSET) & 0xfff; 1935 hc.rep = !!(hc.rep_cnt || hc.rep_idx); 1936 | 1950int kvm_hv_hypercall(struct kvm_vcpu *vcpu) 1951{ 1952 struct kvm_hv_hcall hc; 1953 u64 ret = HV_STATUS_SUCCESS; 1954 1955 /* 1956 * hypercall generates UD from non zero cpl and real mode 1957 * per HYPER-V spec --- 20 unchanged lines hidden (view full) --- 1978 } 1979 1980 hc.code = hc.param & 0xffff; 1981 hc.fast = !!(hc.param & HV_HYPERCALL_FAST_BIT); 1982 hc.rep_cnt = (hc.param >> HV_HYPERCALL_REP_COMP_OFFSET) & 0xfff; 1983 hc.rep_idx = (hc.param >> HV_HYPERCALL_REP_START_OFFSET) & 0xfff; 1984 hc.rep = !!(hc.rep_cnt || hc.rep_idx); 1985 |
1986 if (hc.fast && is_xmm_fast_hypercall(&hc)) 1987 kvm_hv_hypercall_read_xmm(&hc); 1988 |
|
1937 trace_kvm_hv_hypercall(hc.code, hc.fast, hc.rep_cnt, hc.rep_idx, 1938 hc.ingpa, hc.outgpa); 1939 1940 switch (hc.code) { 1941 case HVCALL_NOTIFY_LONG_SPIN_WAIT: 1942 if (unlikely(hc.rep)) { 1943 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 1944 break; --- 19 unchanged lines hidden (view full) --- 1964 vcpu->run->hyperv.type = KVM_EXIT_HYPERV_HCALL; 1965 vcpu->run->hyperv.u.hcall.input = hc.param; 1966 vcpu->run->hyperv.u.hcall.params[0] = hc.ingpa; 1967 vcpu->run->hyperv.u.hcall.params[1] = hc.outgpa; 1968 vcpu->arch.complete_userspace_io = 1969 kvm_hv_hypercall_complete_userspace; 1970 return 0; 1971 case HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST: | 1989 trace_kvm_hv_hypercall(hc.code, hc.fast, hc.rep_cnt, hc.rep_idx, 1990 hc.ingpa, hc.outgpa); 1991 1992 switch (hc.code) { 1993 case HVCALL_NOTIFY_LONG_SPIN_WAIT: 1994 if (unlikely(hc.rep)) { 1995 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 1996 break; --- 19 unchanged lines hidden (view full) --- 2016 vcpu->run->hyperv.type = KVM_EXIT_HYPERV_HCALL; 2017 vcpu->run->hyperv.u.hcall.input = hc.param; 2018 vcpu->run->hyperv.u.hcall.params[0] = hc.ingpa; 2019 vcpu->run->hyperv.u.hcall.params[1] = hc.outgpa; 2020 vcpu->arch.complete_userspace_io = 2021 kvm_hv_hypercall_complete_userspace; 2022 return 0; 2023 case HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST: |
1972 if (unlikely(hc.fast || !hc.rep_cnt || hc.rep_idx)) { | 2024 if (unlikely(!hc.rep_cnt || hc.rep_idx)) { |
1973 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 1974 break; 1975 } 1976 ret = kvm_hv_flush_tlb(vcpu, &hc, false); 1977 break; 1978 case HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE: | 2025 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 2026 break; 2027 } 2028 ret = kvm_hv_flush_tlb(vcpu, &hc, false); 2029 break; 2030 case HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE: |
1979 if (unlikely(hc.fast || hc.rep)) { | 2031 if (unlikely(hc.rep)) { |
1980 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 1981 break; 1982 } 1983 ret = kvm_hv_flush_tlb(vcpu, &hc, false); 1984 break; 1985 case HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST_EX: | 2032 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 2033 break; 2034 } 2035 ret = kvm_hv_flush_tlb(vcpu, &hc, false); 2036 break; 2037 case HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST_EX: |
1986 if (unlikely(hc.fast || !hc.rep_cnt || hc.rep_idx)) { | 2038 if (unlikely(!hc.rep_cnt || hc.rep_idx)) { |
1987 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 1988 break; 1989 } 1990 ret = kvm_hv_flush_tlb(vcpu, &hc, true); 1991 break; 1992 case HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX: | 2039 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 2040 break; 2041 } 2042 ret = kvm_hv_flush_tlb(vcpu, &hc, true); 2043 break; 2044 case HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX: |
1993 if (unlikely(hc.fast || hc.rep)) { | 2045 if (unlikely(hc.rep)) { |
1994 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 1995 break; 1996 } 1997 ret = kvm_hv_flush_tlb(vcpu, &hc, true); 1998 break; 1999 case HVCALL_SEND_IPI: 2000 if (unlikely(hc.rep)) { 2001 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; --- 271 unchanged lines hidden --- | 2046 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; 2047 break; 2048 } 2049 ret = kvm_hv_flush_tlb(vcpu, &hc, true); 2050 break; 2051 case HVCALL_SEND_IPI: 2052 if (unlikely(hc.rep)) { 2053 ret = HV_STATUS_INVALID_HYPERCALL_INPUT; --- 271 unchanged lines hidden --- |