1680a04c3SVincent Donnefort /* SPDX-License-Identifier: GPL-2.0-only */ 2680a04c3SVincent Donnefort #ifndef __ARM64_KVM_HYP_NVHE_TRACE_H 3680a04c3SVincent Donnefort #define __ARM64_KVM_HYP_NVHE_TRACE_H 40a90fbc8SVincent Donnefort 50a90fbc8SVincent Donnefort #include <linux/trace_remote_event.h> 60a90fbc8SVincent Donnefort 7680a04c3SVincent Donnefort #include <asm/kvm_hyptrace.h> 8680a04c3SVincent Donnefort 9*696dfec2SVincent Donnefort static inline pid_t __tracing_get_vcpu_pid(struct kvm_cpu_context *host_ctxt) 10*696dfec2SVincent Donnefort { 11*696dfec2SVincent Donnefort struct kvm_vcpu *vcpu; 12*696dfec2SVincent Donnefort 13*696dfec2SVincent Donnefort if (!host_ctxt) 14*696dfec2SVincent Donnefort host_ctxt = host_data_ptr(host_ctxt); 15*696dfec2SVincent Donnefort 16*696dfec2SVincent Donnefort vcpu = host_ctxt->__hyp_running_vcpu; 17*696dfec2SVincent Donnefort 18*696dfec2SVincent Donnefort return vcpu ? vcpu->arch.pid : 0; 19*696dfec2SVincent Donnefort } 20*696dfec2SVincent Donnefort 210a90fbc8SVincent Donnefort #define HE_PROTO(__args...) __args 220a90fbc8SVincent Donnefort #define HE_ASSIGN(__args...) __args 230a90fbc8SVincent Donnefort #define HE_STRUCT RE_STRUCT 240a90fbc8SVincent Donnefort #define he_field re_field 250a90fbc8SVincent Donnefort 26680a04c3SVincent Donnefort #ifdef CONFIG_NVHE_EL2_TRACING 270a90fbc8SVincent Donnefort 280a90fbc8SVincent Donnefort #define HYP_EVENT(__name, __proto, __struct, __assign, __printk) \ 290a90fbc8SVincent Donnefort REMOTE_EVENT_FORMAT(__name, __struct); \ 300a90fbc8SVincent Donnefort extern struct hyp_event_id hyp_event_id_##__name; \ 310a90fbc8SVincent Donnefort static __always_inline void trace_##__name(__proto) \ 320a90fbc8SVincent Donnefort { \ 330a90fbc8SVincent Donnefort struct remote_event_format_##__name *__entry; \ 340a90fbc8SVincent Donnefort size_t length = sizeof(*__entry); \ 350a90fbc8SVincent Donnefort \ 360a90fbc8SVincent Donnefort if (!atomic_read(&hyp_event_id_##__name.enabled)) \ 370a90fbc8SVincent Donnefort return; \ 380a90fbc8SVincent Donnefort __entry = tracing_reserve_entry(length); \ 390a90fbc8SVincent Donnefort if (!__entry) \ 400a90fbc8SVincent Donnefort return; \ 410a90fbc8SVincent Donnefort __entry->hdr.id = hyp_event_id_##__name.id; \ 420a90fbc8SVincent Donnefort __assign \ 430a90fbc8SVincent Donnefort tracing_commit_entry(); \ 440a90fbc8SVincent Donnefort } 450a90fbc8SVincent Donnefort 46680a04c3SVincent Donnefort void *tracing_reserve_entry(unsigned long length); 47680a04c3SVincent Donnefort void tracing_commit_entry(void); 48680a04c3SVincent Donnefort 49680a04c3SVincent Donnefort int __tracing_load(unsigned long desc_va, size_t desc_size); 50680a04c3SVincent Donnefort void __tracing_unload(void); 51680a04c3SVincent Donnefort int __tracing_enable(bool enable); 52680a04c3SVincent Donnefort int __tracing_swap_reader(unsigned int cpu); 53b2288891SVincent Donnefort void __tracing_update_clock(u32 mult, u32 shift, u64 epoch_ns, u64 epoch_cyc); 542194d317SVincent Donnefort int __tracing_reset(unsigned int cpu); 550a90fbc8SVincent Donnefort int __tracing_enable_event(unsigned short id, bool enable); 56680a04c3SVincent Donnefort #else 57680a04c3SVincent Donnefort static inline void *tracing_reserve_entry(unsigned long length) { return NULL; } 58680a04c3SVincent Donnefort static inline void tracing_commit_entry(void) { } 590a90fbc8SVincent Donnefort #define HYP_EVENT(__name, __proto, __struct, __assign, __printk) \ 600a90fbc8SVincent Donnefort static inline void trace_##__name(__proto) {} 61680a04c3SVincent Donnefort 62680a04c3SVincent Donnefort static inline int __tracing_load(unsigned long desc_va, size_t desc_size) { return -ENODEV; } 63680a04c3SVincent Donnefort static inline void __tracing_unload(void) { } 64680a04c3SVincent Donnefort static inline int __tracing_enable(bool enable) { return -ENODEV; } 65680a04c3SVincent Donnefort static inline int __tracing_swap_reader(unsigned int cpu) { return -ENODEV; } 66b2288891SVincent Donnefort static inline void __tracing_update_clock(u32 mult, u32 shift, u64 epoch_ns, u64 epoch_cyc) { } 672194d317SVincent Donnefort static inline int __tracing_reset(unsigned int cpu) { return -ENODEV; } 680a90fbc8SVincent Donnefort static inline int __tracing_enable_event(unsigned short id, bool enable) { return -ENODEV; } 69680a04c3SVincent Donnefort #endif 70680a04c3SVincent Donnefort #endif 71