linux/arch/x86/kvm/hyperv.h
<<
>>
Prefs
   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.
   9 * Copyright IBM Corporation, 2008
  10 * Copyright 2010 Red Hat, Inc. and/or its affiliates.
  11 * Copyright (C) 2015 Andrey Smetanin <asmetanin@virtuozzo.com>
  12 *
  13 * Authors:
  14 *   Avi Kivity   <avi@qumranet.com>
  15 *   Yaniv Kamay  <yaniv@qumranet.com>
  16 *   Amit Shah    <amit.shah@qumranet.com>
  17 *   Ben-Ami Yassour <benami@il.ibm.com>
  18 *   Andrey Smetanin <asmetanin@virtuozzo.com>
  19 */
  20
  21#ifndef __ARCH_X86_KVM_HYPERV_H__
  22#define __ARCH_X86_KVM_HYPERV_H__
  23
  24#include <linux/kvm_host.h>
  25
  26/*
  27 * The #defines related to the synthetic debugger are required by KDNet, but
  28 * they are not documented in the Hyper-V TLFS because the synthetic debugger
  29 * functionality has been deprecated and is subject to removal in future
  30 * versions of Windows.
  31 */
  32#define HYPERV_CPUID_SYNDBG_VENDOR_AND_MAX_FUNCTIONS    0x40000080
  33#define HYPERV_CPUID_SYNDBG_INTERFACE                   0x40000081
  34#define HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES       0x40000082
  35
  36/*
  37 * Hyper-V synthetic debugger platform capabilities
  38 * These are HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES.EAX bits.
  39 */
  40#define HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING        BIT(1)
  41
  42/* Hyper-V Synthetic debug options MSR */
  43#define HV_X64_MSR_SYNDBG_CONTROL               0x400000F1
  44#define HV_X64_MSR_SYNDBG_STATUS                0x400000F2
  45#define HV_X64_MSR_SYNDBG_SEND_BUFFER           0x400000F3
  46#define HV_X64_MSR_SYNDBG_RECV_BUFFER           0x400000F4
  47#define HV_X64_MSR_SYNDBG_PENDING_BUFFER        0x400000F5
  48#define HV_X64_MSR_SYNDBG_OPTIONS               0x400000FF
  49
  50/* Hyper-V HV_X64_MSR_SYNDBG_OPTIONS bits */
  51#define HV_X64_SYNDBG_OPTION_USE_HCALLS         BIT(2)
  52
  53static inline struct kvm_hv *to_kvm_hv(struct kvm *kvm)
  54{
  55        return &kvm->arch.hyperv;
  56}
  57
  58static inline struct kvm_vcpu_hv *to_hv_vcpu(struct kvm_vcpu *vcpu)
  59{
  60        return vcpu->arch.hyperv;
  61}
  62
  63static inline struct kvm_vcpu_hv_synic *to_hv_synic(struct kvm_vcpu *vcpu)
  64{
  65        struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
  66
  67        return &hv_vcpu->synic;
  68}
  69
  70static inline struct kvm_vcpu *hv_synic_to_vcpu(struct kvm_vcpu_hv_synic *synic)
  71{
  72        struct kvm_vcpu_hv *hv_vcpu = container_of(synic, struct kvm_vcpu_hv, synic);
  73
  74        return hv_vcpu->vcpu;
  75}
  76
  77static inline struct kvm_hv_syndbg *to_hv_syndbg(struct kvm_vcpu *vcpu)
  78{
  79        return &vcpu->kvm->arch.hyperv.hv_syndbg;
  80}
  81
  82static inline u32 kvm_hv_get_vpindex(struct kvm_vcpu *vcpu)
  83{
  84        struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
  85
  86        return hv_vcpu ? hv_vcpu->vp_index : vcpu->vcpu_idx;
  87}
  88
  89int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host);
  90int kvm_hv_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, bool host);
  91
  92bool kvm_hv_hypercall_enabled(struct kvm_vcpu *vcpu);
  93int kvm_hv_hypercall(struct kvm_vcpu *vcpu);
  94
  95void kvm_hv_irq_routing_update(struct kvm *kvm);
  96int kvm_hv_synic_set_irq(struct kvm *kvm, u32 vcpu_id, u32 sint);
  97void kvm_hv_synic_send_eoi(struct kvm_vcpu *vcpu, int vector);
  98int kvm_hv_activate_synic(struct kvm_vcpu *vcpu, bool dont_zero_synic_pages);
  99
 100void kvm_hv_vcpu_uninit(struct kvm_vcpu *vcpu);
 101
 102bool kvm_hv_assist_page_enabled(struct kvm_vcpu *vcpu);
 103bool kvm_hv_get_assist_page(struct kvm_vcpu *vcpu,
 104                            struct hv_vp_assist_page *assist_page);
 105
 106static inline struct kvm_vcpu_hv_stimer *to_hv_stimer(struct kvm_vcpu *vcpu,
 107                                                      int timer_index)
 108{
 109        return &to_hv_vcpu(vcpu)->stimer[timer_index];
 110}
 111
 112static inline struct kvm_vcpu *hv_stimer_to_vcpu(struct kvm_vcpu_hv_stimer *stimer)
 113{
 114        struct kvm_vcpu_hv *hv_vcpu;
 115
 116        hv_vcpu = container_of(stimer - stimer->index, struct kvm_vcpu_hv,
 117                               stimer[0]);
 118        return hv_vcpu->vcpu;
 119}
 120
 121static inline bool kvm_hv_has_stimer_pending(struct kvm_vcpu *vcpu)
 122{
 123        struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
 124
 125        if (!hv_vcpu)
 126                return false;
 127
 128        return !bitmap_empty(hv_vcpu->stimer_pending_bitmap,
 129                             HV_SYNIC_STIMER_COUNT);
 130}
 131
 132void kvm_hv_process_stimers(struct kvm_vcpu *vcpu);
 133
 134void kvm_hv_setup_tsc_page(struct kvm *kvm,
 135                           struct pvclock_vcpu_time_info *hv_clock);
 136void kvm_hv_invalidate_tsc_page(struct kvm *kvm);
 137
 138void kvm_hv_init_vm(struct kvm *kvm);
 139void kvm_hv_destroy_vm(struct kvm *kvm);
 140void kvm_hv_set_cpuid(struct kvm_vcpu *vcpu);
 141int kvm_hv_set_enforce_cpuid(struct kvm_vcpu *vcpu, bool enforce);
 142int kvm_vm_ioctl_hv_eventfd(struct kvm *kvm, struct kvm_hyperv_eventfd *args);
 143int kvm_get_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid,
 144                     struct kvm_cpuid_entry2 __user *entries);
 145
 146#endif
 147