Thomas Gleixner | 20c8ccb | 2019-06-04 10:11:32 +0200 | [diff] [blame^] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Andrey Smetanin | e83d588 | 2015-07-03 15:01:34 +0300 | [diff] [blame] | 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> |
Andrey Smetanin | e83d588 | 2015-07-03 15:01:34 +0300 | [diff] [blame] | 19 | */ |
| 20 | |
| 21 | #ifndef __ARCH_X86_KVM_HYPERV_H__ |
| 22 | #define __ARCH_X86_KVM_HYPERV_H__ |
| 23 | |
Sean Christopherson | 3592cda | 2018-12-03 13:52:55 -0800 | [diff] [blame] | 24 | #include <linux/kvm_host.h> |
| 25 | |
Andrey Smetanin | 0ae8038 | 2015-11-30 19:22:18 +0300 | [diff] [blame] | 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 | |
Andrey Smetanin | 5c919412 | 2015-11-10 15:36:34 +0300 | [diff] [blame] | 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 | { |
Andrey Smetanin | 0ae8038 | 2015-11-30 19:22:18 +0300 | [diff] [blame] | 46 | return hv_vcpu_to_vcpu(container_of(synic, struct kvm_vcpu_hv, synic)); |
Andrey Smetanin | 5c919412 | 2015-11-10 15:36:34 +0300 | [diff] [blame] | 47 | } |
Andrey Smetanin | e18eaee | 2015-11-30 19:22:17 +0300 | [diff] [blame] | 48 | |
| 49 | int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host); |
Paolo Bonzini | 44883f0 | 2018-07-26 13:01:52 +0200 | [diff] [blame] | 50 | int kvm_hv_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, bool host); |
Andrey Smetanin | e18eaee | 2015-11-30 19:22:17 +0300 | [diff] [blame] | 51 | |
| 52 | bool kvm_hv_hypercall_enabled(struct kvm *kvm); |
| 53 | int kvm_hv_hypercall(struct kvm_vcpu *vcpu); |
| 54 | |
Andrey Smetanin | 5c919412 | 2015-11-10 15:36:34 +0300 | [diff] [blame] | 55 | void kvm_hv_irq_routing_update(struct kvm *kvm); |
Andrey Smetanin | e18eaee | 2015-11-30 19:22:17 +0300 | [diff] [blame] | 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); |
Roman Kagan | efc479e | 2017-06-22 16:51:01 +0300 | [diff] [blame] | 58 | int kvm_hv_activate_synic(struct kvm_vcpu *vcpu, bool dont_zero_synic_pages); |
Andrey Smetanin | 5c919412 | 2015-11-10 15:36:34 +0300 | [diff] [blame] | 59 | |
| 60 | void kvm_hv_vcpu_init(struct kvm_vcpu *vcpu); |
Roman Kagan | d3457c8 | 2017-07-14 17:13:20 +0300 | [diff] [blame] | 61 | void kvm_hv_vcpu_postcreate(struct kvm_vcpu *vcpu); |
Andrey Smetanin | 1f4b34f | 2015-11-30 19:22:21 +0300 | [diff] [blame] | 62 | void kvm_hv_vcpu_uninit(struct kvm_vcpu *vcpu); |
| 63 | |
Ladi Prosek | 72bbf93 | 2018-10-16 18:49:59 +0200 | [diff] [blame] | 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 | |
Andrey Smetanin | 1f4b34f | 2015-11-30 19:22:21 +0300 | [diff] [blame] | 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); |
Andrey Smetanin | 5c919412 | 2015-11-10 15:36:34 +0300 | [diff] [blame] | 90 | |
Paolo Bonzini | 095cf55 | 2016-02-08 12:54:12 +0100 | [diff] [blame] | 91 | void kvm_hv_setup_tsc_page(struct kvm *kvm, |
| 92 | struct pvclock_vcpu_time_info *hv_clock); |
| 93 | |
Roman Kagan | cbc0236 | 2018-02-01 16:48:31 +0300 | [diff] [blame] | 94 | void kvm_hv_init_vm(struct kvm *kvm); |
| 95 | void kvm_hv_destroy_vm(struct kvm *kvm); |
Roman Kagan | faeb783 | 2018-02-01 16:48:32 +0300 | [diff] [blame] | 96 | int kvm_vm_ioctl_hv_eventfd(struct kvm *kvm, struct kvm_hyperv_eventfd *args); |
Vitaly Kuznetsov | 2bc3997 | 2018-12-10 18:21:56 +0100 | [diff] [blame] | 97 | int kvm_vcpu_ioctl_get_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid, |
| 98 | struct kvm_cpuid_entry2 __user *entries); |
Roman Kagan | cbc0236 | 2018-02-01 16:48:31 +0300 | [diff] [blame] | 99 | |
Andrey Smetanin | e83d588 | 2015-07-03 15:01:34 +0300 | [diff] [blame] | 100 | #endif |