cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hyperv.h (4588B)


      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
     92static inline bool kvm_hv_hypercall_enabled(struct kvm_vcpu *vcpu)
     93{
     94	return vcpu->arch.hyperv_enabled && to_kvm_hv(vcpu->kvm)->hv_guest_os_id;
     95}
     96
     97int kvm_hv_hypercall(struct kvm_vcpu *vcpu);
     98
     99void kvm_hv_irq_routing_update(struct kvm *kvm);
    100int kvm_hv_synic_set_irq(struct kvm *kvm, u32 vcpu_id, u32 sint);
    101void kvm_hv_synic_send_eoi(struct kvm_vcpu *vcpu, int vector);
    102int kvm_hv_activate_synic(struct kvm_vcpu *vcpu, bool dont_zero_synic_pages);
    103
    104void kvm_hv_vcpu_uninit(struct kvm_vcpu *vcpu);
    105
    106bool kvm_hv_assist_page_enabled(struct kvm_vcpu *vcpu);
    107bool kvm_hv_get_assist_page(struct kvm_vcpu *vcpu,
    108			    struct hv_vp_assist_page *assist_page);
    109
    110static inline struct kvm_vcpu_hv_stimer *to_hv_stimer(struct kvm_vcpu *vcpu,
    111						      int timer_index)
    112{
    113	return &to_hv_vcpu(vcpu)->stimer[timer_index];
    114}
    115
    116static inline struct kvm_vcpu *hv_stimer_to_vcpu(struct kvm_vcpu_hv_stimer *stimer)
    117{
    118	struct kvm_vcpu_hv *hv_vcpu;
    119
    120	hv_vcpu = container_of(stimer - stimer->index, struct kvm_vcpu_hv,
    121			       stimer[0]);
    122	return hv_vcpu->vcpu;
    123}
    124
    125static inline bool kvm_hv_has_stimer_pending(struct kvm_vcpu *vcpu)
    126{
    127	struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
    128
    129	if (!hv_vcpu)
    130		return false;
    131
    132	return !bitmap_empty(hv_vcpu->stimer_pending_bitmap,
    133			     HV_SYNIC_STIMER_COUNT);
    134}
    135
    136void kvm_hv_process_stimers(struct kvm_vcpu *vcpu);
    137
    138void kvm_hv_setup_tsc_page(struct kvm *kvm,
    139			   struct pvclock_vcpu_time_info *hv_clock);
    140void kvm_hv_request_tsc_page_update(struct kvm *kvm);
    141
    142void kvm_hv_init_vm(struct kvm *kvm);
    143void kvm_hv_destroy_vm(struct kvm *kvm);
    144void kvm_hv_set_cpuid(struct kvm_vcpu *vcpu);
    145int kvm_hv_set_enforce_cpuid(struct kvm_vcpu *vcpu, bool enforce);
    146int kvm_vm_ioctl_hv_eventfd(struct kvm *kvm, struct kvm_hyperv_eventfd *args);
    147int kvm_get_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid,
    148		     struct kvm_cpuid_entry2 __user *entries);
    149
    150#endif