arm_pmu.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2015 Linaro Ltd.
  4. * Author: Shannon Zhao <shannon.zhao@linaro.org>
  5. */
  6. #ifndef __ASM_ARM_KVM_PMU_H
  7. #define __ASM_ARM_KVM_PMU_H
  8. #include <linux/perf_event.h>
  9. #include <linux/perf/arm_pmuv3.h>
  10. #define KVM_ARMV8_PMU_MAX_COUNTERS 32
  11. #if IS_ENABLED(CONFIG_HW_PERF_EVENTS) && IS_ENABLED(CONFIG_KVM)
  12. struct kvm_pmc {
  13. u8 idx; /* index into the pmu->pmc array */
  14. struct perf_event *perf_event;
  15. };
  16. struct kvm_pmu_events {
  17. u64 events_host;
  18. u64 events_guest;
  19. };
  20. struct kvm_pmu {
  21. struct irq_work overflow_work;
  22. struct kvm_pmu_events events;
  23. struct kvm_pmc pmc[KVM_ARMV8_PMU_MAX_COUNTERS];
  24. int irq_num;
  25. bool created;
  26. bool irq_level;
  27. };
  28. struct arm_pmu_entry {
  29. struct list_head entry;
  30. struct arm_pmu *arm_pmu;
  31. };
  32. DECLARE_STATIC_KEY_FALSE(kvm_arm_pmu_available);
  33. static __always_inline bool kvm_arm_support_pmu_v3(void)
  34. {
  35. return static_branch_likely(&kvm_arm_pmu_available);
  36. }
  37. #define kvm_arm_pmu_irq_initialized(v) ((v)->arch.pmu.irq_num >= VGIC_NR_SGIS)
  38. u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx);
  39. void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val);
  40. u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu);
  41. u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1);
  42. void kvm_pmu_vcpu_init(struct kvm_vcpu *vcpu);
  43. void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu);
  44. void kvm_pmu_vcpu_destroy(struct kvm_vcpu *vcpu);
  45. void kvm_pmu_disable_counter_mask(struct kvm_vcpu *vcpu, u64 val);
  46. void kvm_pmu_enable_counter_mask(struct kvm_vcpu *vcpu, u64 val);
  47. void kvm_pmu_flush_hwstate(struct kvm_vcpu *vcpu);
  48. void kvm_pmu_sync_hwstate(struct kvm_vcpu *vcpu);
  49. bool kvm_pmu_should_notify_user(struct kvm_vcpu *vcpu);
  50. void kvm_pmu_update_run(struct kvm_vcpu *vcpu);
  51. void kvm_pmu_software_increment(struct kvm_vcpu *vcpu, u64 val);
  52. void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val);
  53. void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data,
  54. u64 select_idx);
  55. void kvm_vcpu_reload_pmu(struct kvm_vcpu *vcpu);
  56. int kvm_arm_pmu_v3_set_attr(struct kvm_vcpu *vcpu,
  57. struct kvm_device_attr *attr);
  58. int kvm_arm_pmu_v3_get_attr(struct kvm_vcpu *vcpu,
  59. struct kvm_device_attr *attr);
  60. int kvm_arm_pmu_v3_has_attr(struct kvm_vcpu *vcpu,
  61. struct kvm_device_attr *attr);
  62. int kvm_arm_pmu_v3_enable(struct kvm_vcpu *vcpu);
  63. struct kvm_pmu_events *kvm_get_pmu_events(void);
  64. void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu);
  65. void kvm_vcpu_pmu_restore_host(struct kvm_vcpu *vcpu);
  66. void kvm_vcpu_pmu_resync_el0(void);
  67. #define kvm_vcpu_has_pmu(vcpu) \
  68. (vcpu_has_feature(vcpu, KVM_ARM_VCPU_PMU_V3))
  69. /*
  70. * Updates the vcpu's view of the pmu events for this cpu.
  71. * Must be called before every vcpu run after disabling interrupts, to ensure
  72. * that an interrupt cannot fire and update the structure.
  73. */
  74. #define kvm_pmu_update_vcpu_events(vcpu) \
  75. do { \
  76. if (!has_vhe() && kvm_arm_support_pmu_v3()) \
  77. vcpu->arch.pmu.events = *kvm_get_pmu_events(); \
  78. } while (0)
  79. u8 kvm_arm_pmu_get_pmuver_limit(void);
  80. u64 kvm_pmu_evtyper_mask(struct kvm *kvm);
  81. int kvm_arm_set_default_pmu(struct kvm *kvm);
  82. u8 kvm_arm_pmu_get_max_counters(struct kvm *kvm);
  83. u64 kvm_vcpu_read_pmcr(struct kvm_vcpu *vcpu);
  84. #else
  85. struct kvm_pmu {
  86. };
  87. static inline bool kvm_arm_support_pmu_v3(void)
  88. {
  89. return false;
  90. }
  91. #define kvm_arm_pmu_irq_initialized(v) (false)
  92. static inline u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
  93. u64 select_idx)
  94. {
  95. return 0;
  96. }
  97. static inline void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu,
  98. u64 select_idx, u64 val) {}
  99. static inline u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu)
  100. {
  101. return 0;
  102. }
  103. static inline void kvm_pmu_vcpu_init(struct kvm_vcpu *vcpu) {}
  104. static inline void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu) {}
  105. static inline void kvm_pmu_vcpu_destroy(struct kvm_vcpu *vcpu) {}
  106. static inline void kvm_pmu_disable_counter_mask(struct kvm_vcpu *vcpu, u64 val) {}
  107. static inline void kvm_pmu_enable_counter_mask(struct kvm_vcpu *vcpu, u64 val) {}
  108. static inline void kvm_pmu_flush_hwstate(struct kvm_vcpu *vcpu) {}
  109. static inline void kvm_pmu_sync_hwstate(struct kvm_vcpu *vcpu) {}
  110. static inline bool kvm_pmu_should_notify_user(struct kvm_vcpu *vcpu)
  111. {
  112. return false;
  113. }
  114. static inline void kvm_pmu_update_run(struct kvm_vcpu *vcpu) {}
  115. static inline void kvm_pmu_software_increment(struct kvm_vcpu *vcpu, u64 val) {}
  116. static inline void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val) {}
  117. static inline void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu,
  118. u64 data, u64 select_idx) {}
  119. static inline int kvm_arm_pmu_v3_set_attr(struct kvm_vcpu *vcpu,
  120. struct kvm_device_attr *attr)
  121. {
  122. return -ENXIO;
  123. }
  124. static inline int kvm_arm_pmu_v3_get_attr(struct kvm_vcpu *vcpu,
  125. struct kvm_device_attr *attr)
  126. {
  127. return -ENXIO;
  128. }
  129. static inline int kvm_arm_pmu_v3_has_attr(struct kvm_vcpu *vcpu,
  130. struct kvm_device_attr *attr)
  131. {
  132. return -ENXIO;
  133. }
  134. static inline int kvm_arm_pmu_v3_enable(struct kvm_vcpu *vcpu)
  135. {
  136. return 0;
  137. }
  138. static inline u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1)
  139. {
  140. return 0;
  141. }
  142. #define kvm_vcpu_has_pmu(vcpu) ({ false; })
  143. static inline void kvm_pmu_update_vcpu_events(struct kvm_vcpu *vcpu) {}
  144. static inline void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu) {}
  145. static inline void kvm_vcpu_pmu_restore_host(struct kvm_vcpu *vcpu) {}
  146. static inline void kvm_vcpu_reload_pmu(struct kvm_vcpu *vcpu) {}
  147. static inline u8 kvm_arm_pmu_get_pmuver_limit(void)
  148. {
  149. return 0;
  150. }
  151. static inline u64 kvm_pmu_evtyper_mask(struct kvm *kvm)
  152. {
  153. return 0;
  154. }
  155. static inline void kvm_vcpu_pmu_resync_el0(void) {}
  156. static inline int kvm_arm_set_default_pmu(struct kvm *kvm)
  157. {
  158. return -ENODEV;
  159. }
  160. static inline u8 kvm_arm_pmu_get_max_counters(struct kvm *kvm)
  161. {
  162. return 0;
  163. }
  164. static inline u64 kvm_vcpu_read_pmcr(struct kvm_vcpu *vcpu)
  165. {
  166. return 0;
  167. }
  168. #endif
  169. #endif