xref: /openbmc/linux/arch/x86/kvm/trace.h (revision 86aa961bb4619a68077ebeba21c52e9ba0eab43d)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2229456fcSMarcelo Tosatti #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
3229456fcSMarcelo Tosatti #define _TRACE_KVM_H
4229456fcSMarcelo Tosatti 
5229456fcSMarcelo Tosatti #include <linux/tracepoint.h>
60d460ffcSStefan Hajnoczi #include <asm/vmx.h>
70d460ffcSStefan Hajnoczi #include <asm/svm.h>
8d828199eSMarcelo Tosatti #include <asm/clocksource.h>
9ce1a5e60SDavid Matlack #include <asm/pvclock-abi.h>
10229456fcSMarcelo Tosatti 
11229456fcSMarcelo Tosatti #undef TRACE_SYSTEM
12229456fcSMarcelo Tosatti #define TRACE_SYSTEM kvm
13229456fcSMarcelo Tosatti 
14229456fcSMarcelo Tosatti /*
15229456fcSMarcelo Tosatti  * Tracepoint for guest mode entry.
16229456fcSMarcelo Tosatti  */
17229456fcSMarcelo Tosatti TRACE_EVENT(kvm_entry,
18b2d52255SSean Christopherson 	TP_PROTO(struct kvm_vcpu *vcpu),
19b2d52255SSean Christopherson 	TP_ARGS(vcpu),
20229456fcSMarcelo Tosatti 
21229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
22229456fcSMarcelo Tosatti 		__field(	unsigned int,	vcpu_id		)
23b2d52255SSean Christopherson 		__field(	unsigned long,	rip		)
24229456fcSMarcelo Tosatti 	),
25229456fcSMarcelo Tosatti 
26229456fcSMarcelo Tosatti 	TP_fast_assign(
27b2d52255SSean Christopherson 		__entry->vcpu_id        = vcpu->vcpu_id;
28b2d52255SSean Christopherson 		__entry->rip		= kvm_rip_read(vcpu);
29229456fcSMarcelo Tosatti 	),
30229456fcSMarcelo Tosatti 
31b2d52255SSean Christopherson 	TP_printk("vcpu %u, rip 0x%lx", __entry->vcpu_id, __entry->rip)
32229456fcSMarcelo Tosatti );
33229456fcSMarcelo Tosatti 
34229456fcSMarcelo Tosatti /*
35229456fcSMarcelo Tosatti  * Tracepoint for hypercall.
36229456fcSMarcelo Tosatti  */
37229456fcSMarcelo Tosatti TRACE_EVENT(kvm_hypercall,
38229456fcSMarcelo Tosatti 	TP_PROTO(unsigned long nr, unsigned long a0, unsigned long a1,
39229456fcSMarcelo Tosatti 		 unsigned long a2, unsigned long a3),
40229456fcSMarcelo Tosatti 	TP_ARGS(nr, a0, a1, a2, a3),
41229456fcSMarcelo Tosatti 
42229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
43229456fcSMarcelo Tosatti 		__field(	unsigned long, 	nr		)
44229456fcSMarcelo Tosatti 		__field(	unsigned long,	a0		)
45229456fcSMarcelo Tosatti 		__field(	unsigned long,	a1		)
46229456fcSMarcelo Tosatti 		__field(	unsigned long,	a2		)
47229456fcSMarcelo Tosatti 		__field(	unsigned long,	a3		)
48229456fcSMarcelo Tosatti 	),
49229456fcSMarcelo Tosatti 
50229456fcSMarcelo Tosatti 	TP_fast_assign(
51229456fcSMarcelo Tosatti 		__entry->nr		= nr;
52229456fcSMarcelo Tosatti 		__entry->a0		= a0;
53229456fcSMarcelo Tosatti 		__entry->a1		= a1;
54229456fcSMarcelo Tosatti 		__entry->a2		= a2;
55229456fcSMarcelo Tosatti 		__entry->a3		= a3;
56229456fcSMarcelo Tosatti 	),
57229456fcSMarcelo Tosatti 
58229456fcSMarcelo Tosatti 	TP_printk("nr 0x%lx a0 0x%lx a1 0x%lx a2 0x%lx a3 0x%lx",
59229456fcSMarcelo Tosatti 		 __entry->nr, __entry->a0, __entry->a1,  __entry->a2,
60229456fcSMarcelo Tosatti 		 __entry->a3)
61229456fcSMarcelo Tosatti );
62229456fcSMarcelo Tosatti 
63229456fcSMarcelo Tosatti /*
6455cd8e5aSGleb Natapov  * Tracepoint for hypercall.
6555cd8e5aSGleb Natapov  */
6655cd8e5aSGleb Natapov TRACE_EVENT(kvm_hv_hypercall,
67bd1ba573SSean Christopherson 	TP_PROTO(__u16 code, bool fast,  __u16 var_cnt, __u16 rep_cnt,
68bd1ba573SSean Christopherson 		 __u16 rep_idx, __u64 ingpa, __u64 outgpa),
69bd1ba573SSean Christopherson 	TP_ARGS(code, fast, var_cnt, rep_cnt, rep_idx, ingpa, outgpa),
7055cd8e5aSGleb Natapov 
7155cd8e5aSGleb Natapov 	TP_STRUCT__entry(
7255cd8e5aSGleb Natapov 		__field(	__u16,		rep_cnt		)
7355cd8e5aSGleb Natapov 		__field(	__u16,		rep_idx		)
7455cd8e5aSGleb Natapov 		__field(	__u64,		ingpa		)
7555cd8e5aSGleb Natapov 		__field(	__u64,		outgpa		)
76d5bf2ff0SDavid Sharp 		__field(	__u16, 		code		)
77bd1ba573SSean Christopherson 		__field(	__u16,		var_cnt		)
78d5bf2ff0SDavid Sharp 		__field(	bool,		fast		)
7955cd8e5aSGleb Natapov 	),
8055cd8e5aSGleb Natapov 
8155cd8e5aSGleb Natapov 	TP_fast_assign(
8255cd8e5aSGleb Natapov 		__entry->rep_cnt	= rep_cnt;
8355cd8e5aSGleb Natapov 		__entry->rep_idx	= rep_idx;
8455cd8e5aSGleb Natapov 		__entry->ingpa		= ingpa;
8555cd8e5aSGleb Natapov 		__entry->outgpa		= outgpa;
86d5bf2ff0SDavid Sharp 		__entry->code		= code;
87bd1ba573SSean Christopherson 		__entry->var_cnt	= var_cnt;
88d5bf2ff0SDavid Sharp 		__entry->fast		= fast;
8955cd8e5aSGleb Natapov 	),
9055cd8e5aSGleb Natapov 
91bd1ba573SSean Christopherson 	TP_printk("code 0x%x %s var_cnt 0x%x rep_cnt 0x%x idx 0x%x in 0x%llx out 0x%llx",
9255cd8e5aSGleb Natapov 		  __entry->code, __entry->fast ? "fast" : "slow",
93bd1ba573SSean Christopherson 		  __entry->var_cnt, __entry->rep_cnt, __entry->rep_idx,
94bd1ba573SSean Christopherson 		  __entry->ingpa, __entry->outgpa)
9555cd8e5aSGleb Natapov );
9655cd8e5aSGleb Natapov 
97f5714bbbSVitaly Kuznetsov TRACE_EVENT(kvm_hv_hypercall_done,
98f5714bbbSVitaly Kuznetsov 	TP_PROTO(u64 result),
99f5714bbbSVitaly Kuznetsov 	TP_ARGS(result),
100f5714bbbSVitaly Kuznetsov 
101f5714bbbSVitaly Kuznetsov 	TP_STRUCT__entry(
102f5714bbbSVitaly Kuznetsov 		__field(__u64, result)
103f5714bbbSVitaly Kuznetsov 	),
104f5714bbbSVitaly Kuznetsov 
105f5714bbbSVitaly Kuznetsov 	TP_fast_assign(
106f5714bbbSVitaly Kuznetsov 		__entry->result	= result;
107f5714bbbSVitaly Kuznetsov 	),
108f5714bbbSVitaly Kuznetsov 
109f5714bbbSVitaly Kuznetsov 	TP_printk("result 0x%llx", __entry->result)
110f5714bbbSVitaly Kuznetsov );
111f5714bbbSVitaly Kuznetsov 
11255cd8e5aSGleb Natapov /*
11323200b7aSJoao Martins  * Tracepoint for Xen hypercall.
11423200b7aSJoao Martins  */
11523200b7aSJoao Martins TRACE_EVENT(kvm_xen_hypercall,
116c3f37199SDavid Woodhouse 	    TP_PROTO(u8 cpl, unsigned long nr,
117c3f37199SDavid Woodhouse 		     unsigned long a0, unsigned long a1, unsigned long a2,
118c3f37199SDavid Woodhouse 		     unsigned long a3, unsigned long a4, unsigned long a5),
119c3f37199SDavid Woodhouse 	    TP_ARGS(cpl, nr, a0, a1, a2, a3, a4, a5),
12023200b7aSJoao Martins 
12123200b7aSJoao Martins 	TP_STRUCT__entry(
122c3f37199SDavid Woodhouse 		__field(u8, cpl)
12323200b7aSJoao Martins 		__field(unsigned long, nr)
12423200b7aSJoao Martins 		__field(unsigned long, a0)
12523200b7aSJoao Martins 		__field(unsigned long, a1)
12623200b7aSJoao Martins 		__field(unsigned long, a2)
12723200b7aSJoao Martins 		__field(unsigned long, a3)
12823200b7aSJoao Martins 		__field(unsigned long, a4)
12923200b7aSJoao Martins 		__field(unsigned long, a5)
13023200b7aSJoao Martins 	),
13123200b7aSJoao Martins 
13223200b7aSJoao Martins 	TP_fast_assign(
133c3f37199SDavid Woodhouse 		__entry->cpl = cpl;
13423200b7aSJoao Martins 		__entry->nr = nr;
13523200b7aSJoao Martins 		__entry->a0 = a0;
13623200b7aSJoao Martins 		__entry->a1 = a1;
13723200b7aSJoao Martins 		__entry->a2 = a2;
13823200b7aSJoao Martins 		__entry->a3 = a3;
13923200b7aSJoao Martins 		__entry->a4 = a4;
14023200b7aSJoao Martins 		__entry->a4 = a5;
14123200b7aSJoao Martins 	),
14223200b7aSJoao Martins 
143c3f37199SDavid Woodhouse 	TP_printk("cpl %d nr 0x%lx a0 0x%lx a1 0x%lx a2 0x%lx a3 0x%lx a4 0x%lx a5 %lx",
144c3f37199SDavid Woodhouse 		  __entry->cpl, __entry->nr,
145c3f37199SDavid Woodhouse 		  __entry->a0, __entry->a1, __entry->a2,
14623200b7aSJoao Martins 		  __entry->a3, __entry->a4, __entry->a5)
14723200b7aSJoao Martins );
14823200b7aSJoao Martins 
14923200b7aSJoao Martins 
15023200b7aSJoao Martins 
15123200b7aSJoao Martins /*
152229456fcSMarcelo Tosatti  * Tracepoint for PIO.
153229456fcSMarcelo Tosatti  */
1541171903dSUlrich Obergfell 
1551171903dSUlrich Obergfell #define KVM_PIO_IN   0
1561171903dSUlrich Obergfell #define KVM_PIO_OUT  1
1571171903dSUlrich Obergfell 
158229456fcSMarcelo Tosatti TRACE_EVENT(kvm_pio,
159229456fcSMarcelo Tosatti 	TP_PROTO(unsigned int rw, unsigned int port, unsigned int size,
16030d583fdSPaolo Bonzini 		 unsigned int count, const void *data),
1611171903dSUlrich Obergfell 	TP_ARGS(rw, port, size, count, data),
162229456fcSMarcelo Tosatti 
163229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
164229456fcSMarcelo Tosatti 		__field(	unsigned int, 	rw		)
165229456fcSMarcelo Tosatti 		__field(	unsigned int, 	port		)
166229456fcSMarcelo Tosatti 		__field(	unsigned int, 	size		)
167229456fcSMarcelo Tosatti 		__field(	unsigned int,	count		)
1681171903dSUlrich Obergfell 		__field(	unsigned int,	val		)
169229456fcSMarcelo Tosatti 	),
170229456fcSMarcelo Tosatti 
171229456fcSMarcelo Tosatti 	TP_fast_assign(
172229456fcSMarcelo Tosatti 		__entry->rw		= rw;
173229456fcSMarcelo Tosatti 		__entry->port		= port;
174229456fcSMarcelo Tosatti 		__entry->size		= size;
175229456fcSMarcelo Tosatti 		__entry->count		= count;
1761171903dSUlrich Obergfell 		if (size == 1)
1771171903dSUlrich Obergfell 			__entry->val	= *(unsigned char *)data;
1781171903dSUlrich Obergfell 		else if (size == 2)
1791171903dSUlrich Obergfell 			__entry->val	= *(unsigned short *)data;
1801171903dSUlrich Obergfell 		else
1811171903dSUlrich Obergfell 			__entry->val	= *(unsigned int *)data;
182229456fcSMarcelo Tosatti 	),
183229456fcSMarcelo Tosatti 
1841171903dSUlrich Obergfell 	TP_printk("pio_%s at 0x%x size %d count %d val 0x%x %s",
185229456fcSMarcelo Tosatti 		  __entry->rw ? "write" : "read",
1861171903dSUlrich Obergfell 		  __entry->port, __entry->size, __entry->count, __entry->val,
1871171903dSUlrich Obergfell 		  __entry->count > 1 ? "(...)" : "")
188229456fcSMarcelo Tosatti );
189229456fcSMarcelo Tosatti 
190229456fcSMarcelo Tosatti /*
191931c33b1SJason Wang  * Tracepoint for fast mmio.
192931c33b1SJason Wang  */
193931c33b1SJason Wang TRACE_EVENT(kvm_fast_mmio,
194931c33b1SJason Wang 	TP_PROTO(u64 gpa),
195931c33b1SJason Wang 	TP_ARGS(gpa),
196931c33b1SJason Wang 
197931c33b1SJason Wang 	TP_STRUCT__entry(
198931c33b1SJason Wang 		__field(u64,	gpa)
199931c33b1SJason Wang 	),
200931c33b1SJason Wang 
201931c33b1SJason Wang 	TP_fast_assign(
202931c33b1SJason Wang 		__entry->gpa		= gpa;
203931c33b1SJason Wang 	),
204931c33b1SJason Wang 
205931c33b1SJason Wang 	TP_printk("fast mmio at gpa 0x%llx", __entry->gpa)
206931c33b1SJason Wang );
207931c33b1SJason Wang 
208931c33b1SJason Wang /*
209229456fcSMarcelo Tosatti  * Tracepoint for cpuid.
210229456fcSMarcelo Tosatti  */
211229456fcSMarcelo Tosatti TRACE_EVENT(kvm_cpuid,
212e7adda28SSean Christopherson 	TP_PROTO(unsigned int function, unsigned int index, unsigned long rax,
213e7adda28SSean Christopherson 		 unsigned long rbx, unsigned long rcx, unsigned long rdx,
2142b110b61SSean Christopherson 		 bool found, bool used_max_basic),
2152b110b61SSean Christopherson 	TP_ARGS(function, index, rax, rbx, rcx, rdx, found, used_max_basic),
216229456fcSMarcelo Tosatti 
217229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
218229456fcSMarcelo Tosatti 		__field(	unsigned int,	function	)
219e7adda28SSean Christopherson 		__field(	unsigned int,	index		)
220229456fcSMarcelo Tosatti 		__field(	unsigned long,	rax		)
221229456fcSMarcelo Tosatti 		__field(	unsigned long,	rbx		)
222229456fcSMarcelo Tosatti 		__field(	unsigned long,	rcx		)
223229456fcSMarcelo Tosatti 		__field(	unsigned long,	rdx		)
224e911eb3bSYu Zhang 		__field(	bool,		found		)
2252b110b61SSean Christopherson 		__field(	bool,		used_max_basic	)
226229456fcSMarcelo Tosatti 	),
227229456fcSMarcelo Tosatti 
228229456fcSMarcelo Tosatti 	TP_fast_assign(
229229456fcSMarcelo Tosatti 		__entry->function	= function;
230e7adda28SSean Christopherson 		__entry->index		= index;
231229456fcSMarcelo Tosatti 		__entry->rax		= rax;
232229456fcSMarcelo Tosatti 		__entry->rbx		= rbx;
233229456fcSMarcelo Tosatti 		__entry->rcx		= rcx;
234229456fcSMarcelo Tosatti 		__entry->rdx		= rdx;
235e911eb3bSYu Zhang 		__entry->found		= found;
2362b110b61SSean Christopherson 		__entry->used_max_basic	= used_max_basic;
237229456fcSMarcelo Tosatti 	),
238229456fcSMarcelo Tosatti 
2392b110b61SSean Christopherson 	TP_printk("func %x idx %x rax %lx rbx %lx rcx %lx rdx %lx, cpuid entry %s%s",
240e7adda28SSean Christopherson 		  __entry->function, __entry->index, __entry->rax,
241e911eb3bSYu Zhang 		  __entry->rbx, __entry->rcx, __entry->rdx,
2422b110b61SSean Christopherson 		  __entry->found ? "found" : "not found",
2432b110b61SSean Christopherson 		  __entry->used_max_basic ? ", used max basic" : "")
244229456fcSMarcelo Tosatti );
245229456fcSMarcelo Tosatti 
246cb247721SAvi Kivity #define AREG(x) { APIC_##x, "APIC_" #x }
247cb247721SAvi Kivity 
248cb247721SAvi Kivity #define kvm_trace_symbol_apic						    \
249cb247721SAvi Kivity 	AREG(ID), AREG(LVR), AREG(TASKPRI), AREG(ARBPRI), AREG(PROCPRI),    \
250cb247721SAvi Kivity 	AREG(EOI), AREG(RRR), AREG(LDR), AREG(DFR), AREG(SPIV), AREG(ISR),  \
251cb247721SAvi Kivity 	AREG(TMR), AREG(IRR), AREG(ESR), AREG(ICR), AREG(ICR2), AREG(LVTT), \
252cb247721SAvi Kivity 	AREG(LVTTHMR), AREG(LVTPC), AREG(LVT0), AREG(LVT1), AREG(LVTERR),   \
253cb247721SAvi Kivity 	AREG(TMICT), AREG(TMCCT), AREG(TDCR), AREG(SELF_IPI), AREG(EFEAT),  \
254cb247721SAvi Kivity 	AREG(ECTRL)
255229456fcSMarcelo Tosatti /*
256229456fcSMarcelo Tosatti  * Tracepoint for apic access.
257229456fcSMarcelo Tosatti  */
258229456fcSMarcelo Tosatti TRACE_EVENT(kvm_apic,
259b9964ee3SSean Christopherson 	TP_PROTO(unsigned int rw, unsigned int reg, u64 val),
260229456fcSMarcelo Tosatti 	TP_ARGS(rw, reg, val),
261229456fcSMarcelo Tosatti 
262229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
263229456fcSMarcelo Tosatti 		__field(	unsigned int,	rw		)
264229456fcSMarcelo Tosatti 		__field(	unsigned int,	reg		)
265b9964ee3SSean Christopherson 		__field(	u64,		val		)
266229456fcSMarcelo Tosatti 	),
267229456fcSMarcelo Tosatti 
268229456fcSMarcelo Tosatti 	TP_fast_assign(
269229456fcSMarcelo Tosatti 		__entry->rw		= rw;
270229456fcSMarcelo Tosatti 		__entry->reg		= reg;
271229456fcSMarcelo Tosatti 		__entry->val		= val;
272229456fcSMarcelo Tosatti 	),
273229456fcSMarcelo Tosatti 
274b9964ee3SSean Christopherson 	TP_printk("apic_%s %s = 0x%llx",
275229456fcSMarcelo Tosatti 		  __entry->rw ? "write" : "read",
276cb247721SAvi Kivity 		  __print_symbolic(__entry->reg, kvm_trace_symbol_apic),
277cb247721SAvi Kivity 		  __entry->val)
278229456fcSMarcelo Tosatti );
279229456fcSMarcelo Tosatti 
280229456fcSMarcelo Tosatti #define trace_kvm_apic_read(reg, val)		trace_kvm_apic(0, reg, val)
281229456fcSMarcelo Tosatti #define trace_kvm_apic_write(reg, val)		trace_kvm_apic(1, reg, val)
282229456fcSMarcelo Tosatti 
283aa17911eSAvi Kivity #define KVM_ISA_VMX   1
284aa17911eSAvi Kivity #define KVM_ISA_SVM   2
285aa17911eSAvi Kivity 
2862c4c4132SSean Christopherson #define kvm_print_exit_reason(exit_reason, isa)				\
2872c4c4132SSean Christopherson 	(isa == KVM_ISA_VMX) ?						\
2882c4c4132SSean Christopherson 	__print_symbolic(exit_reason & 0xffff, VMX_EXIT_REASONS) :	\
2892c4c4132SSean Christopherson 	__print_symbolic(exit_reason, SVM_EXIT_REASONS),		\
2902c4c4132SSean Christopherson 	(isa == KVM_ISA_VMX && exit_reason & ~0xffff) ? " " : "",	\
2912c4c4132SSean Christopherson 	(isa == KVM_ISA_VMX) ?						\
2922c4c4132SSean Christopherson 	__print_flags(exit_reason & ~0xffff, " ", VMX_EXIT_REASON_FLAGS) : ""
2932c4c4132SSean Christopherson 
294029e8c8aSSean Christopherson #define TRACE_EVENT_KVM_EXIT(name)					     \
295029e8c8aSSean Christopherson TRACE_EVENT(name,							     \
2960a62a031SDavid Edmondson 	TP_PROTO(struct kvm_vcpu *vcpu, u32 isa),			     \
2970a62a031SDavid Edmondson 	TP_ARGS(vcpu, isa),						     \
298029e8c8aSSean Christopherson 									     \
299029e8c8aSSean Christopherson 	TP_STRUCT__entry(						     \
300029e8c8aSSean Christopherson 		__field(	unsigned int,	exit_reason	)	     \
301029e8c8aSSean Christopherson 		__field(	unsigned long,	guest_rip	)	     \
302029e8c8aSSean Christopherson 		__field(	u32,	        isa             )	     \
303029e8c8aSSean Christopherson 		__field(	u64,	        info1           )	     \
304029e8c8aSSean Christopherson 		__field(	u64,	        info2           )	     \
305029e8c8aSSean Christopherson 		__field(	u32,	        intr_info	)	     \
306029e8c8aSSean Christopherson 		__field(	u32,	        error_code	)	     \
307029e8c8aSSean Christopherson 		__field(	unsigned int,	vcpu_id         )	     \
308029e8c8aSSean Christopherson 	),								     \
309029e8c8aSSean Christopherson 									     \
310029e8c8aSSean Christopherson 	TP_fast_assign(							     \
311029e8c8aSSean Christopherson 		__entry->guest_rip	= kvm_rip_read(vcpu);		     \
312029e8c8aSSean Christopherson 		__entry->isa            = isa;				     \
313029e8c8aSSean Christopherson 		__entry->vcpu_id        = vcpu->vcpu_id;		     \
3140a62a031SDavid Edmondson 		static_call(kvm_x86_get_exit_info)(vcpu,		     \
3150a62a031SDavid Edmondson 					  &__entry->exit_reason,	     \
3160a62a031SDavid Edmondson 					  &__entry->info1,		     \
317029e8c8aSSean Christopherson 					  &__entry->info2,		     \
318029e8c8aSSean Christopherson 					  &__entry->intr_info,		     \
319029e8c8aSSean Christopherson 					  &__entry->error_code);	     \
320029e8c8aSSean Christopherson 	),								     \
321029e8c8aSSean Christopherson 									     \
322029e8c8aSSean Christopherson 	TP_printk("vcpu %u reason %s%s%s rip 0x%lx info1 0x%016llx "	     \
323029e8c8aSSean Christopherson 		  "info2 0x%016llx intr_info 0x%08x error_code 0x%08x",	     \
324029e8c8aSSean Christopherson 		  __entry->vcpu_id,					     \
325029e8c8aSSean Christopherson 		  kvm_print_exit_reason(__entry->exit_reason, __entry->isa), \
326029e8c8aSSean Christopherson 		  __entry->guest_rip, __entry->info1, __entry->info2,	     \
327029e8c8aSSean Christopherson 		  __entry->intr_info, __entry->error_code)		     \
328029e8c8aSSean Christopherson )
329029e8c8aSSean Christopherson 
330229456fcSMarcelo Tosatti /*
331229456fcSMarcelo Tosatti  * Tracepoint for kvm guest exit:
332229456fcSMarcelo Tosatti  */
333029e8c8aSSean Christopherson TRACE_EVENT_KVM_EXIT(kvm_exit);
334229456fcSMarcelo Tosatti 
335229456fcSMarcelo Tosatti /*
336229456fcSMarcelo Tosatti  * Tracepoint for kvm interrupt injection:
337229456fcSMarcelo Tosatti  */
338229456fcSMarcelo Tosatti TRACE_EVENT(kvm_inj_virq,
3392d613912SSean Christopherson 	TP_PROTO(unsigned int vector, bool soft, bool reinjected),
3402d613912SSean Christopherson 	TP_ARGS(vector, soft, reinjected),
341229456fcSMarcelo Tosatti 
342229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
3432d613912SSean Christopherson 		__field(	unsigned int,	vector		)
3442d613912SSean Christopherson 		__field(	bool,		soft		)
3452d613912SSean Christopherson 		__field(	bool,		reinjected	)
346229456fcSMarcelo Tosatti 	),
347229456fcSMarcelo Tosatti 
348229456fcSMarcelo Tosatti 	TP_fast_assign(
3492d613912SSean Christopherson 		__entry->vector		= vector;
3502d613912SSean Christopherson 		__entry->soft		= soft;
3512d613912SSean Christopherson 		__entry->reinjected	= reinjected;
352229456fcSMarcelo Tosatti 	),
353229456fcSMarcelo Tosatti 
3542d613912SSean Christopherson 	TP_printk("%s 0x%x%s",
3552d613912SSean Christopherson 		  __entry->soft ? "Soft/INTn" : "IRQ", __entry->vector,
3562d613912SSean Christopherson 		  __entry->reinjected ? " [reinjected]" : "")
357229456fcSMarcelo Tosatti );
358229456fcSMarcelo Tosatti 
3595c1c85d0SAvi Kivity #define EXS(x) { x##_VECTOR, "#" #x }
3605c1c85d0SAvi Kivity 
3615c1c85d0SAvi Kivity #define kvm_trace_sym_exc						\
3625c1c85d0SAvi Kivity 	EXS(DE), EXS(DB), EXS(BP), EXS(OF), EXS(BR), EXS(UD), EXS(NM),	\
3635c1c85d0SAvi Kivity 	EXS(DF), EXS(TS), EXS(NP), EXS(SS), EXS(GP), EXS(PF),		\
364aba2f06cSPaolo Bonzini 	EXS(MF), EXS(AC), EXS(MC)
3655c1c85d0SAvi Kivity 
3665c1c85d0SAvi Kivity /*
3675c1c85d0SAvi Kivity  * Tracepoint for kvm interrupt injection:
3685c1c85d0SAvi Kivity  */
3695c1c85d0SAvi Kivity TRACE_EVENT(kvm_inj_exception,
370a61d7c54SSean Christopherson 	TP_PROTO(unsigned exception, bool has_error, unsigned error_code,
371a61d7c54SSean Christopherson 		 bool reinjected),
372a61d7c54SSean Christopherson 	TP_ARGS(exception, has_error, error_code, reinjected),
3735c1c85d0SAvi Kivity 
3745c1c85d0SAvi Kivity 	TP_STRUCT__entry(
3755c1c85d0SAvi Kivity 		__field(	u8,	exception	)
3765c1c85d0SAvi Kivity 		__field(	u8,	has_error	)
3775c1c85d0SAvi Kivity 		__field(	u32,	error_code	)
378a61d7c54SSean Christopherson 		__field(	bool,	reinjected	)
3795c1c85d0SAvi Kivity 	),
3805c1c85d0SAvi Kivity 
3815c1c85d0SAvi Kivity 	TP_fast_assign(
3825c1c85d0SAvi Kivity 		__entry->exception	= exception;
3835c1c85d0SAvi Kivity 		__entry->has_error	= has_error;
3845c1c85d0SAvi Kivity 		__entry->error_code	= error_code;
385a61d7c54SSean Christopherson 		__entry->reinjected	= reinjected;
3865c1c85d0SAvi Kivity 	),
3875c1c85d0SAvi Kivity 
38821d4c575SSean Christopherson 	TP_printk("%s%s%s%s%s",
3895c1c85d0SAvi Kivity 		  __print_symbolic(__entry->exception, kvm_trace_sym_exc),
39021d4c575SSean Christopherson 		  !__entry->has_error ? "" : " (",
39121d4c575SSean Christopherson 		  !__entry->has_error ? "" : __print_symbolic(__entry->error_code, { }),
39221d4c575SSean Christopherson 		  !__entry->has_error ? "" : ")",
393a61d7c54SSean Christopherson 		  __entry->reinjected ? " [reinjected]" : "")
3945c1c85d0SAvi Kivity );
3955c1c85d0SAvi Kivity 
396229456fcSMarcelo Tosatti /*
397229456fcSMarcelo Tosatti  * Tracepoint for page fault.
398229456fcSMarcelo Tosatti  */
399229456fcSMarcelo Tosatti TRACE_EVENT(kvm_page_fault,
400bff0adc4SSean Christopherson 	TP_PROTO(struct kvm_vcpu *vcpu, u64 fault_address, u64 error_code),
401faa03b39SWonhyuk Yang 	TP_ARGS(vcpu, fault_address, error_code),
402229456fcSMarcelo Tosatti 
403229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
404faa03b39SWonhyuk Yang 		__field(	unsigned int,	vcpu_id		)
405faa03b39SWonhyuk Yang 		__field(	unsigned long,	guest_rip	)
406bff0adc4SSean Christopherson 		__field(	u64,		fault_address	)
407bff0adc4SSean Christopherson 		__field(	u64,		error_code	)
408229456fcSMarcelo Tosatti 	),
409229456fcSMarcelo Tosatti 
410229456fcSMarcelo Tosatti 	TP_fast_assign(
411faa03b39SWonhyuk Yang 		__entry->vcpu_id	= vcpu->vcpu_id;
412faa03b39SWonhyuk Yang 		__entry->guest_rip	= kvm_rip_read(vcpu);
413229456fcSMarcelo Tosatti 		__entry->fault_address	= fault_address;
414229456fcSMarcelo Tosatti 		__entry->error_code	= error_code;
415229456fcSMarcelo Tosatti 	),
416229456fcSMarcelo Tosatti 
417bff0adc4SSean Christopherson 	TP_printk("vcpu %u rip 0x%lx address 0x%016llx error_code 0x%llx",
418faa03b39SWonhyuk Yang 		  __entry->vcpu_id, __entry->guest_rip,
419229456fcSMarcelo Tosatti 		  __entry->fault_address, __entry->error_code)
420229456fcSMarcelo Tosatti );
421229456fcSMarcelo Tosatti 
422229456fcSMarcelo Tosatti /*
423229456fcSMarcelo Tosatti  * Tracepoint for guest MSR access.
424229456fcSMarcelo Tosatti  */
425229456fcSMarcelo Tosatti TRACE_EVENT(kvm_msr,
42659200273SAvi Kivity 	TP_PROTO(unsigned write, u32 ecx, u64 data, bool exception),
42759200273SAvi Kivity 	TP_ARGS(write, ecx, data, exception),
428229456fcSMarcelo Tosatti 
429229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
4306e7d1529SAvi Kivity 		__field(	unsigned,	write		)
4316e7d1529SAvi Kivity 		__field(	u32,		ecx		)
4326e7d1529SAvi Kivity 		__field(	u64,		data		)
43359200273SAvi Kivity 		__field(	u8,		exception	)
434229456fcSMarcelo Tosatti 	),
435229456fcSMarcelo Tosatti 
436229456fcSMarcelo Tosatti 	TP_fast_assign(
4376e7d1529SAvi Kivity 		__entry->write		= write;
438229456fcSMarcelo Tosatti 		__entry->ecx		= ecx;
439229456fcSMarcelo Tosatti 		__entry->data		= data;
44059200273SAvi Kivity 		__entry->exception	= exception;
441229456fcSMarcelo Tosatti 	),
442229456fcSMarcelo Tosatti 
44359200273SAvi Kivity 	TP_printk("msr_%s %x = 0x%llx%s",
4446e7d1529SAvi Kivity 		  __entry->write ? "write" : "read",
44559200273SAvi Kivity 		  __entry->ecx, __entry->data,
44659200273SAvi Kivity 		  __entry->exception ? " (#GP)" : "")
447229456fcSMarcelo Tosatti );
448229456fcSMarcelo Tosatti 
44959200273SAvi Kivity #define trace_kvm_msr_read(ecx, data)      trace_kvm_msr(0, ecx, data, false)
45059200273SAvi Kivity #define trace_kvm_msr_write(ecx, data)     trace_kvm_msr(1, ecx, data, false)
45159200273SAvi Kivity #define trace_kvm_msr_read_ex(ecx)         trace_kvm_msr(0, ecx, 0, true)
45259200273SAvi Kivity #define trace_kvm_msr_write_ex(ecx, data)  trace_kvm_msr(1, ecx, data, true)
453229456fcSMarcelo Tosatti 
454229456fcSMarcelo Tosatti /*
455229456fcSMarcelo Tosatti  * Tracepoint for guest CR access.
456229456fcSMarcelo Tosatti  */
457229456fcSMarcelo Tosatti TRACE_EVENT(kvm_cr,
458229456fcSMarcelo Tosatti 	TP_PROTO(unsigned int rw, unsigned int cr, unsigned long val),
459229456fcSMarcelo Tosatti 	TP_ARGS(rw, cr, val),
460229456fcSMarcelo Tosatti 
461229456fcSMarcelo Tosatti 	TP_STRUCT__entry(
462229456fcSMarcelo Tosatti 		__field(	unsigned int,	rw		)
463229456fcSMarcelo Tosatti 		__field(	unsigned int,	cr		)
464229456fcSMarcelo Tosatti 		__field(	unsigned long,	val		)
465229456fcSMarcelo Tosatti 	),
466229456fcSMarcelo Tosatti 
467229456fcSMarcelo Tosatti 	TP_fast_assign(
468229456fcSMarcelo Tosatti 		__entry->rw		= rw;
469229456fcSMarcelo Tosatti 		__entry->cr		= cr;
470229456fcSMarcelo Tosatti 		__entry->val		= val;
471229456fcSMarcelo Tosatti 	),
472229456fcSMarcelo Tosatti 
473229456fcSMarcelo Tosatti 	TP_printk("cr_%s %x = 0x%lx",
474229456fcSMarcelo Tosatti 		  __entry->rw ? "write" : "read",
475229456fcSMarcelo Tosatti 		  __entry->cr, __entry->val)
476229456fcSMarcelo Tosatti );
477229456fcSMarcelo Tosatti 
478229456fcSMarcelo Tosatti #define trace_kvm_cr_read(cr, val)		trace_kvm_cr(0, cr, val)
479229456fcSMarcelo Tosatti #define trace_kvm_cr_write(cr, val)		trace_kvm_cr(1, cr, val)
480229456fcSMarcelo Tosatti 
4811000ff8dSGleb Natapov TRACE_EVENT(kvm_pic_set_irq,
4821000ff8dSGleb Natapov 	    TP_PROTO(__u8 chip, __u8 pin, __u8 elcr, __u8 imr, bool coalesced),
4831000ff8dSGleb Natapov 	    TP_ARGS(chip, pin, elcr, imr, coalesced),
4841000ff8dSGleb Natapov 
4851000ff8dSGleb Natapov 	TP_STRUCT__entry(
4861000ff8dSGleb Natapov 		__field(	__u8,		chip		)
4871000ff8dSGleb Natapov 		__field(	__u8,		pin		)
4881000ff8dSGleb Natapov 		__field(	__u8,		elcr		)
4891000ff8dSGleb Natapov 		__field(	__u8,		imr		)
4901000ff8dSGleb Natapov 		__field(	bool,		coalesced	)
4911000ff8dSGleb Natapov 	),
4921000ff8dSGleb Natapov 
4931000ff8dSGleb Natapov 	TP_fast_assign(
4941000ff8dSGleb Natapov 		__entry->chip		= chip;
4951000ff8dSGleb Natapov 		__entry->pin		= pin;
4961000ff8dSGleb Natapov 		__entry->elcr		= elcr;
4971000ff8dSGleb Natapov 		__entry->imr		= imr;
4981000ff8dSGleb Natapov 		__entry->coalesced	= coalesced;
4991000ff8dSGleb Natapov 	),
5001000ff8dSGleb Natapov 
5011000ff8dSGleb Natapov 	TP_printk("chip %u pin %u (%s%s)%s",
5021000ff8dSGleb Natapov 		  __entry->chip, __entry->pin,
5031000ff8dSGleb Natapov 		  (__entry->elcr & (1 << __entry->pin)) ? "level":"edge",
5041000ff8dSGleb Natapov 		  (__entry->imr & (1 << __entry->pin)) ? "|masked":"",
5051000ff8dSGleb Natapov 		  __entry->coalesced ? " (coalesced)" : "")
5061000ff8dSGleb Natapov );
5071000ff8dSGleb Natapov 
5081000ff8dSGleb Natapov #define kvm_apic_dst_shorthand		\
5091000ff8dSGleb Natapov 	{0x0, "dst"},			\
5101000ff8dSGleb Natapov 	{0x1, "self"},			\
5111000ff8dSGleb Natapov 	{0x2, "all"},			\
5121000ff8dSGleb Natapov 	{0x3, "all-but-self"}
5131000ff8dSGleb Natapov 
5141000ff8dSGleb Natapov TRACE_EVENT(kvm_apic_ipi,
5151000ff8dSGleb Natapov 	    TP_PROTO(__u32 icr_low, __u32 dest_id),
5161000ff8dSGleb Natapov 	    TP_ARGS(icr_low, dest_id),
5171000ff8dSGleb Natapov 
5181000ff8dSGleb Natapov 	TP_STRUCT__entry(
5191000ff8dSGleb Natapov 		__field(	__u32,		icr_low		)
5201000ff8dSGleb Natapov 		__field(	__u32,		dest_id		)
5211000ff8dSGleb Natapov 	),
5221000ff8dSGleb Natapov 
5231000ff8dSGleb Natapov 	TP_fast_assign(
5241000ff8dSGleb Natapov 		__entry->icr_low	= icr_low;
5251000ff8dSGleb Natapov 		__entry->dest_id	= dest_id;
5261000ff8dSGleb Natapov 	),
5271000ff8dSGleb Natapov 
5281000ff8dSGleb Natapov 	TP_printk("dst %x vec %u (%s|%s|%s|%s|%s)",
5291000ff8dSGleb Natapov 		  __entry->dest_id, (u8)__entry->icr_low,
5301000ff8dSGleb Natapov 		  __print_symbolic((__entry->icr_low >> 8 & 0x7),
5311000ff8dSGleb Natapov 				   kvm_deliver_mode),
5321000ff8dSGleb Natapov 		  (__entry->icr_low & (1<<11)) ? "logical" : "physical",
5331000ff8dSGleb Natapov 		  (__entry->icr_low & (1<<14)) ? "assert" : "de-assert",
5341000ff8dSGleb Natapov 		  (__entry->icr_low & (1<<15)) ? "level" : "edge",
5351000ff8dSGleb Natapov 		  __print_symbolic((__entry->icr_low >> 18 & 0x3),
5361000ff8dSGleb Natapov 				   kvm_apic_dst_shorthand))
5371000ff8dSGleb Natapov );
5381000ff8dSGleb Natapov 
5391000ff8dSGleb Natapov TRACE_EVENT(kvm_apic_accept_irq,
5407a223e06SVitaly Kuznetsov 	    TP_PROTO(__u32 apicid, __u16 dm, __u16 tm, __u8 vec),
541a183b638SPaolo Bonzini 	    TP_ARGS(apicid, dm, tm, vec),
5421000ff8dSGleb Natapov 
5431000ff8dSGleb Natapov 	TP_STRUCT__entry(
5441000ff8dSGleb Natapov 		__field(	__u32,		apicid		)
5451000ff8dSGleb Natapov 		__field(	__u16,		dm		)
5467a223e06SVitaly Kuznetsov 		__field(	__u16,		tm		)
5471000ff8dSGleb Natapov 		__field(	__u8,		vec		)
5481000ff8dSGleb Natapov 	),
5491000ff8dSGleb Natapov 
5501000ff8dSGleb Natapov 	TP_fast_assign(
5511000ff8dSGleb Natapov 		__entry->apicid		= apicid;
5521000ff8dSGleb Natapov 		__entry->dm		= dm;
5531000ff8dSGleb Natapov 		__entry->tm		= tm;
5541000ff8dSGleb Natapov 		__entry->vec		= vec;
5551000ff8dSGleb Natapov 	),
5561000ff8dSGleb Natapov 
557a183b638SPaolo Bonzini 	TP_printk("apicid %x vec %u (%s|%s)",
5581000ff8dSGleb Natapov 		  __entry->apicid, __entry->vec,
5591000ff8dSGleb Natapov 		  __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
560a183b638SPaolo Bonzini 		  __entry->tm ? "level" : "edge")
5611000ff8dSGleb Natapov );
5621000ff8dSGleb Natapov 
563ae7a2a3fSMichael S. Tsirkin TRACE_EVENT(kvm_eoi,
564ae7a2a3fSMichael S. Tsirkin 	    TP_PROTO(struct kvm_lapic *apic, int vector),
565ae7a2a3fSMichael S. Tsirkin 	    TP_ARGS(apic, vector),
566ae7a2a3fSMichael S. Tsirkin 
567ae7a2a3fSMichael S. Tsirkin 	TP_STRUCT__entry(
568ae7a2a3fSMichael S. Tsirkin 		__field(	__u32,		apicid		)
569ae7a2a3fSMichael S. Tsirkin 		__field(	int,		vector		)
570ae7a2a3fSMichael S. Tsirkin 	),
571ae7a2a3fSMichael S. Tsirkin 
572ae7a2a3fSMichael S. Tsirkin 	TP_fast_assign(
573ae7a2a3fSMichael S. Tsirkin 		__entry->apicid		= apic->vcpu->vcpu_id;
574ae7a2a3fSMichael S. Tsirkin 		__entry->vector		= vector;
575ae7a2a3fSMichael S. Tsirkin 	),
576ae7a2a3fSMichael S. Tsirkin 
577ae7a2a3fSMichael S. Tsirkin 	TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
578ae7a2a3fSMichael S. Tsirkin );
579ae7a2a3fSMichael S. Tsirkin 
580ae7a2a3fSMichael S. Tsirkin TRACE_EVENT(kvm_pv_eoi,
581ae7a2a3fSMichael S. Tsirkin 	    TP_PROTO(struct kvm_lapic *apic, int vector),
582ae7a2a3fSMichael S. Tsirkin 	    TP_ARGS(apic, vector),
583ae7a2a3fSMichael S. Tsirkin 
584ae7a2a3fSMichael S. Tsirkin 	TP_STRUCT__entry(
585ae7a2a3fSMichael S. Tsirkin 		__field(	__u32,		apicid		)
586ae7a2a3fSMichael S. Tsirkin 		__field(	int,		vector		)
587ae7a2a3fSMichael S. Tsirkin 	),
588ae7a2a3fSMichael S. Tsirkin 
589ae7a2a3fSMichael S. Tsirkin 	TP_fast_assign(
590ae7a2a3fSMichael S. Tsirkin 		__entry->apicid		= apic->vcpu->vcpu_id;
591ae7a2a3fSMichael S. Tsirkin 		__entry->vector		= vector;
592ae7a2a3fSMichael S. Tsirkin 	),
593ae7a2a3fSMichael S. Tsirkin 
594ae7a2a3fSMichael S. Tsirkin 	TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
595ae7a2a3fSMichael S. Tsirkin );
596ae7a2a3fSMichael S. Tsirkin 
5970ac406deSJoerg Roedel /*
5980ac406deSJoerg Roedel  * Tracepoint for nested VMRUN
5990ac406deSJoerg Roedel  */
60089e54ec5SMingwei Zhang TRACE_EVENT(kvm_nested_vmenter,
6010ac406deSJoerg Roedel 	    TP_PROTO(__u64 rip, __u64 vmcb, __u64 nested_rip, __u32 int_ctl,
60202dfc44fSMingwei Zhang 		     __u32 event_inj, bool tdp_enabled, __u64 guest_tdp_pgd,
60302dfc44fSMingwei Zhang 		     __u64 guest_cr3, __u32 isa),
60402dfc44fSMingwei Zhang 	    TP_ARGS(rip, vmcb, nested_rip, int_ctl, event_inj, tdp_enabled,
60502dfc44fSMingwei Zhang 		    guest_tdp_pgd, guest_cr3, isa),
6060ac406deSJoerg Roedel 
6070ac406deSJoerg Roedel 	TP_STRUCT__entry(
6080ac406deSJoerg Roedel 		__field(	__u64,		rip		)
6090ac406deSJoerg Roedel 		__field(	__u64,		vmcb		)
6100ac406deSJoerg Roedel 		__field(	__u64,		nested_rip	)
6110ac406deSJoerg Roedel 		__field(	__u32,		int_ctl		)
6120ac406deSJoerg Roedel 		__field(	__u32,		event_inj	)
61389e54ec5SMingwei Zhang 		__field(	bool,		tdp_enabled	)
61402dfc44fSMingwei Zhang 		__field(	__u64,		guest_pgd	)
61589e54ec5SMingwei Zhang 		__field(	__u32,		isa		)
6160ac406deSJoerg Roedel 	),
6170ac406deSJoerg Roedel 
6180ac406deSJoerg Roedel 	TP_fast_assign(
6190ac406deSJoerg Roedel 		__entry->rip		= rip;
6200ac406deSJoerg Roedel 		__entry->vmcb		= vmcb;
6210ac406deSJoerg Roedel 		__entry->nested_rip	= nested_rip;
6220ac406deSJoerg Roedel 		__entry->int_ctl	= int_ctl;
6230ac406deSJoerg Roedel 		__entry->event_inj	= event_inj;
62489e54ec5SMingwei Zhang 		__entry->tdp_enabled	= tdp_enabled;
62502dfc44fSMingwei Zhang 		__entry->guest_pgd	= tdp_enabled ? guest_tdp_pgd : guest_cr3;
62689e54ec5SMingwei Zhang 		__entry->isa		= isa;
6270ac406deSJoerg Roedel 	),
6280ac406deSJoerg Roedel 
62989e54ec5SMingwei Zhang 	TP_printk("rip: 0x%016llx %s: 0x%016llx nested_rip: 0x%016llx "
63002dfc44fSMingwei Zhang 		  "int_ctl: 0x%08x event_inj: 0x%08x nested_%s=%s %s: 0x%016llx",
63189e54ec5SMingwei Zhang 		  __entry->rip,
63289e54ec5SMingwei Zhang 		  __entry->isa == KVM_ISA_VMX ? "vmcs" : "vmcb",
63389e54ec5SMingwei Zhang 		  __entry->vmcb,
63489e54ec5SMingwei Zhang 		  __entry->nested_rip,
63589e54ec5SMingwei Zhang 		  __entry->int_ctl,
63689e54ec5SMingwei Zhang 		  __entry->event_inj,
63789e54ec5SMingwei Zhang 		  __entry->isa == KVM_ISA_VMX ? "ept" : "npt",
63802dfc44fSMingwei Zhang 		  __entry->tdp_enabled ? "y" : "n",
63902dfc44fSMingwei Zhang 		  !__entry->tdp_enabled ? "guest_cr3" :
64002dfc44fSMingwei Zhang 		  __entry->isa == KVM_ISA_VMX ? "nested_eptp" : "nested_cr3",
64102dfc44fSMingwei Zhang 		  __entry->guest_pgd)
6420ac406deSJoerg Roedel );
6430ac406deSJoerg Roedel 
6442e554e8dSJoerg Roedel TRACE_EVENT(kvm_nested_intercepts,
6454c44e8d6SBabu Moger 	    TP_PROTO(__u16 cr_read, __u16 cr_write, __u32 exceptions,
6464c44e8d6SBabu Moger 		     __u32 intercept1, __u32 intercept2, __u32 intercept3),
6474c44e8d6SBabu Moger 	    TP_ARGS(cr_read, cr_write, exceptions, intercept1,
6484c44e8d6SBabu Moger 		    intercept2, intercept3),
6492e554e8dSJoerg Roedel 
6502e554e8dSJoerg Roedel 	TP_STRUCT__entry(
6512e554e8dSJoerg Roedel 		__field(	__u16,		cr_read		)
6522e554e8dSJoerg Roedel 		__field(	__u16,		cr_write	)
6532e554e8dSJoerg Roedel 		__field(	__u32,		exceptions	)
654c62e2e94SBabu Moger 		__field(	__u32,		intercept1	)
655c62e2e94SBabu Moger 		__field(	__u32,		intercept2	)
6564c44e8d6SBabu Moger 		__field(	__u32,		intercept3	)
6572e554e8dSJoerg Roedel 	),
6582e554e8dSJoerg Roedel 
6592e554e8dSJoerg Roedel 	TP_fast_assign(
6602e554e8dSJoerg Roedel 		__entry->cr_read	= cr_read;
6612e554e8dSJoerg Roedel 		__entry->cr_write	= cr_write;
6622e554e8dSJoerg Roedel 		__entry->exceptions	= exceptions;
663c62e2e94SBabu Moger 		__entry->intercept1	= intercept1;
664c62e2e94SBabu Moger 		__entry->intercept2	= intercept2;
6654c44e8d6SBabu Moger 		__entry->intercept3	= intercept3;
6662e554e8dSJoerg Roedel 	),
6672e554e8dSJoerg Roedel 
668c62e2e94SBabu Moger 	TP_printk("cr_read: %04x cr_write: %04x excp: %08x "
6694c44e8d6SBabu Moger 		  "intercepts: %08x %08x %08x",
6702e554e8dSJoerg Roedel 		  __entry->cr_read, __entry->cr_write, __entry->exceptions,
6714c44e8d6SBabu Moger 		  __entry->intercept1, __entry->intercept2, __entry->intercept3)
6722e554e8dSJoerg Roedel );
673d8cabddfSJoerg Roedel /*
674d8cabddfSJoerg Roedel  * Tracepoint for #VMEXIT while nested
675d8cabddfSJoerg Roedel  */
676cc167bd7SSean Christopherson TRACE_EVENT_KVM_EXIT(kvm_nested_vmexit);
677d8cabddfSJoerg Roedel 
67817897f36SJoerg Roedel /*
67917897f36SJoerg Roedel  * Tracepoint for #VMEXIT reinjected to the guest
68017897f36SJoerg Roedel  */
68117897f36SJoerg Roedel TRACE_EVENT(kvm_nested_vmexit_inject,
68217897f36SJoerg Roedel 	    TP_PROTO(__u32 exit_code,
68317897f36SJoerg Roedel 		     __u64 exit_info1, __u64 exit_info2,
684e097e5ffSStefan Hajnoczi 		     __u32 exit_int_info, __u32 exit_int_info_err, __u32 isa),
68517897f36SJoerg Roedel 	    TP_ARGS(exit_code, exit_info1, exit_info2,
686e097e5ffSStefan Hajnoczi 		    exit_int_info, exit_int_info_err, isa),
68717897f36SJoerg Roedel 
68817897f36SJoerg Roedel 	TP_STRUCT__entry(
68917897f36SJoerg Roedel 		__field(	__u32,		exit_code		)
69017897f36SJoerg Roedel 		__field(	__u64,		exit_info1		)
69117897f36SJoerg Roedel 		__field(	__u64,		exit_info2		)
69217897f36SJoerg Roedel 		__field(	__u32,		exit_int_info		)
69317897f36SJoerg Roedel 		__field(	__u32,		exit_int_info_err	)
694e097e5ffSStefan Hajnoczi 		__field(	__u32,		isa			)
69517897f36SJoerg Roedel 	),
69617897f36SJoerg Roedel 
69717897f36SJoerg Roedel 	TP_fast_assign(
69817897f36SJoerg Roedel 		__entry->exit_code		= exit_code;
69917897f36SJoerg Roedel 		__entry->exit_info1		= exit_info1;
70017897f36SJoerg Roedel 		__entry->exit_info2		= exit_info2;
70117897f36SJoerg Roedel 		__entry->exit_int_info		= exit_int_info;
70217897f36SJoerg Roedel 		__entry->exit_int_info_err	= exit_int_info_err;
703e097e5ffSStefan Hajnoczi 		__entry->isa			= isa;
70417897f36SJoerg Roedel 	),
70517897f36SJoerg Roedel 
7062c4c4132SSean Christopherson 	TP_printk("reason: %s%s%s ext_inf1: 0x%016llx "
707052ce621SJoerg Roedel 		  "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x",
7082c4c4132SSean Christopherson 		  kvm_print_exit_reason(__entry->exit_code, __entry->isa),
70917897f36SJoerg Roedel 		  __entry->exit_info1, __entry->exit_info2,
71017897f36SJoerg Roedel 		  __entry->exit_int_info, __entry->exit_int_info_err)
71117897f36SJoerg Roedel );
712236649deSJoerg Roedel 
713236649deSJoerg Roedel /*
714236649deSJoerg Roedel  * Tracepoint for nested #vmexit because of interrupt pending
715236649deSJoerg Roedel  */
716236649deSJoerg Roedel TRACE_EVENT(kvm_nested_intr_vmexit,
717236649deSJoerg Roedel 	    TP_PROTO(__u64 rip),
718236649deSJoerg Roedel 	    TP_ARGS(rip),
719236649deSJoerg Roedel 
720236649deSJoerg Roedel 	TP_STRUCT__entry(
721236649deSJoerg Roedel 		__field(	__u64,	rip	)
722236649deSJoerg Roedel 	),
723236649deSJoerg Roedel 
724236649deSJoerg Roedel 	TP_fast_assign(
725236649deSJoerg Roedel 		__entry->rip	=	rip
726236649deSJoerg Roedel 	),
727236649deSJoerg Roedel 
728052ce621SJoerg Roedel 	TP_printk("rip: 0x%016llx", __entry->rip)
729236649deSJoerg Roedel );
730ec1ff790SJoerg Roedel 
731ec1ff790SJoerg Roedel /*
732ec1ff790SJoerg Roedel  * Tracepoint for nested #vmexit because of interrupt pending
733ec1ff790SJoerg Roedel  */
734ec1ff790SJoerg Roedel TRACE_EVENT(kvm_invlpga,
735*79b79ea2SSean Christopherson 	    TP_PROTO(__u64 rip, unsigned int asid, u64 address),
736ec1ff790SJoerg Roedel 	    TP_ARGS(rip, asid, address),
737ec1ff790SJoerg Roedel 
738ec1ff790SJoerg Roedel 	TP_STRUCT__entry(
739ec1ff790SJoerg Roedel 		__field(	__u64,		rip	)
740*79b79ea2SSean Christopherson 		__field(	unsigned int,	asid	)
741ec1ff790SJoerg Roedel 		__field(	__u64,		address	)
742ec1ff790SJoerg Roedel 	),
743ec1ff790SJoerg Roedel 
744ec1ff790SJoerg Roedel 	TP_fast_assign(
745ec1ff790SJoerg Roedel 		__entry->rip		=	rip;
746ec1ff790SJoerg Roedel 		__entry->asid		=	asid;
747ec1ff790SJoerg Roedel 		__entry->address	=	address;
748ec1ff790SJoerg Roedel 	),
749ec1ff790SJoerg Roedel 
750*79b79ea2SSean Christopherson 	TP_printk("rip: 0x%016llx asid: %u address: 0x%016llx",
751ec1ff790SJoerg Roedel 		  __entry->rip, __entry->asid, __entry->address)
752ec1ff790SJoerg Roedel );
753532a46b9SJoerg Roedel 
754532a46b9SJoerg Roedel /*
755532a46b9SJoerg Roedel  * Tracepoint for nested #vmexit because of interrupt pending
756532a46b9SJoerg Roedel  */
757532a46b9SJoerg Roedel TRACE_EVENT(kvm_skinit,
758532a46b9SJoerg Roedel 	    TP_PROTO(__u64 rip, __u32 slb),
759532a46b9SJoerg Roedel 	    TP_ARGS(rip, slb),
760532a46b9SJoerg Roedel 
761532a46b9SJoerg Roedel 	TP_STRUCT__entry(
762532a46b9SJoerg Roedel 		__field(	__u64,	rip	)
763532a46b9SJoerg Roedel 		__field(	__u32,	slb	)
764532a46b9SJoerg Roedel 	),
765532a46b9SJoerg Roedel 
766532a46b9SJoerg Roedel 	TP_fast_assign(
767532a46b9SJoerg Roedel 		__entry->rip		=	rip;
768532a46b9SJoerg Roedel 		__entry->slb		=	slb;
769532a46b9SJoerg Roedel 	),
770532a46b9SJoerg Roedel 
771052ce621SJoerg Roedel 	TP_printk("rip: 0x%016llx slb: 0x%08x",
772532a46b9SJoerg Roedel 		  __entry->rip, __entry->slb)
773532a46b9SJoerg Roedel );
774532a46b9SJoerg Roedel 
775e46479f8SAvi Kivity #define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
776e46479f8SAvi Kivity #define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
777e46479f8SAvi Kivity #define KVM_EMUL_INSN_F_CS_D   (1 << 2)
778e46479f8SAvi Kivity #define KVM_EMUL_INSN_F_CS_L   (1 << 3)
779e46479f8SAvi Kivity 
780e46479f8SAvi Kivity #define kvm_trace_symbol_emul_flags	                  \
781e46479f8SAvi Kivity 	{ 0,   			    "real" },		  \
782e46479f8SAvi Kivity 	{ KVM_EMUL_INSN_F_CR0_PE			  \
783e46479f8SAvi Kivity 	  | KVM_EMUL_INSN_F_EFL_VM, "vm16" },		  \
784e46479f8SAvi Kivity 	{ KVM_EMUL_INSN_F_CR0_PE,   "prot16" },		  \
785e46479f8SAvi Kivity 	{ KVM_EMUL_INSN_F_CR0_PE			  \
786e46479f8SAvi Kivity 	  | KVM_EMUL_INSN_F_CS_D,   "prot32" },		  \
787e46479f8SAvi Kivity 	{ KVM_EMUL_INSN_F_CR0_PE			  \
788e46479f8SAvi Kivity 	  | KVM_EMUL_INSN_F_CS_L,   "prot64" }
789e46479f8SAvi Kivity 
790e46479f8SAvi Kivity #define kei_decode_mode(mode) ({			\
791e46479f8SAvi Kivity 	u8 flags = 0xff;				\
792e46479f8SAvi Kivity 	switch (mode) {					\
793e46479f8SAvi Kivity 	case X86EMUL_MODE_REAL:				\
794e46479f8SAvi Kivity 		flags = 0;				\
795e46479f8SAvi Kivity 		break;					\
796e46479f8SAvi Kivity 	case X86EMUL_MODE_VM86:				\
797e46479f8SAvi Kivity 		flags = KVM_EMUL_INSN_F_EFL_VM;		\
798e46479f8SAvi Kivity 		break;					\
799e46479f8SAvi Kivity 	case X86EMUL_MODE_PROT16:			\
800e46479f8SAvi Kivity 		flags = KVM_EMUL_INSN_F_CR0_PE;		\
801e46479f8SAvi Kivity 		break;					\
802e46479f8SAvi Kivity 	case X86EMUL_MODE_PROT32:			\
803e46479f8SAvi Kivity 		flags = KVM_EMUL_INSN_F_CR0_PE		\
804e46479f8SAvi Kivity 			| KVM_EMUL_INSN_F_CS_D;		\
805e46479f8SAvi Kivity 		break;					\
806e46479f8SAvi Kivity 	case X86EMUL_MODE_PROT64:			\
807e46479f8SAvi Kivity 		flags = KVM_EMUL_INSN_F_CR0_PE		\
808e46479f8SAvi Kivity 			| KVM_EMUL_INSN_F_CS_L;		\
809e46479f8SAvi Kivity 		break;					\
810e46479f8SAvi Kivity 	}						\
811e46479f8SAvi Kivity 	flags;						\
812e46479f8SAvi Kivity 	})
813e46479f8SAvi Kivity 
814e46479f8SAvi Kivity TRACE_EVENT(kvm_emulate_insn,
815e46479f8SAvi Kivity 	TP_PROTO(struct kvm_vcpu *vcpu, __u8 failed),
816e46479f8SAvi Kivity 	TP_ARGS(vcpu, failed),
817e46479f8SAvi Kivity 
818e46479f8SAvi Kivity 	TP_STRUCT__entry(
819e46479f8SAvi Kivity 		__field(    __u64, rip                       )
820e46479f8SAvi Kivity 		__field(    __u32, csbase                    )
821e46479f8SAvi Kivity 		__field(    __u8,  len                       )
822e46479f8SAvi Kivity 		__array(    __u8,  insn,    15	             )
823e46479f8SAvi Kivity 		__field(    __u8,  flags       	   	     )
824e46479f8SAvi Kivity 		__field(    __u8,  failed                    )
825e46479f8SAvi Kivity 		),
826e46479f8SAvi Kivity 
827e46479f8SAvi Kivity 	TP_fast_assign(
828b3646477SJason Baron 		__entry->csbase = static_call(kvm_x86_get_segment_base)(vcpu, VCPU_SREG_CS);
829c9b8b07cSSean Christopherson 		__entry->len = vcpu->arch.emulate_ctxt->fetch.ptr
830c9b8b07cSSean Christopherson 			       - vcpu->arch.emulate_ctxt->fetch.data;
831c9b8b07cSSean Christopherson 		__entry->rip = vcpu->arch.emulate_ctxt->_eip - __entry->len;
832e46479f8SAvi Kivity 		memcpy(__entry->insn,
833c9b8b07cSSean Christopherson 		       vcpu->arch.emulate_ctxt->fetch.data,
834e46479f8SAvi Kivity 		       15);
835c9b8b07cSSean Christopherson 		__entry->flags = kei_decode_mode(vcpu->arch.emulate_ctxt->mode);
836e46479f8SAvi Kivity 		__entry->failed = failed;
837e46479f8SAvi Kivity 		),
838e46479f8SAvi Kivity 
839e46479f8SAvi Kivity 	TP_printk("%x:%llx:%s (%s)%s",
840e46479f8SAvi Kivity 		  __entry->csbase, __entry->rip,
841b102f1d0SNamhyung Kim 		  __print_hex(__entry->insn, __entry->len),
842e46479f8SAvi Kivity 		  __print_symbolic(__entry->flags,
843e46479f8SAvi Kivity 				   kvm_trace_symbol_emul_flags),
844e46479f8SAvi Kivity 		  __entry->failed ? " failed" : ""
845e46479f8SAvi Kivity 		)
846e46479f8SAvi Kivity 	);
847e46479f8SAvi Kivity 
848e46479f8SAvi Kivity #define trace_kvm_emulate_insn_start(vcpu) trace_kvm_emulate_insn(vcpu, 0)
849e46479f8SAvi Kivity #define trace_kvm_emulate_insn_failed(vcpu) trace_kvm_emulate_insn(vcpu, 1)
850e46479f8SAvi Kivity 
8514f022648SXiao Guangrong TRACE_EVENT(
8524f022648SXiao Guangrong 	vcpu_match_mmio,
8534f022648SXiao Guangrong 	TP_PROTO(gva_t gva, gpa_t gpa, bool write, bool gpa_match),
8544f022648SXiao Guangrong 	TP_ARGS(gva, gpa, write, gpa_match),
8554f022648SXiao Guangrong 
8564f022648SXiao Guangrong 	TP_STRUCT__entry(
8574f022648SXiao Guangrong 		__field(gva_t, gva)
8584f022648SXiao Guangrong 		__field(gpa_t, gpa)
8594f022648SXiao Guangrong 		__field(bool, write)
8604f022648SXiao Guangrong 		__field(bool, gpa_match)
8614f022648SXiao Guangrong 		),
8624f022648SXiao Guangrong 
8634f022648SXiao Guangrong 	TP_fast_assign(
8644f022648SXiao Guangrong 		__entry->gva = gva;
8654f022648SXiao Guangrong 		__entry->gpa = gpa;
8664f022648SXiao Guangrong 		__entry->write = write;
8674f022648SXiao Guangrong 		__entry->gpa_match = gpa_match
8684f022648SXiao Guangrong 		),
8694f022648SXiao Guangrong 
8704f022648SXiao Guangrong 	TP_printk("gva %#lx gpa %#llx %s %s", __entry->gva, __entry->gpa,
8714f022648SXiao Guangrong 		  __entry->write ? "Write" : "Read",
8724f022648SXiao Guangrong 		  __entry->gpa_match ? "GPA" : "GVA")
8734f022648SXiao Guangrong );
874d828199eSMarcelo Tosatti 
875489223edSYoshihiro YUNOMAE TRACE_EVENT(kvm_write_tsc_offset,
876489223edSYoshihiro YUNOMAE 	TP_PROTO(unsigned int vcpu_id, __u64 previous_tsc_offset,
877489223edSYoshihiro YUNOMAE 		 __u64 next_tsc_offset),
878489223edSYoshihiro YUNOMAE 	TP_ARGS(vcpu_id, previous_tsc_offset, next_tsc_offset),
879489223edSYoshihiro YUNOMAE 
880489223edSYoshihiro YUNOMAE 	TP_STRUCT__entry(
881489223edSYoshihiro YUNOMAE 		__field( unsigned int,	vcpu_id				)
882489223edSYoshihiro YUNOMAE 		__field(	__u64,	previous_tsc_offset		)
883489223edSYoshihiro YUNOMAE 		__field(	__u64,	next_tsc_offset			)
884489223edSYoshihiro YUNOMAE 	),
885489223edSYoshihiro YUNOMAE 
886489223edSYoshihiro YUNOMAE 	TP_fast_assign(
887489223edSYoshihiro YUNOMAE 		__entry->vcpu_id		= vcpu_id;
888489223edSYoshihiro YUNOMAE 		__entry->previous_tsc_offset	= previous_tsc_offset;
889489223edSYoshihiro YUNOMAE 		__entry->next_tsc_offset	= next_tsc_offset;
890489223edSYoshihiro YUNOMAE 	),
891489223edSYoshihiro YUNOMAE 
892489223edSYoshihiro YUNOMAE 	TP_printk("vcpu=%u prev=%llu next=%llu", __entry->vcpu_id,
893489223edSYoshihiro YUNOMAE 		  __entry->previous_tsc_offset, __entry->next_tsc_offset)
894489223edSYoshihiro YUNOMAE );
895489223edSYoshihiro YUNOMAE 
896d828199eSMarcelo Tosatti #ifdef CONFIG_X86_64
897d828199eSMarcelo Tosatti 
898d828199eSMarcelo Tosatti #define host_clocks					\
899b95a8a27SThomas Gleixner 	{VDSO_CLOCKMODE_NONE, "none"},			\
900b95a8a27SThomas Gleixner 	{VDSO_CLOCKMODE_TSC,  "tsc"}			\
901d828199eSMarcelo Tosatti 
902d828199eSMarcelo Tosatti TRACE_EVENT(kvm_update_master_clock,
903b48aa97eSMarcelo Tosatti 	TP_PROTO(bool use_master_clock, unsigned int host_clock, bool offset_matched),
904b48aa97eSMarcelo Tosatti 	TP_ARGS(use_master_clock, host_clock, offset_matched),
905d828199eSMarcelo Tosatti 
906d828199eSMarcelo Tosatti 	TP_STRUCT__entry(
907d828199eSMarcelo Tosatti 		__field(		bool,	use_master_clock	)
908d828199eSMarcelo Tosatti 		__field(	unsigned int,	host_clock		)
909b48aa97eSMarcelo Tosatti 		__field(		bool,	offset_matched		)
910d828199eSMarcelo Tosatti 	),
911d828199eSMarcelo Tosatti 
912d828199eSMarcelo Tosatti 	TP_fast_assign(
913d828199eSMarcelo Tosatti 		__entry->use_master_clock	= use_master_clock;
914d828199eSMarcelo Tosatti 		__entry->host_clock		= host_clock;
915b48aa97eSMarcelo Tosatti 		__entry->offset_matched		= offset_matched;
916d828199eSMarcelo Tosatti 	),
917d828199eSMarcelo Tosatti 
918b48aa97eSMarcelo Tosatti 	TP_printk("masterclock %d hostclock %s offsetmatched %u",
919d828199eSMarcelo Tosatti 		  __entry->use_master_clock,
920b48aa97eSMarcelo Tosatti 		  __print_symbolic(__entry->host_clock, host_clocks),
921b48aa97eSMarcelo Tosatti 		  __entry->offset_matched)
922b48aa97eSMarcelo Tosatti );
923b48aa97eSMarcelo Tosatti 
924b48aa97eSMarcelo Tosatti TRACE_EVENT(kvm_track_tsc,
925b48aa97eSMarcelo Tosatti 	TP_PROTO(unsigned int vcpu_id, unsigned int nr_matched,
926b48aa97eSMarcelo Tosatti 		 unsigned int online_vcpus, bool use_master_clock,
927b48aa97eSMarcelo Tosatti 		 unsigned int host_clock),
928b48aa97eSMarcelo Tosatti 	TP_ARGS(vcpu_id, nr_matched, online_vcpus, use_master_clock,
929b48aa97eSMarcelo Tosatti 		host_clock),
930b48aa97eSMarcelo Tosatti 
931b48aa97eSMarcelo Tosatti 	TP_STRUCT__entry(
932b48aa97eSMarcelo Tosatti 		__field(	unsigned int,	vcpu_id			)
933b48aa97eSMarcelo Tosatti 		__field(	unsigned int,	nr_vcpus_matched_tsc	)
934b48aa97eSMarcelo Tosatti 		__field(	unsigned int,	online_vcpus		)
935b48aa97eSMarcelo Tosatti 		__field(	bool,		use_master_clock	)
936b48aa97eSMarcelo Tosatti 		__field(	unsigned int,	host_clock		)
937b48aa97eSMarcelo Tosatti 	),
938b48aa97eSMarcelo Tosatti 
939b48aa97eSMarcelo Tosatti 	TP_fast_assign(
940b48aa97eSMarcelo Tosatti 		__entry->vcpu_id		= vcpu_id;
941b48aa97eSMarcelo Tosatti 		__entry->nr_vcpus_matched_tsc	= nr_matched;
942b48aa97eSMarcelo Tosatti 		__entry->online_vcpus		= online_vcpus;
943b48aa97eSMarcelo Tosatti 		__entry->use_master_clock	= use_master_clock;
944b48aa97eSMarcelo Tosatti 		__entry->host_clock		= host_clock;
945b48aa97eSMarcelo Tosatti 	),
946b48aa97eSMarcelo Tosatti 
947b48aa97eSMarcelo Tosatti 	TP_printk("vcpu_id %u masterclock %u offsetmatched %u nr_online %u"
948b48aa97eSMarcelo Tosatti 		  " hostclock %s",
949b48aa97eSMarcelo Tosatti 		  __entry->vcpu_id, __entry->use_master_clock,
950b48aa97eSMarcelo Tosatti 		  __entry->nr_vcpus_matched_tsc, __entry->online_vcpus,
951d828199eSMarcelo Tosatti 		  __print_symbolic(__entry->host_clock, host_clocks))
952d828199eSMarcelo Tosatti );
953d828199eSMarcelo Tosatti 
95454ad89b0SPaolo Bonzini #endif /* CONFIG_X86_64 */
95554ad89b0SPaolo Bonzini 
956843e4330SKai Huang /*
957843e4330SKai Huang  * Tracepoint for PML full VMEXIT.
958843e4330SKai Huang  */
959843e4330SKai Huang TRACE_EVENT(kvm_pml_full,
960843e4330SKai Huang 	TP_PROTO(unsigned int vcpu_id),
961843e4330SKai Huang 	TP_ARGS(vcpu_id),
962843e4330SKai Huang 
963843e4330SKai Huang 	TP_STRUCT__entry(
964843e4330SKai Huang 		__field(	unsigned int,	vcpu_id			)
965843e4330SKai Huang 	),
966843e4330SKai Huang 
967843e4330SKai Huang 	TP_fast_assign(
968843e4330SKai Huang 		__entry->vcpu_id		= vcpu_id;
969843e4330SKai Huang 	),
970843e4330SKai Huang 
971843e4330SKai Huang 	TP_printk("vcpu %d: PML full", __entry->vcpu_id)
972843e4330SKai Huang );
973843e4330SKai Huang 
9744f75bcc3SPeter Xu TRACE_EVENT(kvm_ple_window_update,
9754f75bcc3SPeter Xu 	TP_PROTO(unsigned int vcpu_id, unsigned int new, unsigned int old),
9764f75bcc3SPeter Xu 	TP_ARGS(vcpu_id, new, old),
9777b46268dSRadim Krčmář 
9787b46268dSRadim Krčmář 	TP_STRUCT__entry(
9797b46268dSRadim Krčmář 		__field(        unsigned int,   vcpu_id         )
980c5c5d6faSPeter Xu 		__field(        unsigned int,       new         )
981c5c5d6faSPeter Xu 		__field(        unsigned int,       old         )
9827b46268dSRadim Krčmář 	),
9837b46268dSRadim Krčmář 
9847b46268dSRadim Krčmář 	TP_fast_assign(
9857b46268dSRadim Krčmář 		__entry->vcpu_id        = vcpu_id;
9867b46268dSRadim Krčmář 		__entry->new            = new;
9877b46268dSRadim Krčmář 		__entry->old            = old;
9887b46268dSRadim Krčmář 	),
9897b46268dSRadim Krčmář 
9904f75bcc3SPeter Xu 	TP_printk("vcpu %u old %u new %u (%s)",
9914f75bcc3SPeter Xu 	          __entry->vcpu_id, __entry->old, __entry->new,
9924f75bcc3SPeter Xu 		  __entry->old < __entry->new ? "growed" : "shrinked")
9937b46268dSRadim Krčmář );
9947b46268dSRadim Krčmář 
995ce1a5e60SDavid Matlack TRACE_EVENT(kvm_pvclock_update,
996ce1a5e60SDavid Matlack 	TP_PROTO(unsigned int vcpu_id, struct pvclock_vcpu_time_info *pvclock),
997ce1a5e60SDavid Matlack 	TP_ARGS(vcpu_id, pvclock),
998ce1a5e60SDavid Matlack 
999ce1a5e60SDavid Matlack 	TP_STRUCT__entry(
1000ce1a5e60SDavid Matlack 		__field(	unsigned int,	vcpu_id			)
1001ce1a5e60SDavid Matlack 		__field(	__u32,		version			)
1002ce1a5e60SDavid Matlack 		__field(	__u64,		tsc_timestamp		)
1003ce1a5e60SDavid Matlack 		__field(	__u64,		system_time		)
1004ce1a5e60SDavid Matlack 		__field(	__u32,		tsc_to_system_mul	)
1005ce1a5e60SDavid Matlack 		__field(	__s8,		tsc_shift		)
1006ce1a5e60SDavid Matlack 		__field(	__u8,		flags			)
1007ce1a5e60SDavid Matlack 	),
1008ce1a5e60SDavid Matlack 
1009ce1a5e60SDavid Matlack 	TP_fast_assign(
1010ce1a5e60SDavid Matlack 		__entry->vcpu_id	   = vcpu_id;
1011ce1a5e60SDavid Matlack 		__entry->version	   = pvclock->version;
1012ce1a5e60SDavid Matlack 		__entry->tsc_timestamp	   = pvclock->tsc_timestamp;
1013ce1a5e60SDavid Matlack 		__entry->system_time	   = pvclock->system_time;
1014ce1a5e60SDavid Matlack 		__entry->tsc_to_system_mul = pvclock->tsc_to_system_mul;
1015ce1a5e60SDavid Matlack 		__entry->tsc_shift	   = pvclock->tsc_shift;
1016ce1a5e60SDavid Matlack 		__entry->flags		   = pvclock->flags;
1017ce1a5e60SDavid Matlack 	),
1018ce1a5e60SDavid Matlack 
1019ce1a5e60SDavid Matlack 	TP_printk("vcpu_id %u, pvclock { version %u, tsc_timestamp 0x%llx, "
1020ce1a5e60SDavid Matlack 		  "system_time 0x%llx, tsc_to_system_mul 0x%x, tsc_shift %d, "
1021ce1a5e60SDavid Matlack 		  "flags 0x%x }",
1022ce1a5e60SDavid Matlack 		  __entry->vcpu_id,
1023ce1a5e60SDavid Matlack 		  __entry->version,
1024ce1a5e60SDavid Matlack 		  __entry->tsc_timestamp,
1025ce1a5e60SDavid Matlack 		  __entry->system_time,
1026ce1a5e60SDavid Matlack 		  __entry->tsc_to_system_mul,
1027ce1a5e60SDavid Matlack 		  __entry->tsc_shift,
1028ce1a5e60SDavid Matlack 		  __entry->flags)
1029ce1a5e60SDavid Matlack );
1030ce1a5e60SDavid Matlack 
10316c19b753SMarcelo Tosatti TRACE_EVENT(kvm_wait_lapic_expire,
10326c19b753SMarcelo Tosatti 	TP_PROTO(unsigned int vcpu_id, s64 delta),
10336c19b753SMarcelo Tosatti 	TP_ARGS(vcpu_id, delta),
10346c19b753SMarcelo Tosatti 
10356c19b753SMarcelo Tosatti 	TP_STRUCT__entry(
10366c19b753SMarcelo Tosatti 		__field(	unsigned int,	vcpu_id		)
10376c19b753SMarcelo Tosatti 		__field(	s64,		delta		)
10386c19b753SMarcelo Tosatti 	),
10396c19b753SMarcelo Tosatti 
10406c19b753SMarcelo Tosatti 	TP_fast_assign(
10416c19b753SMarcelo Tosatti 		__entry->vcpu_id	   = vcpu_id;
10426c19b753SMarcelo Tosatti 		__entry->delta             = delta;
10436c19b753SMarcelo Tosatti 	),
10446c19b753SMarcelo Tosatti 
10456c19b753SMarcelo Tosatti 	TP_printk("vcpu %u: delta %lld (%s)",
10466c19b753SMarcelo Tosatti 		  __entry->vcpu_id,
10476c19b753SMarcelo Tosatti 		  __entry->delta,
10486c19b753SMarcelo Tosatti 		  __entry->delta < 0 ? "early" : "late")
10496c19b753SMarcelo Tosatti );
10506c19b753SMarcelo Tosatti 
10511270e647SSean Christopherson TRACE_EVENT(kvm_smm_transition,
1052660a5d51SPaolo Bonzini 	TP_PROTO(unsigned int vcpu_id, u64 smbase, bool entering),
1053660a5d51SPaolo Bonzini 	TP_ARGS(vcpu_id, smbase, entering),
1054660a5d51SPaolo Bonzini 
1055660a5d51SPaolo Bonzini 	TP_STRUCT__entry(
1056660a5d51SPaolo Bonzini 		__field(	unsigned int,	vcpu_id		)
1057660a5d51SPaolo Bonzini 		__field(	u64,		smbase		)
1058660a5d51SPaolo Bonzini 		__field(	bool,		entering	)
1059660a5d51SPaolo Bonzini 	),
1060660a5d51SPaolo Bonzini 
1061660a5d51SPaolo Bonzini 	TP_fast_assign(
1062660a5d51SPaolo Bonzini 		__entry->vcpu_id	= vcpu_id;
1063660a5d51SPaolo Bonzini 		__entry->smbase		= smbase;
1064660a5d51SPaolo Bonzini 		__entry->entering	= entering;
1065660a5d51SPaolo Bonzini 	),
1066660a5d51SPaolo Bonzini 
1067660a5d51SPaolo Bonzini 	TP_printk("vcpu %u: %s SMM, smbase 0x%llx",
1068660a5d51SPaolo Bonzini 		  __entry->vcpu_id,
1069660a5d51SPaolo Bonzini 		  __entry->entering ? "entering" : "leaving",
1070660a5d51SPaolo Bonzini 		  __entry->smbase)
1071660a5d51SPaolo Bonzini );
1072660a5d51SPaolo Bonzini 
1073efc64404SFeng Wu /*
1074efc64404SFeng Wu  * Tracepoint for VT-d posted-interrupts.
1075efc64404SFeng Wu  */
1076efc64404SFeng Wu TRACE_EVENT(kvm_pi_irte_update,
1077b6ce9780SFeng Wu 	TP_PROTO(unsigned int host_irq, unsigned int vcpu_id,
1078b6ce9780SFeng Wu 		 unsigned int gsi, unsigned int gvec,
1079b6ce9780SFeng Wu 		 u64 pi_desc_addr, bool set),
1080b6ce9780SFeng Wu 	TP_ARGS(host_irq, vcpu_id, gsi, gvec, pi_desc_addr, set),
1081efc64404SFeng Wu 
1082efc64404SFeng Wu 	TP_STRUCT__entry(
1083b6ce9780SFeng Wu 		__field(	unsigned int,	host_irq	)
1084efc64404SFeng Wu 		__field(	unsigned int,	vcpu_id		)
1085efc64404SFeng Wu 		__field(	unsigned int,	gsi		)
1086efc64404SFeng Wu 		__field(	unsigned int,	gvec		)
1087efc64404SFeng Wu 		__field(	u64,		pi_desc_addr	)
1088efc64404SFeng Wu 		__field(	bool,		set		)
1089efc64404SFeng Wu 	),
1090efc64404SFeng Wu 
1091efc64404SFeng Wu 	TP_fast_assign(
1092b6ce9780SFeng Wu 		__entry->host_irq	= host_irq;
1093efc64404SFeng Wu 		__entry->vcpu_id	= vcpu_id;
1094efc64404SFeng Wu 		__entry->gsi		= gsi;
1095efc64404SFeng Wu 		__entry->gvec		= gvec;
1096efc64404SFeng Wu 		__entry->pi_desc_addr	= pi_desc_addr;
1097efc64404SFeng Wu 		__entry->set		= set;
1098efc64404SFeng Wu 	),
1099efc64404SFeng Wu 
1100b6ce9780SFeng Wu 	TP_printk("VT-d PI is %s for irq %u, vcpu %u, gsi: 0x%x, "
1101efc64404SFeng Wu 		  "gvec: 0x%x, pi_desc_addr: 0x%llx",
1102efc64404SFeng Wu 		  __entry->set ? "enabled and being updated" : "disabled",
1103b6ce9780SFeng Wu 		  __entry->host_irq,
1104efc64404SFeng Wu 		  __entry->vcpu_id,
1105efc64404SFeng Wu 		  __entry->gsi,
1106efc64404SFeng Wu 		  __entry->gvec,
1107efc64404SFeng Wu 		  __entry->pi_desc_addr)
1108efc64404SFeng Wu );
1109efc64404SFeng Wu 
111018659a9cSAndrey Smetanin /*
111118659a9cSAndrey Smetanin  * Tracepoint for kvm_hv_notify_acked_sint.
111218659a9cSAndrey Smetanin  */
111318659a9cSAndrey Smetanin TRACE_EVENT(kvm_hv_notify_acked_sint,
111418659a9cSAndrey Smetanin 	TP_PROTO(int vcpu_id, u32 sint),
111518659a9cSAndrey Smetanin 	TP_ARGS(vcpu_id, sint),
111618659a9cSAndrey Smetanin 
111718659a9cSAndrey Smetanin 	TP_STRUCT__entry(
111818659a9cSAndrey Smetanin 		__field(int, vcpu_id)
111918659a9cSAndrey Smetanin 		__field(u32, sint)
112018659a9cSAndrey Smetanin 	),
112118659a9cSAndrey Smetanin 
112218659a9cSAndrey Smetanin 	TP_fast_assign(
112318659a9cSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
112418659a9cSAndrey Smetanin 		__entry->sint = sint;
112518659a9cSAndrey Smetanin 	),
112618659a9cSAndrey Smetanin 
112718659a9cSAndrey Smetanin 	TP_printk("vcpu_id %d sint %u", __entry->vcpu_id, __entry->sint)
112818659a9cSAndrey Smetanin );
112918659a9cSAndrey Smetanin 
113018659a9cSAndrey Smetanin /*
113118659a9cSAndrey Smetanin  * Tracepoint for synic_set_irq.
113218659a9cSAndrey Smetanin  */
113318659a9cSAndrey Smetanin TRACE_EVENT(kvm_hv_synic_set_irq,
113418659a9cSAndrey Smetanin 	TP_PROTO(int vcpu_id, u32 sint, int vector, int ret),
113518659a9cSAndrey Smetanin 	TP_ARGS(vcpu_id, sint, vector, ret),
113618659a9cSAndrey Smetanin 
113718659a9cSAndrey Smetanin 	TP_STRUCT__entry(
113818659a9cSAndrey Smetanin 		__field(int, vcpu_id)
113918659a9cSAndrey Smetanin 		__field(u32, sint)
114018659a9cSAndrey Smetanin 		__field(int, vector)
114118659a9cSAndrey Smetanin 		__field(int, ret)
114218659a9cSAndrey Smetanin 	),
114318659a9cSAndrey Smetanin 
114418659a9cSAndrey Smetanin 	TP_fast_assign(
114518659a9cSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
114618659a9cSAndrey Smetanin 		__entry->sint = sint;
114718659a9cSAndrey Smetanin 		__entry->vector = vector;
114818659a9cSAndrey Smetanin 		__entry->ret = ret;
114918659a9cSAndrey Smetanin 	),
115018659a9cSAndrey Smetanin 
115118659a9cSAndrey Smetanin 	TP_printk("vcpu_id %d sint %u vector %d ret %d",
115218659a9cSAndrey Smetanin 		  __entry->vcpu_id, __entry->sint, __entry->vector,
115318659a9cSAndrey Smetanin 		  __entry->ret)
115418659a9cSAndrey Smetanin );
115518659a9cSAndrey Smetanin 
115618659a9cSAndrey Smetanin /*
115718659a9cSAndrey Smetanin  * Tracepoint for kvm_hv_synic_send_eoi.
115818659a9cSAndrey Smetanin  */
115918659a9cSAndrey Smetanin TRACE_EVENT(kvm_hv_synic_send_eoi,
116018659a9cSAndrey Smetanin 	TP_PROTO(int vcpu_id, int vector),
116118659a9cSAndrey Smetanin 	TP_ARGS(vcpu_id, vector),
116218659a9cSAndrey Smetanin 
116318659a9cSAndrey Smetanin 	TP_STRUCT__entry(
116418659a9cSAndrey Smetanin 		__field(int, vcpu_id)
116518659a9cSAndrey Smetanin 		__field(u32, sint)
116618659a9cSAndrey Smetanin 		__field(int, vector)
116718659a9cSAndrey Smetanin 		__field(int, ret)
116818659a9cSAndrey Smetanin 	),
116918659a9cSAndrey Smetanin 
117018659a9cSAndrey Smetanin 	TP_fast_assign(
117118659a9cSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
117218659a9cSAndrey Smetanin 		__entry->vector	= vector;
117318659a9cSAndrey Smetanin 	),
117418659a9cSAndrey Smetanin 
117518659a9cSAndrey Smetanin 	TP_printk("vcpu_id %d vector %d", __entry->vcpu_id, __entry->vector)
117618659a9cSAndrey Smetanin );
117718659a9cSAndrey Smetanin 
117818659a9cSAndrey Smetanin /*
117918659a9cSAndrey Smetanin  * Tracepoint for synic_set_msr.
118018659a9cSAndrey Smetanin  */
118118659a9cSAndrey Smetanin TRACE_EVENT(kvm_hv_synic_set_msr,
118218659a9cSAndrey Smetanin 	TP_PROTO(int vcpu_id, u32 msr, u64 data, bool host),
118318659a9cSAndrey Smetanin 	TP_ARGS(vcpu_id, msr, data, host),
118418659a9cSAndrey Smetanin 
118518659a9cSAndrey Smetanin 	TP_STRUCT__entry(
118618659a9cSAndrey Smetanin 		__field(int, vcpu_id)
118718659a9cSAndrey Smetanin 		__field(u32, msr)
118818659a9cSAndrey Smetanin 		__field(u64, data)
118918659a9cSAndrey Smetanin 		__field(bool, host)
119018659a9cSAndrey Smetanin 	),
119118659a9cSAndrey Smetanin 
119218659a9cSAndrey Smetanin 	TP_fast_assign(
119318659a9cSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
119418659a9cSAndrey Smetanin 		__entry->msr = msr;
119518659a9cSAndrey Smetanin 		__entry->data = data;
119618659a9cSAndrey Smetanin 		__entry->host = host
119718659a9cSAndrey Smetanin 	),
119818659a9cSAndrey Smetanin 
119918659a9cSAndrey Smetanin 	TP_printk("vcpu_id %d msr 0x%x data 0x%llx host %d",
120018659a9cSAndrey Smetanin 		  __entry->vcpu_id, __entry->msr, __entry->data, __entry->host)
120118659a9cSAndrey Smetanin );
120218659a9cSAndrey Smetanin 
1203ac3e5fcaSAndrey Smetanin /*
1204ac3e5fcaSAndrey Smetanin  * Tracepoint for stimer_set_config.
1205ac3e5fcaSAndrey Smetanin  */
1206ac3e5fcaSAndrey Smetanin TRACE_EVENT(kvm_hv_stimer_set_config,
1207ac3e5fcaSAndrey Smetanin 	TP_PROTO(int vcpu_id, int timer_index, u64 config, bool host),
1208ac3e5fcaSAndrey Smetanin 	TP_ARGS(vcpu_id, timer_index, config, host),
1209ac3e5fcaSAndrey Smetanin 
1210ac3e5fcaSAndrey Smetanin 	TP_STRUCT__entry(
1211ac3e5fcaSAndrey Smetanin 		__field(int, vcpu_id)
1212ac3e5fcaSAndrey Smetanin 		__field(int, timer_index)
1213ac3e5fcaSAndrey Smetanin 		__field(u64, config)
1214ac3e5fcaSAndrey Smetanin 		__field(bool, host)
1215ac3e5fcaSAndrey Smetanin 	),
1216ac3e5fcaSAndrey Smetanin 
1217ac3e5fcaSAndrey Smetanin 	TP_fast_assign(
1218ac3e5fcaSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
1219ac3e5fcaSAndrey Smetanin 		__entry->timer_index = timer_index;
1220ac3e5fcaSAndrey Smetanin 		__entry->config = config;
1221ac3e5fcaSAndrey Smetanin 		__entry->host = host;
1222ac3e5fcaSAndrey Smetanin 	),
1223ac3e5fcaSAndrey Smetanin 
1224ac3e5fcaSAndrey Smetanin 	TP_printk("vcpu_id %d timer %d config 0x%llx host %d",
1225ac3e5fcaSAndrey Smetanin 		  __entry->vcpu_id, __entry->timer_index, __entry->config,
1226ac3e5fcaSAndrey Smetanin 		  __entry->host)
1227ac3e5fcaSAndrey Smetanin );
1228ac3e5fcaSAndrey Smetanin 
1229ac3e5fcaSAndrey Smetanin /*
1230ac3e5fcaSAndrey Smetanin  * Tracepoint for stimer_set_count.
1231ac3e5fcaSAndrey Smetanin  */
1232ac3e5fcaSAndrey Smetanin TRACE_EVENT(kvm_hv_stimer_set_count,
1233ac3e5fcaSAndrey Smetanin 	TP_PROTO(int vcpu_id, int timer_index, u64 count, bool host),
1234ac3e5fcaSAndrey Smetanin 	TP_ARGS(vcpu_id, timer_index, count, host),
1235ac3e5fcaSAndrey Smetanin 
1236ac3e5fcaSAndrey Smetanin 	TP_STRUCT__entry(
1237ac3e5fcaSAndrey Smetanin 		__field(int, vcpu_id)
1238ac3e5fcaSAndrey Smetanin 		__field(int, timer_index)
1239ac3e5fcaSAndrey Smetanin 		__field(u64, count)
1240ac3e5fcaSAndrey Smetanin 		__field(bool, host)
1241ac3e5fcaSAndrey Smetanin 	),
1242ac3e5fcaSAndrey Smetanin 
1243ac3e5fcaSAndrey Smetanin 	TP_fast_assign(
1244ac3e5fcaSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
1245ac3e5fcaSAndrey Smetanin 		__entry->timer_index = timer_index;
1246ac3e5fcaSAndrey Smetanin 		__entry->count = count;
1247ac3e5fcaSAndrey Smetanin 		__entry->host = host;
1248ac3e5fcaSAndrey Smetanin 	),
1249ac3e5fcaSAndrey Smetanin 
1250ac3e5fcaSAndrey Smetanin 	TP_printk("vcpu_id %d timer %d count %llu host %d",
1251ac3e5fcaSAndrey Smetanin 		  __entry->vcpu_id, __entry->timer_index, __entry->count,
1252ac3e5fcaSAndrey Smetanin 		  __entry->host)
1253ac3e5fcaSAndrey Smetanin );
1254ac3e5fcaSAndrey Smetanin 
1255ac3e5fcaSAndrey Smetanin /*
1256ac3e5fcaSAndrey Smetanin  * Tracepoint for stimer_start(periodic timer case).
1257ac3e5fcaSAndrey Smetanin  */
1258ac3e5fcaSAndrey Smetanin TRACE_EVENT(kvm_hv_stimer_start_periodic,
1259ac3e5fcaSAndrey Smetanin 	TP_PROTO(int vcpu_id, int timer_index, u64 time_now, u64 exp_time),
1260ac3e5fcaSAndrey Smetanin 	TP_ARGS(vcpu_id, timer_index, time_now, exp_time),
1261ac3e5fcaSAndrey Smetanin 
1262ac3e5fcaSAndrey Smetanin 	TP_STRUCT__entry(
1263ac3e5fcaSAndrey Smetanin 		__field(int, vcpu_id)
1264ac3e5fcaSAndrey Smetanin 		__field(int, timer_index)
1265ac3e5fcaSAndrey Smetanin 		__field(u64, time_now)
1266ac3e5fcaSAndrey Smetanin 		__field(u64, exp_time)
1267ac3e5fcaSAndrey Smetanin 	),
1268ac3e5fcaSAndrey Smetanin 
1269ac3e5fcaSAndrey Smetanin 	TP_fast_assign(
1270ac3e5fcaSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
1271ac3e5fcaSAndrey Smetanin 		__entry->timer_index = timer_index;
1272ac3e5fcaSAndrey Smetanin 		__entry->time_now = time_now;
1273ac3e5fcaSAndrey Smetanin 		__entry->exp_time = exp_time;
1274ac3e5fcaSAndrey Smetanin 	),
1275ac3e5fcaSAndrey Smetanin 
1276ac3e5fcaSAndrey Smetanin 	TP_printk("vcpu_id %d timer %d time_now %llu exp_time %llu",
1277ac3e5fcaSAndrey Smetanin 		  __entry->vcpu_id, __entry->timer_index, __entry->time_now,
1278ac3e5fcaSAndrey Smetanin 		  __entry->exp_time)
1279ac3e5fcaSAndrey Smetanin );
1280ac3e5fcaSAndrey Smetanin 
1281ac3e5fcaSAndrey Smetanin /*
1282ac3e5fcaSAndrey Smetanin  * Tracepoint for stimer_start(one-shot timer case).
1283ac3e5fcaSAndrey Smetanin  */
1284ac3e5fcaSAndrey Smetanin TRACE_EVENT(kvm_hv_stimer_start_one_shot,
1285ac3e5fcaSAndrey Smetanin 	TP_PROTO(int vcpu_id, int timer_index, u64 time_now, u64 count),
1286ac3e5fcaSAndrey Smetanin 	TP_ARGS(vcpu_id, timer_index, time_now, count),
1287ac3e5fcaSAndrey Smetanin 
1288ac3e5fcaSAndrey Smetanin 	TP_STRUCT__entry(
1289ac3e5fcaSAndrey Smetanin 		__field(int, vcpu_id)
1290ac3e5fcaSAndrey Smetanin 		__field(int, timer_index)
1291ac3e5fcaSAndrey Smetanin 		__field(u64, time_now)
1292ac3e5fcaSAndrey Smetanin 		__field(u64, count)
1293ac3e5fcaSAndrey Smetanin 	),
1294ac3e5fcaSAndrey Smetanin 
1295ac3e5fcaSAndrey Smetanin 	TP_fast_assign(
1296ac3e5fcaSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
1297ac3e5fcaSAndrey Smetanin 		__entry->timer_index = timer_index;
1298ac3e5fcaSAndrey Smetanin 		__entry->time_now = time_now;
1299ac3e5fcaSAndrey Smetanin 		__entry->count = count;
1300ac3e5fcaSAndrey Smetanin 	),
1301ac3e5fcaSAndrey Smetanin 
1302ac3e5fcaSAndrey Smetanin 	TP_printk("vcpu_id %d timer %d time_now %llu count %llu",
1303ac3e5fcaSAndrey Smetanin 		  __entry->vcpu_id, __entry->timer_index, __entry->time_now,
1304ac3e5fcaSAndrey Smetanin 		  __entry->count)
1305ac3e5fcaSAndrey Smetanin );
1306ac3e5fcaSAndrey Smetanin 
1307ac3e5fcaSAndrey Smetanin /*
1308ac3e5fcaSAndrey Smetanin  * Tracepoint for stimer_timer_callback.
1309ac3e5fcaSAndrey Smetanin  */
1310ac3e5fcaSAndrey Smetanin TRACE_EVENT(kvm_hv_stimer_callback,
1311ac3e5fcaSAndrey Smetanin 	TP_PROTO(int vcpu_id, int timer_index),
1312ac3e5fcaSAndrey Smetanin 	TP_ARGS(vcpu_id, timer_index),
1313ac3e5fcaSAndrey Smetanin 
1314ac3e5fcaSAndrey Smetanin 	TP_STRUCT__entry(
1315ac3e5fcaSAndrey Smetanin 		__field(int, vcpu_id)
1316ac3e5fcaSAndrey Smetanin 		__field(int, timer_index)
1317ac3e5fcaSAndrey Smetanin 	),
1318ac3e5fcaSAndrey Smetanin 
1319ac3e5fcaSAndrey Smetanin 	TP_fast_assign(
1320ac3e5fcaSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
1321ac3e5fcaSAndrey Smetanin 		__entry->timer_index = timer_index;
1322ac3e5fcaSAndrey Smetanin 	),
1323ac3e5fcaSAndrey Smetanin 
1324ac3e5fcaSAndrey Smetanin 	TP_printk("vcpu_id %d timer %d",
1325ac3e5fcaSAndrey Smetanin 		  __entry->vcpu_id, __entry->timer_index)
1326ac3e5fcaSAndrey Smetanin );
1327ac3e5fcaSAndrey Smetanin 
1328ac3e5fcaSAndrey Smetanin /*
1329ac3e5fcaSAndrey Smetanin  * Tracepoint for stimer_expiration.
1330ac3e5fcaSAndrey Smetanin  */
1331ac3e5fcaSAndrey Smetanin TRACE_EVENT(kvm_hv_stimer_expiration,
13328644f771SVitaly Kuznetsov 	TP_PROTO(int vcpu_id, int timer_index, int direct, int msg_send_result),
13338644f771SVitaly Kuznetsov 	TP_ARGS(vcpu_id, timer_index, direct, msg_send_result),
1334ac3e5fcaSAndrey Smetanin 
1335ac3e5fcaSAndrey Smetanin 	TP_STRUCT__entry(
1336ac3e5fcaSAndrey Smetanin 		__field(int, vcpu_id)
1337ac3e5fcaSAndrey Smetanin 		__field(int, timer_index)
13388644f771SVitaly Kuznetsov 		__field(int, direct)
1339ac3e5fcaSAndrey Smetanin 		__field(int, msg_send_result)
1340ac3e5fcaSAndrey Smetanin 	),
1341ac3e5fcaSAndrey Smetanin 
1342ac3e5fcaSAndrey Smetanin 	TP_fast_assign(
1343ac3e5fcaSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
1344ac3e5fcaSAndrey Smetanin 		__entry->timer_index = timer_index;
13458644f771SVitaly Kuznetsov 		__entry->direct = direct;
1346ac3e5fcaSAndrey Smetanin 		__entry->msg_send_result = msg_send_result;
1347ac3e5fcaSAndrey Smetanin 	),
1348ac3e5fcaSAndrey Smetanin 
13498644f771SVitaly Kuznetsov 	TP_printk("vcpu_id %d timer %d direct %d send result %d",
1350ac3e5fcaSAndrey Smetanin 		  __entry->vcpu_id, __entry->timer_index,
13518644f771SVitaly Kuznetsov 		  __entry->direct, __entry->msg_send_result)
1352ac3e5fcaSAndrey Smetanin );
1353ac3e5fcaSAndrey Smetanin 
1354ac3e5fcaSAndrey Smetanin /*
1355ac3e5fcaSAndrey Smetanin  * Tracepoint for stimer_cleanup.
1356ac3e5fcaSAndrey Smetanin  */
1357ac3e5fcaSAndrey Smetanin TRACE_EVENT(kvm_hv_stimer_cleanup,
1358ac3e5fcaSAndrey Smetanin 	TP_PROTO(int vcpu_id, int timer_index),
1359ac3e5fcaSAndrey Smetanin 	TP_ARGS(vcpu_id, timer_index),
1360ac3e5fcaSAndrey Smetanin 
1361ac3e5fcaSAndrey Smetanin 	TP_STRUCT__entry(
1362ac3e5fcaSAndrey Smetanin 		__field(int, vcpu_id)
1363ac3e5fcaSAndrey Smetanin 		__field(int, timer_index)
1364ac3e5fcaSAndrey Smetanin 	),
1365ac3e5fcaSAndrey Smetanin 
1366ac3e5fcaSAndrey Smetanin 	TP_fast_assign(
1367ac3e5fcaSAndrey Smetanin 		__entry->vcpu_id = vcpu_id;
1368ac3e5fcaSAndrey Smetanin 		__entry->timer_index = timer_index;
1369ac3e5fcaSAndrey Smetanin 	),
1370ac3e5fcaSAndrey Smetanin 
1371ac3e5fcaSAndrey Smetanin 	TP_printk("vcpu_id %d timer %d",
1372ac3e5fcaSAndrey Smetanin 		  __entry->vcpu_id, __entry->timer_index)
1373ac3e5fcaSAndrey Smetanin );
1374ac3e5fcaSAndrey Smetanin 
13754f4c4a3eSSean Christopherson TRACE_EVENT(kvm_apicv_inhibit_changed,
13764f4c4a3eSSean Christopherson 	    TP_PROTO(int reason, bool set, unsigned long inhibits),
13774f4c4a3eSSean Christopherson 	    TP_ARGS(reason, set, inhibits),
137824bbf74cSSuravee Suthikulpanit 
137924bbf74cSSuravee Suthikulpanit 	TP_STRUCT__entry(
13807491b7b2SSean Christopherson 		__field(int, reason)
13814f4c4a3eSSean Christopherson 		__field(bool, set)
13824f4c4a3eSSean Christopherson 		__field(unsigned long, inhibits)
138324bbf74cSSuravee Suthikulpanit 	),
138424bbf74cSSuravee Suthikulpanit 
138524bbf74cSSuravee Suthikulpanit 	TP_fast_assign(
13867491b7b2SSean Christopherson 		__entry->reason = reason;
13874f4c4a3eSSean Christopherson 		__entry->set = set;
13884f4c4a3eSSean Christopherson 		__entry->inhibits = inhibits;
138924bbf74cSSuravee Suthikulpanit 	),
139024bbf74cSSuravee Suthikulpanit 
13914f4c4a3eSSean Christopherson 	TP_printk("%s reason=%u, inhibits=0x%lx",
13924f4c4a3eSSean Christopherson 		  __entry->set ? "set" : "cleared",
13934f4c4a3eSSean Christopherson 		  __entry->reason, __entry->inhibits)
139424bbf74cSSuravee Suthikulpanit );
139524bbf74cSSuravee Suthikulpanit 
13968e819d75SMaxim Levitsky TRACE_EVENT(kvm_apicv_accept_irq,
13978e819d75SMaxim Levitsky 	    TP_PROTO(__u32 apicid, __u16 dm, __u16 tm, __u8 vec),
13988e819d75SMaxim Levitsky 	    TP_ARGS(apicid, dm, tm, vec),
13998e819d75SMaxim Levitsky 
14008e819d75SMaxim Levitsky 	TP_STRUCT__entry(
14018e819d75SMaxim Levitsky 		__field(	__u32,		apicid		)
14028e819d75SMaxim Levitsky 		__field(	__u16,		dm		)
14038e819d75SMaxim Levitsky 		__field(	__u16,		tm		)
14048e819d75SMaxim Levitsky 		__field(	__u8,		vec		)
14058e819d75SMaxim Levitsky 	),
14068e819d75SMaxim Levitsky 
14078e819d75SMaxim Levitsky 	TP_fast_assign(
14088e819d75SMaxim Levitsky 		__entry->apicid		= apicid;
14098e819d75SMaxim Levitsky 		__entry->dm		= dm;
14108e819d75SMaxim Levitsky 		__entry->tm		= tm;
14118e819d75SMaxim Levitsky 		__entry->vec		= vec;
14128e819d75SMaxim Levitsky 	),
14138e819d75SMaxim Levitsky 
14148e819d75SMaxim Levitsky 	TP_printk("apicid %x vec %u (%s|%s)",
14158e819d75SMaxim Levitsky 		  __entry->apicid, __entry->vec,
14168e819d75SMaxim Levitsky 		  __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
14178e819d75SMaxim Levitsky 		  __entry->tm ? "level" : "edge")
14188e819d75SMaxim Levitsky );
14198e819d75SMaxim Levitsky 
142018f40c53SSuravee Suthikulpanit /*
142118f40c53SSuravee Suthikulpanit  * Tracepoint for AMD AVIC
142218f40c53SSuravee Suthikulpanit  */
142318f40c53SSuravee Suthikulpanit TRACE_EVENT(kvm_avic_incomplete_ipi,
142418f40c53SSuravee Suthikulpanit 	    TP_PROTO(u32 vcpu, u32 icrh, u32 icrl, u32 id, u32 index),
142518f40c53SSuravee Suthikulpanit 	    TP_ARGS(vcpu, icrh, icrl, id, index),
142618f40c53SSuravee Suthikulpanit 
142718f40c53SSuravee Suthikulpanit 	TP_STRUCT__entry(
142818f40c53SSuravee Suthikulpanit 		__field(u32, vcpu)
142918f40c53SSuravee Suthikulpanit 		__field(u32, icrh)
143018f40c53SSuravee Suthikulpanit 		__field(u32, icrl)
143118f40c53SSuravee Suthikulpanit 		__field(u32, id)
143218f40c53SSuravee Suthikulpanit 		__field(u32, index)
143318f40c53SSuravee Suthikulpanit 	),
143418f40c53SSuravee Suthikulpanit 
143518f40c53SSuravee Suthikulpanit 	TP_fast_assign(
143618f40c53SSuravee Suthikulpanit 		__entry->vcpu = vcpu;
143718f40c53SSuravee Suthikulpanit 		__entry->icrh = icrh;
143818f40c53SSuravee Suthikulpanit 		__entry->icrl = icrl;
143918f40c53SSuravee Suthikulpanit 		__entry->id = id;
144018f40c53SSuravee Suthikulpanit 		__entry->index = index;
144118f40c53SSuravee Suthikulpanit 	),
144218f40c53SSuravee Suthikulpanit 
144313a7e370SPeter Xu 	TP_printk("vcpu=%u, icrh:icrl=%#010x:%08x, id=%u, index=%u",
144418f40c53SSuravee Suthikulpanit 		  __entry->vcpu, __entry->icrh, __entry->icrl,
144518f40c53SSuravee Suthikulpanit 		  __entry->id, __entry->index)
144618f40c53SSuravee Suthikulpanit );
144718f40c53SSuravee Suthikulpanit 
144818f40c53SSuravee Suthikulpanit TRACE_EVENT(kvm_avic_unaccelerated_access,
144918f40c53SSuravee Suthikulpanit 	    TP_PROTO(u32 vcpu, u32 offset, bool ft, bool rw, u32 vec),
145018f40c53SSuravee Suthikulpanit 	    TP_ARGS(vcpu, offset, ft, rw, vec),
145118f40c53SSuravee Suthikulpanit 
145218f40c53SSuravee Suthikulpanit 	TP_STRUCT__entry(
145318f40c53SSuravee Suthikulpanit 		__field(u32, vcpu)
145418f40c53SSuravee Suthikulpanit 		__field(u32, offset)
145518f40c53SSuravee Suthikulpanit 		__field(bool, ft)
145618f40c53SSuravee Suthikulpanit 		__field(bool, rw)
145718f40c53SSuravee Suthikulpanit 		__field(u32, vec)
145818f40c53SSuravee Suthikulpanit 	),
145918f40c53SSuravee Suthikulpanit 
146018f40c53SSuravee Suthikulpanit 	TP_fast_assign(
146118f40c53SSuravee Suthikulpanit 		__entry->vcpu = vcpu;
146218f40c53SSuravee Suthikulpanit 		__entry->offset = offset;
146318f40c53SSuravee Suthikulpanit 		__entry->ft = ft;
146418f40c53SSuravee Suthikulpanit 		__entry->rw = rw;
146518f40c53SSuravee Suthikulpanit 		__entry->vec = vec;
146618f40c53SSuravee Suthikulpanit 	),
146718f40c53SSuravee Suthikulpanit 
146813a7e370SPeter Xu 	TP_printk("vcpu=%u, offset=%#x(%s), %s, %s, vec=%#x",
146918f40c53SSuravee Suthikulpanit 		  __entry->vcpu,
147018f40c53SSuravee Suthikulpanit 		  __entry->offset,
147118f40c53SSuravee Suthikulpanit 		  __print_symbolic(__entry->offset, kvm_trace_symbol_apic),
147218f40c53SSuravee Suthikulpanit 		  __entry->ft ? "trap" : "fault",
147318f40c53SSuravee Suthikulpanit 		  __entry->rw ? "write" : "read",
147418f40c53SSuravee Suthikulpanit 		  __entry->vec)
147518f40c53SSuravee Suthikulpanit );
147618f40c53SSuravee Suthikulpanit 
1477ab56f8e6SSuravee Suthikulpanit TRACE_EVENT(kvm_avic_ga_log,
1478ab56f8e6SSuravee Suthikulpanit 	    TP_PROTO(u32 vmid, u32 vcpuid),
1479ab56f8e6SSuravee Suthikulpanit 	    TP_ARGS(vmid, vcpuid),
1480ab56f8e6SSuravee Suthikulpanit 
1481ab56f8e6SSuravee Suthikulpanit 	TP_STRUCT__entry(
1482ab56f8e6SSuravee Suthikulpanit 		__field(u32, vmid)
1483ab56f8e6SSuravee Suthikulpanit 		__field(u32, vcpuid)
1484ab56f8e6SSuravee Suthikulpanit 	),
1485ab56f8e6SSuravee Suthikulpanit 
1486ab56f8e6SSuravee Suthikulpanit 	TP_fast_assign(
1487ab56f8e6SSuravee Suthikulpanit 		__entry->vmid = vmid;
1488ab56f8e6SSuravee Suthikulpanit 		__entry->vcpuid = vcpuid;
1489ab56f8e6SSuravee Suthikulpanit 	),
1490ab56f8e6SSuravee Suthikulpanit 
1491ab56f8e6SSuravee Suthikulpanit 	TP_printk("vmid=%u, vcpuid=%u",
1492ab56f8e6SSuravee Suthikulpanit 		  __entry->vmid, __entry->vcpuid)
1493ab56f8e6SSuravee Suthikulpanit );
1494ab56f8e6SSuravee Suthikulpanit 
14959f084f7cSSuravee Suthikulpanit TRACE_EVENT(kvm_avic_kick_vcpu_slowpath,
14969f084f7cSSuravee Suthikulpanit 	    TP_PROTO(u32 icrh, u32 icrl, u32 index),
14979f084f7cSSuravee Suthikulpanit 	    TP_ARGS(icrh, icrl, index),
14989f084f7cSSuravee Suthikulpanit 
14999f084f7cSSuravee Suthikulpanit 	TP_STRUCT__entry(
15009f084f7cSSuravee Suthikulpanit 		__field(u32, icrh)
15019f084f7cSSuravee Suthikulpanit 		__field(u32, icrl)
15029f084f7cSSuravee Suthikulpanit 		__field(u32, index)
15039f084f7cSSuravee Suthikulpanit 	),
15049f084f7cSSuravee Suthikulpanit 
15059f084f7cSSuravee Suthikulpanit 	TP_fast_assign(
15069f084f7cSSuravee Suthikulpanit 		__entry->icrh = icrh;
15079f084f7cSSuravee Suthikulpanit 		__entry->icrl = icrl;
15089f084f7cSSuravee Suthikulpanit 		__entry->index = index;
15099f084f7cSSuravee Suthikulpanit 	),
15109f084f7cSSuravee Suthikulpanit 
15119f084f7cSSuravee Suthikulpanit 	TP_printk("icrh:icrl=%#08x:%08x, index=%u",
15129f084f7cSSuravee Suthikulpanit 		  __entry->icrh, __entry->icrl, __entry->index)
15139f084f7cSSuravee Suthikulpanit );
15149f084f7cSSuravee Suthikulpanit 
151539b6b8c3SSuravee Suthikulpanit TRACE_EVENT(kvm_avic_doorbell,
151639b6b8c3SSuravee Suthikulpanit 	    TP_PROTO(u32 vcpuid, u32 apicid),
151739b6b8c3SSuravee Suthikulpanit 	    TP_ARGS(vcpuid, apicid),
151839b6b8c3SSuravee Suthikulpanit 
151939b6b8c3SSuravee Suthikulpanit 	TP_STRUCT__entry(
152039b6b8c3SSuravee Suthikulpanit 		__field(u32, vcpuid)
152139b6b8c3SSuravee Suthikulpanit 		__field(u32, apicid)
152239b6b8c3SSuravee Suthikulpanit 	),
152339b6b8c3SSuravee Suthikulpanit 
152439b6b8c3SSuravee Suthikulpanit 	TP_fast_assign(
152539b6b8c3SSuravee Suthikulpanit 		__entry->vcpuid = vcpuid;
152639b6b8c3SSuravee Suthikulpanit 		__entry->apicid = apicid;
152739b6b8c3SSuravee Suthikulpanit 	),
152839b6b8c3SSuravee Suthikulpanit 
152939b6b8c3SSuravee Suthikulpanit 	TP_printk("vcpuid=%u, apicid=%u",
153039b6b8c3SSuravee Suthikulpanit 		  __entry->vcpuid, __entry->apicid)
153139b6b8c3SSuravee Suthikulpanit );
153239b6b8c3SSuravee Suthikulpanit 
1533ce7a058aSYunhong Jiang TRACE_EVENT(kvm_hv_timer_state,
1534ce7a058aSYunhong Jiang 		TP_PROTO(unsigned int vcpu_id, unsigned int hv_timer_in_use),
1535ce7a058aSYunhong Jiang 		TP_ARGS(vcpu_id, hv_timer_in_use),
1536ce7a058aSYunhong Jiang 		TP_STRUCT__entry(
1537ce7a058aSYunhong Jiang 			__field(unsigned int, vcpu_id)
1538ce7a058aSYunhong Jiang 			__field(unsigned int, hv_timer_in_use)
1539ce7a058aSYunhong Jiang 			),
1540ce7a058aSYunhong Jiang 		TP_fast_assign(
1541ce7a058aSYunhong Jiang 			__entry->vcpu_id = vcpu_id;
1542ce7a058aSYunhong Jiang 			__entry->hv_timer_in_use = hv_timer_in_use;
1543ce7a058aSYunhong Jiang 			),
15447be373b6SWanpeng Li 		TP_printk("vcpu_id %x hv_timer %x",
1545ce7a058aSYunhong Jiang 			__entry->vcpu_id,
1546ce7a058aSYunhong Jiang 			__entry->hv_timer_in_use)
1547ce7a058aSYunhong Jiang );
1548e2f11f42SVitaly Kuznetsov 
1549e2f11f42SVitaly Kuznetsov /*
1550e2f11f42SVitaly Kuznetsov  * Tracepoint for kvm_hv_flush_tlb.
1551e2f11f42SVitaly Kuznetsov  */
1552e2f11f42SVitaly Kuznetsov TRACE_EVENT(kvm_hv_flush_tlb,
1553c58a318fSVitaly Kuznetsov 	TP_PROTO(u64 processor_mask, u64 address_space, u64 flags, bool guest_mode),
1554c58a318fSVitaly Kuznetsov 	TP_ARGS(processor_mask, address_space, flags, guest_mode),
1555e2f11f42SVitaly Kuznetsov 
1556e2f11f42SVitaly Kuznetsov 	TP_STRUCT__entry(
1557e2f11f42SVitaly Kuznetsov 		__field(u64, processor_mask)
1558e2f11f42SVitaly Kuznetsov 		__field(u64, address_space)
1559e2f11f42SVitaly Kuznetsov 		__field(u64, flags)
1560c58a318fSVitaly Kuznetsov 		__field(bool, guest_mode)
1561e2f11f42SVitaly Kuznetsov 	),
1562e2f11f42SVitaly Kuznetsov 
1563e2f11f42SVitaly Kuznetsov 	TP_fast_assign(
1564e2f11f42SVitaly Kuznetsov 		__entry->processor_mask = processor_mask;
1565e2f11f42SVitaly Kuznetsov 		__entry->address_space = address_space;
1566e2f11f42SVitaly Kuznetsov 		__entry->flags = flags;
1567c58a318fSVitaly Kuznetsov 		__entry->guest_mode = guest_mode;
1568e2f11f42SVitaly Kuznetsov 	),
1569e2f11f42SVitaly Kuznetsov 
1570c58a318fSVitaly Kuznetsov 	TP_printk("processor_mask 0x%llx address_space 0x%llx flags 0x%llx %s",
1571e2f11f42SVitaly Kuznetsov 		  __entry->processor_mask, __entry->address_space,
1572c58a318fSVitaly Kuznetsov 		  __entry->flags, __entry->guest_mode ? "(L2)" : "")
1573e2f11f42SVitaly Kuznetsov );
1574c7012676SVitaly Kuznetsov 
1575c7012676SVitaly Kuznetsov /*
1576c7012676SVitaly Kuznetsov  * Tracepoint for kvm_hv_flush_tlb_ex.
1577c7012676SVitaly Kuznetsov  */
1578c7012676SVitaly Kuznetsov TRACE_EVENT(kvm_hv_flush_tlb_ex,
1579c58a318fSVitaly Kuznetsov 	TP_PROTO(u64 valid_bank_mask, u64 format, u64 address_space, u64 flags, bool guest_mode),
1580c58a318fSVitaly Kuznetsov 	TP_ARGS(valid_bank_mask, format, address_space, flags, guest_mode),
1581c7012676SVitaly Kuznetsov 
1582c7012676SVitaly Kuznetsov 	TP_STRUCT__entry(
1583c7012676SVitaly Kuznetsov 		__field(u64, valid_bank_mask)
1584c7012676SVitaly Kuznetsov 		__field(u64, format)
1585c7012676SVitaly Kuznetsov 		__field(u64, address_space)
1586c7012676SVitaly Kuznetsov 		__field(u64, flags)
1587c58a318fSVitaly Kuznetsov 		__field(bool, guest_mode)
1588c7012676SVitaly Kuznetsov 	),
1589c7012676SVitaly Kuznetsov 
1590c7012676SVitaly Kuznetsov 	TP_fast_assign(
1591c7012676SVitaly Kuznetsov 		__entry->valid_bank_mask = valid_bank_mask;
1592c7012676SVitaly Kuznetsov 		__entry->format = format;
1593c7012676SVitaly Kuznetsov 		__entry->address_space = address_space;
1594c7012676SVitaly Kuznetsov 		__entry->flags = flags;
1595c58a318fSVitaly Kuznetsov 		__entry->guest_mode = guest_mode;
1596c7012676SVitaly Kuznetsov 	),
1597c7012676SVitaly Kuznetsov 
1598c7012676SVitaly Kuznetsov 	TP_printk("valid_bank_mask 0x%llx format 0x%llx "
1599c58a318fSVitaly Kuznetsov 		  "address_space 0x%llx flags 0x%llx %s",
1600c7012676SVitaly Kuznetsov 		  __entry->valid_bank_mask, __entry->format,
1601c58a318fSVitaly Kuznetsov 		  __entry->address_space, __entry->flags,
1602c58a318fSVitaly Kuznetsov 		  __entry->guest_mode ? "(L2)" : "")
1603c7012676SVitaly Kuznetsov );
1604214ff83dSVitaly Kuznetsov 
1605214ff83dSVitaly Kuznetsov /*
1606214ff83dSVitaly Kuznetsov  * Tracepoints for kvm_hv_send_ipi.
1607214ff83dSVitaly Kuznetsov  */
1608214ff83dSVitaly Kuznetsov TRACE_EVENT(kvm_hv_send_ipi,
1609214ff83dSVitaly Kuznetsov 	TP_PROTO(u32 vector, u64 processor_mask),
1610214ff83dSVitaly Kuznetsov 	TP_ARGS(vector, processor_mask),
1611214ff83dSVitaly Kuznetsov 
1612214ff83dSVitaly Kuznetsov 	TP_STRUCT__entry(
1613214ff83dSVitaly Kuznetsov 		__field(u32, vector)
1614214ff83dSVitaly Kuznetsov 		__field(u64, processor_mask)
1615214ff83dSVitaly Kuznetsov 	),
1616214ff83dSVitaly Kuznetsov 
1617214ff83dSVitaly Kuznetsov 	TP_fast_assign(
1618214ff83dSVitaly Kuznetsov 		__entry->vector = vector;
1619214ff83dSVitaly Kuznetsov 		__entry->processor_mask = processor_mask;
1620214ff83dSVitaly Kuznetsov 	),
1621214ff83dSVitaly Kuznetsov 
1622214ff83dSVitaly Kuznetsov 	TP_printk("vector %x processor_mask 0x%llx",
1623214ff83dSVitaly Kuznetsov 		  __entry->vector, __entry->processor_mask)
1624214ff83dSVitaly Kuznetsov );
1625214ff83dSVitaly Kuznetsov 
1626214ff83dSVitaly Kuznetsov TRACE_EVENT(kvm_hv_send_ipi_ex,
1627214ff83dSVitaly Kuznetsov 	TP_PROTO(u32 vector, u64 format, u64 valid_bank_mask),
1628214ff83dSVitaly Kuznetsov 	TP_ARGS(vector, format, valid_bank_mask),
1629214ff83dSVitaly Kuznetsov 
1630214ff83dSVitaly Kuznetsov 	TP_STRUCT__entry(
1631214ff83dSVitaly Kuznetsov 		__field(u32, vector)
1632214ff83dSVitaly Kuznetsov 		__field(u64, format)
1633214ff83dSVitaly Kuznetsov 		__field(u64, valid_bank_mask)
1634214ff83dSVitaly Kuznetsov 	),
1635214ff83dSVitaly Kuznetsov 
1636214ff83dSVitaly Kuznetsov 	TP_fast_assign(
1637214ff83dSVitaly Kuznetsov 		__entry->vector = vector;
1638214ff83dSVitaly Kuznetsov 		__entry->format = format;
1639214ff83dSVitaly Kuznetsov 		__entry->valid_bank_mask = valid_bank_mask;
1640214ff83dSVitaly Kuznetsov 	),
1641214ff83dSVitaly Kuznetsov 
1642214ff83dSVitaly Kuznetsov 	TP_printk("vector %x format %llx valid_bank_mask 0x%llx",
1643214ff83dSVitaly Kuznetsov 		  __entry->vector, __entry->format,
1644214ff83dSVitaly Kuznetsov 		  __entry->valid_bank_mask)
1645214ff83dSVitaly Kuznetsov );
1646b382f44eSWanpeng Li 
1647b382f44eSWanpeng Li TRACE_EVENT(kvm_pv_tlb_flush,
1648b382f44eSWanpeng Li 	TP_PROTO(unsigned int vcpu_id, bool need_flush_tlb),
1649b382f44eSWanpeng Li 	TP_ARGS(vcpu_id, need_flush_tlb),
1650b382f44eSWanpeng Li 
1651b382f44eSWanpeng Li 	TP_STRUCT__entry(
1652b382f44eSWanpeng Li 		__field(	unsigned int,	vcpu_id		)
1653b382f44eSWanpeng Li 		__field(	bool,	need_flush_tlb		)
1654b382f44eSWanpeng Li 	),
1655b382f44eSWanpeng Li 
1656b382f44eSWanpeng Li 	TP_fast_assign(
1657b382f44eSWanpeng Li 		__entry->vcpu_id	= vcpu_id;
1658b382f44eSWanpeng Li 		__entry->need_flush_tlb = need_flush_tlb;
1659b382f44eSWanpeng Li 	),
1660b382f44eSWanpeng Li 
1661b382f44eSWanpeng Li 	TP_printk("vcpu %u need_flush_tlb %s", __entry->vcpu_id,
1662b382f44eSWanpeng Li 		__entry->need_flush_tlb ? "true" : "false")
1663b382f44eSWanpeng Li );
1664b382f44eSWanpeng Li 
16655497b955SSean Christopherson /*
16665497b955SSean Christopherson  * Tracepoint for failed nested VMX VM-Enter.
16675497b955SSean Christopherson  */
16685497b955SSean Christopherson TRACE_EVENT(kvm_nested_vmenter_failed,
1669380e0055SSean Christopherson 	TP_PROTO(const char *msg, u32 err),
1670380e0055SSean Christopherson 	TP_ARGS(msg, err),
16715497b955SSean Christopherson 
16725497b955SSean Christopherson 	TP_STRUCT__entry(
1673f31500b0SSean Christopherson 		__string(msg, msg)
1674380e0055SSean Christopherson 		__field(u32, err)
16755497b955SSean Christopherson 	),
16765497b955SSean Christopherson 
16775497b955SSean Christopherson 	TP_fast_assign(
1678f31500b0SSean Christopherson 		__assign_str(msg, msg);
1679380e0055SSean Christopherson 		__entry->err = err;
16805497b955SSean Christopherson 	),
16815497b955SSean Christopherson 
1682f31500b0SSean Christopherson 	TP_printk("%s%s", __get_str(msg), !__entry->err ? "" :
1683380e0055SSean Christopherson 		__print_symbolic(__entry->err, VMX_VMENTER_INSTRUCTION_ERRORS))
16845497b955SSean Christopherson );
16855497b955SSean Christopherson 
1686f97f5a56SJon Doron /*
1687f97f5a56SJon Doron  * Tracepoint for syndbg_set_msr.
1688f97f5a56SJon Doron  */
1689f97f5a56SJon Doron TRACE_EVENT(kvm_hv_syndbg_set_msr,
1690f97f5a56SJon Doron 	TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data),
1691f97f5a56SJon Doron 	TP_ARGS(vcpu_id, vp_index, msr, data),
1692f97f5a56SJon Doron 
1693f97f5a56SJon Doron 	TP_STRUCT__entry(
1694f97f5a56SJon Doron 		__field(int, vcpu_id)
1695f97f5a56SJon Doron 		__field(u32, vp_index)
1696f97f5a56SJon Doron 		__field(u32, msr)
1697f97f5a56SJon Doron 		__field(u64, data)
1698f97f5a56SJon Doron 	),
1699f97f5a56SJon Doron 
1700f97f5a56SJon Doron 	TP_fast_assign(
1701f97f5a56SJon Doron 		__entry->vcpu_id = vcpu_id;
1702f97f5a56SJon Doron 		__entry->vp_index = vp_index;
1703f97f5a56SJon Doron 		__entry->msr = msr;
1704f97f5a56SJon Doron 		__entry->data = data;
1705f97f5a56SJon Doron 	),
1706f97f5a56SJon Doron 
1707f97f5a56SJon Doron 	TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx",
1708f97f5a56SJon Doron 		  __entry->vcpu_id, __entry->vp_index, __entry->msr,
1709f97f5a56SJon Doron 		  __entry->data)
1710f97f5a56SJon Doron );
1711f97f5a56SJon Doron 
1712f97f5a56SJon Doron /*
1713f97f5a56SJon Doron  * Tracepoint for syndbg_get_msr.
1714f97f5a56SJon Doron  */
1715f97f5a56SJon Doron TRACE_EVENT(kvm_hv_syndbg_get_msr,
1716f97f5a56SJon Doron 	TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data),
1717f97f5a56SJon Doron 	TP_ARGS(vcpu_id, vp_index, msr, data),
1718f97f5a56SJon Doron 
1719f97f5a56SJon Doron 	TP_STRUCT__entry(
1720f97f5a56SJon Doron 		__field(int, vcpu_id)
1721f97f5a56SJon Doron 		__field(u32, vp_index)
1722f97f5a56SJon Doron 		__field(u32, msr)
1723f97f5a56SJon Doron 		__field(u64, data)
1724f97f5a56SJon Doron 	),
1725f97f5a56SJon Doron 
1726f97f5a56SJon Doron 	TP_fast_assign(
1727f97f5a56SJon Doron 		__entry->vcpu_id = vcpu_id;
1728f97f5a56SJon Doron 		__entry->vp_index = vp_index;
1729f97f5a56SJon Doron 		__entry->msr = msr;
1730f97f5a56SJon Doron 		__entry->data = data;
1731f97f5a56SJon Doron 	),
1732f97f5a56SJon Doron 
1733f97f5a56SJon Doron 	TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx",
1734f97f5a56SJon Doron 		  __entry->vcpu_id, __entry->vp_index, __entry->msr,
1735f97f5a56SJon Doron 		  __entry->data)
1736f97f5a56SJon Doron );
1737d523ab6bSTom Lendacky 
1738d523ab6bSTom Lendacky /*
1739d523ab6bSTom Lendacky  * Tracepoint for the start of VMGEXIT processing
1740d523ab6bSTom Lendacky  */
1741d523ab6bSTom Lendacky TRACE_EVENT(kvm_vmgexit_enter,
1742d523ab6bSTom Lendacky 	TP_PROTO(unsigned int vcpu_id, struct ghcb *ghcb),
1743d523ab6bSTom Lendacky 	TP_ARGS(vcpu_id, ghcb),
1744d523ab6bSTom Lendacky 
1745d523ab6bSTom Lendacky 	TP_STRUCT__entry(
1746d523ab6bSTom Lendacky 		__field(unsigned int, vcpu_id)
1747d523ab6bSTom Lendacky 		__field(u64, exit_reason)
1748d523ab6bSTom Lendacky 		__field(u64, info1)
1749d523ab6bSTom Lendacky 		__field(u64, info2)
1750d523ab6bSTom Lendacky 	),
1751d523ab6bSTom Lendacky 
1752d523ab6bSTom Lendacky 	TP_fast_assign(
1753d523ab6bSTom Lendacky 		__entry->vcpu_id     = vcpu_id;
1754d523ab6bSTom Lendacky 		__entry->exit_reason = ghcb->save.sw_exit_code;
1755d523ab6bSTom Lendacky 		__entry->info1       = ghcb->save.sw_exit_info_1;
1756d523ab6bSTom Lendacky 		__entry->info2       = ghcb->save.sw_exit_info_2;
1757d523ab6bSTom Lendacky 	),
1758d523ab6bSTom Lendacky 
1759d523ab6bSTom Lendacky 	TP_printk("vcpu %u, exit_reason %llx, exit_info1 %llx, exit_info2 %llx",
1760d523ab6bSTom Lendacky 		  __entry->vcpu_id, __entry->exit_reason,
1761d523ab6bSTom Lendacky 		  __entry->info1, __entry->info2)
1762d523ab6bSTom Lendacky );
1763d523ab6bSTom Lendacky 
1764d523ab6bSTom Lendacky /*
1765d523ab6bSTom Lendacky  * Tracepoint for the end of VMGEXIT processing
1766d523ab6bSTom Lendacky  */
1767d523ab6bSTom Lendacky TRACE_EVENT(kvm_vmgexit_exit,
1768d523ab6bSTom Lendacky 	TP_PROTO(unsigned int vcpu_id, struct ghcb *ghcb),
1769d523ab6bSTom Lendacky 	TP_ARGS(vcpu_id, ghcb),
1770d523ab6bSTom Lendacky 
1771d523ab6bSTom Lendacky 	TP_STRUCT__entry(
1772d523ab6bSTom Lendacky 		__field(unsigned int, vcpu_id)
1773d523ab6bSTom Lendacky 		__field(u64, exit_reason)
1774d523ab6bSTom Lendacky 		__field(u64, info1)
1775d523ab6bSTom Lendacky 		__field(u64, info2)
1776d523ab6bSTom Lendacky 	),
1777d523ab6bSTom Lendacky 
1778d523ab6bSTom Lendacky 	TP_fast_assign(
1779d523ab6bSTom Lendacky 		__entry->vcpu_id     = vcpu_id;
1780d523ab6bSTom Lendacky 		__entry->exit_reason = ghcb->save.sw_exit_code;
1781d523ab6bSTom Lendacky 		__entry->info1       = ghcb->save.sw_exit_info_1;
1782d523ab6bSTom Lendacky 		__entry->info2       = ghcb->save.sw_exit_info_2;
1783d523ab6bSTom Lendacky 	),
1784d523ab6bSTom Lendacky 
1785d523ab6bSTom Lendacky 	TP_printk("vcpu %u, exit_reason %llx, exit_info1 %llx, exit_info2 %llx",
1786d523ab6bSTom Lendacky 		  __entry->vcpu_id, __entry->exit_reason,
1787d523ab6bSTom Lendacky 		  __entry->info1, __entry->info2)
1788d523ab6bSTom Lendacky );
1789d523ab6bSTom Lendacky 
179059e38b58STom Lendacky /*
179159e38b58STom Lendacky  * Tracepoint for the start of VMGEXIT MSR procotol processing
179259e38b58STom Lendacky  */
179359e38b58STom Lendacky TRACE_EVENT(kvm_vmgexit_msr_protocol_enter,
179459e38b58STom Lendacky 	TP_PROTO(unsigned int vcpu_id, u64 ghcb_gpa),
179559e38b58STom Lendacky 	TP_ARGS(vcpu_id, ghcb_gpa),
179659e38b58STom Lendacky 
179759e38b58STom Lendacky 	TP_STRUCT__entry(
179859e38b58STom Lendacky 		__field(unsigned int, vcpu_id)
179959e38b58STom Lendacky 		__field(u64, ghcb_gpa)
180059e38b58STom Lendacky 	),
180159e38b58STom Lendacky 
180259e38b58STom Lendacky 	TP_fast_assign(
180359e38b58STom Lendacky 		__entry->vcpu_id  = vcpu_id;
180459e38b58STom Lendacky 		__entry->ghcb_gpa = ghcb_gpa;
180559e38b58STom Lendacky 	),
180659e38b58STom Lendacky 
180759e38b58STom Lendacky 	TP_printk("vcpu %u, ghcb_gpa %016llx",
180859e38b58STom Lendacky 		  __entry->vcpu_id, __entry->ghcb_gpa)
180959e38b58STom Lendacky );
181059e38b58STom Lendacky 
181159e38b58STom Lendacky /*
181259e38b58STom Lendacky  * Tracepoint for the end of VMGEXIT MSR procotol processing
181359e38b58STom Lendacky  */
181459e38b58STom Lendacky TRACE_EVENT(kvm_vmgexit_msr_protocol_exit,
181559e38b58STom Lendacky 	TP_PROTO(unsigned int vcpu_id, u64 ghcb_gpa, int result),
181659e38b58STom Lendacky 	TP_ARGS(vcpu_id, ghcb_gpa, result),
181759e38b58STom Lendacky 
181859e38b58STom Lendacky 	TP_STRUCT__entry(
181959e38b58STom Lendacky 		__field(unsigned int, vcpu_id)
182059e38b58STom Lendacky 		__field(u64, ghcb_gpa)
182159e38b58STom Lendacky 		__field(int, result)
182259e38b58STom Lendacky 	),
182359e38b58STom Lendacky 
182459e38b58STom Lendacky 	TP_fast_assign(
182559e38b58STom Lendacky 		__entry->vcpu_id  = vcpu_id;
182659e38b58STom Lendacky 		__entry->ghcb_gpa = ghcb_gpa;
182759e38b58STom Lendacky 		__entry->result   = result;
182859e38b58STom Lendacky 	),
182959e38b58STom Lendacky 
183059e38b58STom Lendacky 	TP_printk("vcpu %u, ghcb_gpa %016llx, result %d",
183159e38b58STom Lendacky 		  __entry->vcpu_id, __entry->ghcb_gpa, __entry->result)
183259e38b58STom Lendacky );
183359e38b58STom Lendacky 
1834229456fcSMarcelo Tosatti #endif /* _TRACE_KVM_H */
1835229456fcSMarcelo Tosatti 
18362ed152afSXiao Guangrong #undef TRACE_INCLUDE_PATH
18375cd5548fSMasahiro Yamada #define TRACE_INCLUDE_PATH ../../arch/x86/kvm
18382ed152afSXiao Guangrong #undef TRACE_INCLUDE_FILE
18392ed152afSXiao Guangrong #define TRACE_INCLUDE_FILE trace
18402ed152afSXiao Guangrong 
1841229456fcSMarcelo Tosatti /* This part must be outside protection */
1842229456fcSMarcelo Tosatti #include <trace/define_trace.h>
1843