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

timing.h (2527B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 *
      4 * Copyright IBM Corp. 2008
      5 *
      6 * Authors: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
      7 */
      8
      9#ifndef __POWERPC_KVM_EXITTIMING_H__
     10#define __POWERPC_KVM_EXITTIMING_H__
     11
     12#include <linux/kvm_host.h>
     13
     14#ifdef CONFIG_KVM_EXIT_TIMING
     15void kvmppc_init_timing_stats(struct kvm_vcpu *vcpu);
     16void kvmppc_update_timing_stats(struct kvm_vcpu *vcpu);
     17int kvmppc_create_vcpu_debugfs_e500(struct kvm_vcpu *vcpu,
     18				    struct dentry *debugfs_dentry);
     19
     20static inline void kvmppc_set_exit_type(struct kvm_vcpu *vcpu, int type)
     21{
     22	vcpu->arch.last_exit_type = type;
     23}
     24
     25#else
     26/* if exit timing is not configured there is no need to build the c file */
     27static inline void kvmppc_init_timing_stats(struct kvm_vcpu *vcpu) {}
     28static inline void kvmppc_update_timing_stats(struct kvm_vcpu *vcpu) {}
     29static inline int kvmppc_create_vcpu_debugfs_e500(struct kvm_vcpu *vcpu,
     30						  struct dentry *debugfs_dentry)
     31{
     32	return 0;
     33}
     34static inline void kvmppc_set_exit_type(struct kvm_vcpu *vcpu, int type) {}
     35#endif /* CONFIG_KVM_EXIT_TIMING */
     36
     37/* account the exit in kvm_stats */
     38static inline void kvmppc_account_exit_stat(struct kvm_vcpu *vcpu, int type)
     39{
     40	/* type has to be known at build time for optimization */
     41
     42	/* The BUILD_BUG_ON below breaks in funny ways, commented out
     43	 * for now ... -BenH
     44	BUILD_BUG_ON(!__builtin_constant_p(type));
     45	*/
     46	switch (type) {
     47	case EXT_INTR_EXITS:
     48		vcpu->stat.ext_intr_exits++;
     49		break;
     50	case DEC_EXITS:
     51		vcpu->stat.dec_exits++;
     52		break;
     53	case EMULATED_INST_EXITS:
     54		vcpu->stat.emulated_inst_exits++;
     55		break;
     56	case DSI_EXITS:
     57		vcpu->stat.dsi_exits++;
     58		break;
     59	case ISI_EXITS:
     60		vcpu->stat.isi_exits++;
     61		break;
     62	case SYSCALL_EXITS:
     63		vcpu->stat.syscall_exits++;
     64		break;
     65	case DTLB_REAL_MISS_EXITS:
     66		vcpu->stat.dtlb_real_miss_exits++;
     67		break;
     68	case DTLB_VIRT_MISS_EXITS:
     69		vcpu->stat.dtlb_virt_miss_exits++;
     70		break;
     71	case MMIO_EXITS:
     72		vcpu->stat.mmio_exits++;
     73		break;
     74	case ITLB_REAL_MISS_EXITS:
     75		vcpu->stat.itlb_real_miss_exits++;
     76		break;
     77	case ITLB_VIRT_MISS_EXITS:
     78		vcpu->stat.itlb_virt_miss_exits++;
     79		break;
     80	case SIGNAL_EXITS:
     81		vcpu->stat.signal_exits++;
     82		break;
     83	case DBELL_EXITS:
     84		vcpu->stat.dbell_exits++;
     85		break;
     86	case GDBELL_EXITS:
     87		vcpu->stat.gdbell_exits++;
     88		break;
     89	}
     90}
     91
     92/* wrapper to set exit time and account for it in kvm_stats */
     93static inline void kvmppc_account_exit(struct kvm_vcpu *vcpu, int type)
     94{
     95	kvmppc_set_exit_type(vcpu, type);
     96	kvmppc_account_exit_stat(vcpu, type);
     97}
     98
     99#endif /* __POWERPC_KVM_EXITTIMING_H__ */