xref: /linux/arch/arm64/kvm/hyp/include/nvhe/trace.h (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
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