root/arch/x86/kvm/hyperv.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. vcpu_to_hv_vcpu
  2. hv_vcpu_to_vcpu
  3. vcpu_to_synic
  4. synic_to_vcpu
  5. vcpu_to_stimer
  6. stimer_to_vcpu
  7. kvm_hv_has_stimer_pending

   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 static inline struct kvm_vcpu_hv *vcpu_to_hv_vcpu(struct kvm_vcpu *vcpu)
  27 {
  28         return &vcpu->arch.hyperv;
  29 }
  30 
  31 static inline struct kvm_vcpu *hv_vcpu_to_vcpu(struct kvm_vcpu_hv *hv_vcpu)
  32 {
  33         struct kvm_vcpu_arch *arch;
  34 
  35         arch = container_of(hv_vcpu, struct kvm_vcpu_arch, hyperv);
  36         return container_of(arch, struct kvm_vcpu, arch);
  37 }
  38 
  39 static inline struct kvm_vcpu_hv_synic *vcpu_to_synic(struct kvm_vcpu *vcpu)
  40 {
  41         return &vcpu->arch.hyperv.synic;
  42 }
  43 
  44 static inline struct kvm_vcpu *synic_to_vcpu(struct kvm_vcpu_hv_synic *synic)
  45 {
  46         return hv_vcpu_to_vcpu(container_of(synic, struct kvm_vcpu_hv, synic));
  47 }
  48 
  49 int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host);
  50 int kvm_hv_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, bool host);
  51 
  52 bool kvm_hv_hypercall_enabled(struct kvm *kvm);
  53 int kvm_hv_hypercall(struct kvm_vcpu *vcpu);
  54 
  55 void kvm_hv_irq_routing_update(struct kvm *kvm);
  56 int kvm_hv_synic_set_irq(struct kvm *kvm, u32 vcpu_id, u32 sint);
  57 void kvm_hv_synic_send_eoi(struct kvm_vcpu *vcpu, int vector);
  58 int kvm_hv_activate_synic(struct kvm_vcpu *vcpu, bool dont_zero_synic_pages);
  59 
  60 void kvm_hv_vcpu_init(struct kvm_vcpu *vcpu);
  61 void kvm_hv_vcpu_postcreate(struct kvm_vcpu *vcpu);
  62 void kvm_hv_vcpu_uninit(struct kvm_vcpu *vcpu);
  63 
  64 bool kvm_hv_assist_page_enabled(struct kvm_vcpu *vcpu);
  65 bool kvm_hv_get_assist_page(struct kvm_vcpu *vcpu,
  66                             struct hv_vp_assist_page *assist_page);
  67 
  68 static inline struct kvm_vcpu_hv_stimer *vcpu_to_stimer(struct kvm_vcpu *vcpu,
  69                                                         int timer_index)
  70 {
  71         return &vcpu_to_hv_vcpu(vcpu)->stimer[timer_index];
  72 }
  73 
  74 static inline struct kvm_vcpu *stimer_to_vcpu(struct kvm_vcpu_hv_stimer *stimer)
  75 {
  76         struct kvm_vcpu_hv *hv_vcpu;
  77 
  78         hv_vcpu = container_of(stimer - stimer->index, struct kvm_vcpu_hv,
  79                                stimer[0]);
  80         return hv_vcpu_to_vcpu(hv_vcpu);
  81 }
  82 
  83 static inline bool kvm_hv_has_stimer_pending(struct kvm_vcpu *vcpu)
  84 {
  85         return !bitmap_empty(vcpu->arch.hyperv.stimer_pending_bitmap,
  86                              HV_SYNIC_STIMER_COUNT);
  87 }
  88 
  89 void kvm_hv_process_stimers(struct kvm_vcpu *vcpu);
  90 
  91 void kvm_hv_setup_tsc_page(struct kvm *kvm,
  92                            struct pvclock_vcpu_time_info *hv_clock);
  93 
  94 void kvm_hv_init_vm(struct kvm *kvm);
  95 void kvm_hv_destroy_vm(struct kvm *kvm);
  96 int kvm_vm_ioctl_hv_eventfd(struct kvm *kvm, struct kvm_hyperv_eventfd *args);
  97 int kvm_vcpu_ioctl_get_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid,
  98                                 struct kvm_cpuid_entry2 __user *entries);
  99 
 100 #endif

/* [<][>][^][v][top][bottom][index][help] */