xref: /OK3568_Linux_fs/kernel/include/trace/events/kvm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #if !defined(_TRACE_KVM_MAIN_H) || defined(TRACE_HEADER_MULTI_READ)
3*4882a593Smuzhiyun #define _TRACE_KVM_MAIN_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/tracepoint.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #undef TRACE_SYSTEM
8*4882a593Smuzhiyun #define TRACE_SYSTEM kvm
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #define ERSN(x) { KVM_EXIT_##x, "KVM_EXIT_" #x }
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define kvm_trace_exit_reason						\
13*4882a593Smuzhiyun 	ERSN(UNKNOWN), ERSN(EXCEPTION), ERSN(IO), ERSN(HYPERCALL),	\
14*4882a593Smuzhiyun 	ERSN(DEBUG), ERSN(HLT), ERSN(MMIO), ERSN(IRQ_WINDOW_OPEN),	\
15*4882a593Smuzhiyun 	ERSN(SHUTDOWN), ERSN(FAIL_ENTRY), ERSN(INTR), ERSN(SET_TPR),	\
16*4882a593Smuzhiyun 	ERSN(TPR_ACCESS), ERSN(S390_SIEIC), ERSN(S390_RESET), ERSN(DCR),\
17*4882a593Smuzhiyun 	ERSN(NMI), ERSN(INTERNAL_ERROR), ERSN(OSI), ERSN(PAPR_HCALL),	\
18*4882a593Smuzhiyun 	ERSN(S390_UCONTROL), ERSN(WATCHDOG), ERSN(S390_TSCH), ERSN(EPR),\
19*4882a593Smuzhiyun 	ERSN(SYSTEM_EVENT), ERSN(S390_STSI), ERSN(IOAPIC_EOI),          \
20*4882a593Smuzhiyun 	ERSN(HYPERV), ERSN(ARM_NISV), ERSN(X86_RDMSR), ERSN(X86_WRMSR)
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun TRACE_EVENT(kvm_userspace_exit,
23*4882a593Smuzhiyun 	    TP_PROTO(__u32 reason, int errno),
24*4882a593Smuzhiyun 	    TP_ARGS(reason, errno),
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 	TP_STRUCT__entry(
27*4882a593Smuzhiyun 		__field(	__u32,		reason		)
28*4882a593Smuzhiyun 		__field(	int,		errno		)
29*4882a593Smuzhiyun 	),
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	TP_fast_assign(
32*4882a593Smuzhiyun 		__entry->reason		= reason;
33*4882a593Smuzhiyun 		__entry->errno		= errno;
34*4882a593Smuzhiyun 	),
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	TP_printk("reason %s (%d)",
37*4882a593Smuzhiyun 		  __entry->errno < 0 ?
38*4882a593Smuzhiyun 		  (__entry->errno == -EINTR ? "restart" : "error") :
39*4882a593Smuzhiyun 		  __print_symbolic(__entry->reason, kvm_trace_exit_reason),
40*4882a593Smuzhiyun 		  __entry->errno < 0 ? -__entry->errno : __entry->reason)
41*4882a593Smuzhiyun );
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun TRACE_EVENT(kvm_vcpu_wakeup,
44*4882a593Smuzhiyun 	    TP_PROTO(__u64 ns, bool waited, bool valid),
45*4882a593Smuzhiyun 	    TP_ARGS(ns, waited, valid),
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	TP_STRUCT__entry(
48*4882a593Smuzhiyun 		__field(	__u64,		ns		)
49*4882a593Smuzhiyun 		__field(	bool,		waited		)
50*4882a593Smuzhiyun 		__field(	bool,		valid		)
51*4882a593Smuzhiyun 	),
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	TP_fast_assign(
54*4882a593Smuzhiyun 		__entry->ns		= ns;
55*4882a593Smuzhiyun 		__entry->waited		= waited;
56*4882a593Smuzhiyun 		__entry->valid		= valid;
57*4882a593Smuzhiyun 	),
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	TP_printk("%s time %lld ns, polling %s",
60*4882a593Smuzhiyun 		  __entry->waited ? "wait" : "poll",
61*4882a593Smuzhiyun 		  __entry->ns,
62*4882a593Smuzhiyun 		  __entry->valid ? "valid" : "invalid")
63*4882a593Smuzhiyun );
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #if defined(CONFIG_HAVE_KVM_IRQFD)
66*4882a593Smuzhiyun TRACE_EVENT(kvm_set_irq,
67*4882a593Smuzhiyun 	TP_PROTO(unsigned int gsi, int level, int irq_source_id),
68*4882a593Smuzhiyun 	TP_ARGS(gsi, level, irq_source_id),
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	TP_STRUCT__entry(
71*4882a593Smuzhiyun 		__field(	unsigned int,	gsi		)
72*4882a593Smuzhiyun 		__field(	int,		level		)
73*4882a593Smuzhiyun 		__field(	int,		irq_source_id	)
74*4882a593Smuzhiyun 	),
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	TP_fast_assign(
77*4882a593Smuzhiyun 		__entry->gsi		= gsi;
78*4882a593Smuzhiyun 		__entry->level		= level;
79*4882a593Smuzhiyun 		__entry->irq_source_id	= irq_source_id;
80*4882a593Smuzhiyun 	),
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	TP_printk("gsi %u level %d source %d",
83*4882a593Smuzhiyun 		  __entry->gsi, __entry->level, __entry->irq_source_id)
84*4882a593Smuzhiyun );
85*4882a593Smuzhiyun #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #if defined(__KVM_HAVE_IOAPIC)
88*4882a593Smuzhiyun #define kvm_deliver_mode		\
89*4882a593Smuzhiyun 	{0x0, "Fixed"},			\
90*4882a593Smuzhiyun 	{0x1, "LowPrio"},		\
91*4882a593Smuzhiyun 	{0x2, "SMI"},			\
92*4882a593Smuzhiyun 	{0x3, "Res3"},			\
93*4882a593Smuzhiyun 	{0x4, "NMI"},			\
94*4882a593Smuzhiyun 	{0x5, "INIT"},			\
95*4882a593Smuzhiyun 	{0x6, "SIPI"},			\
96*4882a593Smuzhiyun 	{0x7, "ExtINT"}
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun TRACE_EVENT(kvm_ioapic_set_irq,
99*4882a593Smuzhiyun 	    TP_PROTO(__u64 e, int pin, bool coalesced),
100*4882a593Smuzhiyun 	    TP_ARGS(e, pin, coalesced),
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	TP_STRUCT__entry(
103*4882a593Smuzhiyun 		__field(	__u64,		e		)
104*4882a593Smuzhiyun 		__field(	int,		pin		)
105*4882a593Smuzhiyun 		__field(	bool,		coalesced	)
106*4882a593Smuzhiyun 	),
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	TP_fast_assign(
109*4882a593Smuzhiyun 		__entry->e		= e;
110*4882a593Smuzhiyun 		__entry->pin		= pin;
111*4882a593Smuzhiyun 		__entry->coalesced	= coalesced;
112*4882a593Smuzhiyun 	),
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	TP_printk("pin %u dst %x vec %u (%s|%s|%s%s)%s",
115*4882a593Smuzhiyun 		  __entry->pin, (u8)(__entry->e >> 56), (u8)__entry->e,
116*4882a593Smuzhiyun 		  __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode),
117*4882a593Smuzhiyun 		  (__entry->e & (1<<11)) ? "logical" : "physical",
118*4882a593Smuzhiyun 		  (__entry->e & (1<<15)) ? "level" : "edge",
119*4882a593Smuzhiyun 		  (__entry->e & (1<<16)) ? "|masked" : "",
120*4882a593Smuzhiyun 		  __entry->coalesced ? " (coalesced)" : "")
121*4882a593Smuzhiyun );
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun TRACE_EVENT(kvm_ioapic_delayed_eoi_inj,
124*4882a593Smuzhiyun 	    TP_PROTO(__u64 e),
125*4882a593Smuzhiyun 	    TP_ARGS(e),
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	TP_STRUCT__entry(
128*4882a593Smuzhiyun 		__field(	__u64,		e		)
129*4882a593Smuzhiyun 	),
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	TP_fast_assign(
132*4882a593Smuzhiyun 		__entry->e		= e;
133*4882a593Smuzhiyun 	),
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	TP_printk("dst %x vec %u (%s|%s|%s%s)",
136*4882a593Smuzhiyun 		  (u8)(__entry->e >> 56), (u8)__entry->e,
137*4882a593Smuzhiyun 		  __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode),
138*4882a593Smuzhiyun 		  (__entry->e & (1<<11)) ? "logical" : "physical",
139*4882a593Smuzhiyun 		  (__entry->e & (1<<15)) ? "level" : "edge",
140*4882a593Smuzhiyun 		  (__entry->e & (1<<16)) ? "|masked" : "")
141*4882a593Smuzhiyun );
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun TRACE_EVENT(kvm_msi_set_irq,
144*4882a593Smuzhiyun 	    TP_PROTO(__u64 address, __u64 data),
145*4882a593Smuzhiyun 	    TP_ARGS(address, data),
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	TP_STRUCT__entry(
148*4882a593Smuzhiyun 		__field(	__u64,		address		)
149*4882a593Smuzhiyun 		__field(	__u64,		data		)
150*4882a593Smuzhiyun 	),
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	TP_fast_assign(
153*4882a593Smuzhiyun 		__entry->address	= address;
154*4882a593Smuzhiyun 		__entry->data		= data;
155*4882a593Smuzhiyun 	),
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	TP_printk("dst %llx vec %u (%s|%s|%s%s)",
158*4882a593Smuzhiyun 		  (u8)(__entry->address >> 12) | ((__entry->address >> 32) & 0xffffff00),
159*4882a593Smuzhiyun 		  (u8)__entry->data,
160*4882a593Smuzhiyun 		  __print_symbolic((__entry->data >> 8 & 0x7), kvm_deliver_mode),
161*4882a593Smuzhiyun 		  (__entry->address & (1<<2)) ? "logical" : "physical",
162*4882a593Smuzhiyun 		  (__entry->data & (1<<15)) ? "level" : "edge",
163*4882a593Smuzhiyun 		  (__entry->address & (1<<3)) ? "|rh" : "")
164*4882a593Smuzhiyun );
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun #define kvm_irqchips						\
167*4882a593Smuzhiyun 	{KVM_IRQCHIP_PIC_MASTER,	"PIC master"},		\
168*4882a593Smuzhiyun 	{KVM_IRQCHIP_PIC_SLAVE,		"PIC slave"},		\
169*4882a593Smuzhiyun 	{KVM_IRQCHIP_IOAPIC,		"IOAPIC"}
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #endif /* defined(__KVM_HAVE_IOAPIC) */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun #if defined(CONFIG_HAVE_KVM_IRQFD)
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #ifdef kvm_irqchips
176*4882a593Smuzhiyun #define kvm_ack_irq_string "irqchip %s pin %u"
177*4882a593Smuzhiyun #define kvm_ack_irq_parm  __print_symbolic(__entry->irqchip, kvm_irqchips), __entry->pin
178*4882a593Smuzhiyun #else
179*4882a593Smuzhiyun #define kvm_ack_irq_string "irqchip %d pin %u"
180*4882a593Smuzhiyun #define kvm_ack_irq_parm  __entry->irqchip, __entry->pin
181*4882a593Smuzhiyun #endif
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun TRACE_EVENT(kvm_ack_irq,
184*4882a593Smuzhiyun 	TP_PROTO(unsigned int irqchip, unsigned int pin),
185*4882a593Smuzhiyun 	TP_ARGS(irqchip, pin),
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	TP_STRUCT__entry(
188*4882a593Smuzhiyun 		__field(	unsigned int,	irqchip		)
189*4882a593Smuzhiyun 		__field(	unsigned int,	pin		)
190*4882a593Smuzhiyun 	),
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	TP_fast_assign(
193*4882a593Smuzhiyun 		__entry->irqchip	= irqchip;
194*4882a593Smuzhiyun 		__entry->pin		= pin;
195*4882a593Smuzhiyun 	),
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	TP_printk(kvm_ack_irq_string, kvm_ack_irq_parm)
198*4882a593Smuzhiyun );
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun #define KVM_TRACE_MMIO_READ_UNSATISFIED 0
205*4882a593Smuzhiyun #define KVM_TRACE_MMIO_READ 1
206*4882a593Smuzhiyun #define KVM_TRACE_MMIO_WRITE 2
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun #define kvm_trace_symbol_mmio \
209*4882a593Smuzhiyun 	{ KVM_TRACE_MMIO_READ_UNSATISFIED, "unsatisfied-read" }, \
210*4882a593Smuzhiyun 	{ KVM_TRACE_MMIO_READ, "read" }, \
211*4882a593Smuzhiyun 	{ KVM_TRACE_MMIO_WRITE, "write" }
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun TRACE_EVENT(kvm_mmio,
214*4882a593Smuzhiyun 	TP_PROTO(int type, int len, u64 gpa, void *val),
215*4882a593Smuzhiyun 	TP_ARGS(type, len, gpa, val),
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	TP_STRUCT__entry(
218*4882a593Smuzhiyun 		__field(	u32,	type		)
219*4882a593Smuzhiyun 		__field(	u32,	len		)
220*4882a593Smuzhiyun 		__field(	u64,	gpa		)
221*4882a593Smuzhiyun 		__field(	u64,	val		)
222*4882a593Smuzhiyun 	),
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	TP_fast_assign(
225*4882a593Smuzhiyun 		__entry->type		= type;
226*4882a593Smuzhiyun 		__entry->len		= len;
227*4882a593Smuzhiyun 		__entry->gpa		= gpa;
228*4882a593Smuzhiyun 		__entry->val		= 0;
229*4882a593Smuzhiyun 		if (val)
230*4882a593Smuzhiyun 			memcpy(&__entry->val, val,
231*4882a593Smuzhiyun 			       min_t(u32, sizeof(__entry->val), len));
232*4882a593Smuzhiyun 	),
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	TP_printk("mmio %s len %u gpa 0x%llx val 0x%llx",
235*4882a593Smuzhiyun 		  __print_symbolic(__entry->type, kvm_trace_symbol_mmio),
236*4882a593Smuzhiyun 		  __entry->len, __entry->gpa, __entry->val)
237*4882a593Smuzhiyun );
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun #define kvm_fpu_load_symbol	\
240*4882a593Smuzhiyun 	{0, "unload"},		\
241*4882a593Smuzhiyun 	{1, "load"}
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun TRACE_EVENT(kvm_fpu,
244*4882a593Smuzhiyun 	TP_PROTO(int load),
245*4882a593Smuzhiyun 	TP_ARGS(load),
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	TP_STRUCT__entry(
248*4882a593Smuzhiyun 		__field(	u32,	        load		)
249*4882a593Smuzhiyun 	),
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	TP_fast_assign(
252*4882a593Smuzhiyun 		__entry->load		= load;
253*4882a593Smuzhiyun 	),
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	TP_printk("%s", __print_symbolic(__entry->load, kvm_fpu_load_symbol))
256*4882a593Smuzhiyun );
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun TRACE_EVENT(kvm_age_page,
259*4882a593Smuzhiyun 	TP_PROTO(ulong gfn, int level, struct kvm_memory_slot *slot, int ref),
260*4882a593Smuzhiyun 	TP_ARGS(gfn, level, slot, ref),
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	TP_STRUCT__entry(
263*4882a593Smuzhiyun 		__field(	u64,	hva		)
264*4882a593Smuzhiyun 		__field(	u64,	gfn		)
265*4882a593Smuzhiyun 		__field(	u8,	level		)
266*4882a593Smuzhiyun 		__field(	u8,	referenced	)
267*4882a593Smuzhiyun 	),
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	TP_fast_assign(
270*4882a593Smuzhiyun 		__entry->gfn		= gfn;
271*4882a593Smuzhiyun 		__entry->level		= level;
272*4882a593Smuzhiyun 		__entry->hva		= ((gfn - slot->base_gfn) <<
273*4882a593Smuzhiyun 					    PAGE_SHIFT) + slot->userspace_addr;
274*4882a593Smuzhiyun 		__entry->referenced	= ref;
275*4882a593Smuzhiyun 	),
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	TP_printk("hva %llx gfn %llx level %u %s",
278*4882a593Smuzhiyun 		  __entry->hva, __entry->gfn, __entry->level,
279*4882a593Smuzhiyun 		  __entry->referenced ? "YOUNG" : "OLD")
280*4882a593Smuzhiyun );
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun #ifdef CONFIG_KVM_ASYNC_PF
283*4882a593Smuzhiyun DECLARE_EVENT_CLASS(kvm_async_get_page_class,
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 	TP_PROTO(u64 gva, u64 gfn),
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	TP_ARGS(gva, gfn),
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	TP_STRUCT__entry(
290*4882a593Smuzhiyun 		__field(__u64, gva)
291*4882a593Smuzhiyun 		__field(u64, gfn)
292*4882a593Smuzhiyun 	),
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	TP_fast_assign(
295*4882a593Smuzhiyun 		__entry->gva = gva;
296*4882a593Smuzhiyun 		__entry->gfn = gfn;
297*4882a593Smuzhiyun 	),
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	TP_printk("gva = %#llx, gfn = %#llx", __entry->gva, __entry->gfn)
300*4882a593Smuzhiyun );
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun DEFINE_EVENT(kvm_async_get_page_class, kvm_try_async_get_page,
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	TP_PROTO(u64 gva, u64 gfn),
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	TP_ARGS(gva, gfn)
307*4882a593Smuzhiyun );
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun DEFINE_EVENT(kvm_async_get_page_class, kvm_async_pf_doublefault,
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	TP_PROTO(u64 gva, u64 gfn),
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 	TP_ARGS(gva, gfn)
314*4882a593Smuzhiyun );
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun DECLARE_EVENT_CLASS(kvm_async_pf_nopresent_ready,
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	TP_PROTO(u64 token, u64 gva),
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	TP_ARGS(token, gva),
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	TP_STRUCT__entry(
323*4882a593Smuzhiyun 		__field(__u64, token)
324*4882a593Smuzhiyun 		__field(__u64, gva)
325*4882a593Smuzhiyun 	),
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	TP_fast_assign(
328*4882a593Smuzhiyun 		__entry->token = token;
329*4882a593Smuzhiyun 		__entry->gva = gva;
330*4882a593Smuzhiyun 	),
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	TP_printk("token %#llx gva %#llx", __entry->token, __entry->gva)
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun );
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_not_present,
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	TP_PROTO(u64 token, u64 gva),
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	TP_ARGS(token, gva)
341*4882a593Smuzhiyun );
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_ready,
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	TP_PROTO(u64 token, u64 gva),
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	TP_ARGS(token, gva)
348*4882a593Smuzhiyun );
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun TRACE_EVENT(
351*4882a593Smuzhiyun 	kvm_async_pf_completed,
352*4882a593Smuzhiyun 	TP_PROTO(unsigned long address, u64 gva),
353*4882a593Smuzhiyun 	TP_ARGS(address, gva),
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	TP_STRUCT__entry(
356*4882a593Smuzhiyun 		__field(unsigned long, address)
357*4882a593Smuzhiyun 		__field(u64, gva)
358*4882a593Smuzhiyun 		),
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	TP_fast_assign(
361*4882a593Smuzhiyun 		__entry->address = address;
362*4882a593Smuzhiyun 		__entry->gva = gva;
363*4882a593Smuzhiyun 		),
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	TP_printk("gva %#llx address %#lx",  __entry->gva,
366*4882a593Smuzhiyun 		  __entry->address)
367*4882a593Smuzhiyun );
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun #endif
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun TRACE_EVENT(kvm_halt_poll_ns,
372*4882a593Smuzhiyun 	TP_PROTO(bool grow, unsigned int vcpu_id, unsigned int new,
373*4882a593Smuzhiyun 		 unsigned int old),
374*4882a593Smuzhiyun 	TP_ARGS(grow, vcpu_id, new, old),
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	TP_STRUCT__entry(
377*4882a593Smuzhiyun 		__field(bool, grow)
378*4882a593Smuzhiyun 		__field(unsigned int, vcpu_id)
379*4882a593Smuzhiyun 		__field(unsigned int, new)
380*4882a593Smuzhiyun 		__field(unsigned int, old)
381*4882a593Smuzhiyun 	),
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 	TP_fast_assign(
384*4882a593Smuzhiyun 		__entry->grow           = grow;
385*4882a593Smuzhiyun 		__entry->vcpu_id        = vcpu_id;
386*4882a593Smuzhiyun 		__entry->new            = new;
387*4882a593Smuzhiyun 		__entry->old            = old;
388*4882a593Smuzhiyun 	),
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun 	TP_printk("vcpu %u: halt_poll_ns %u (%s %u)",
391*4882a593Smuzhiyun 			__entry->vcpu_id,
392*4882a593Smuzhiyun 			__entry->new,
393*4882a593Smuzhiyun 			__entry->grow ? "grow" : "shrink",
394*4882a593Smuzhiyun 			__entry->old)
395*4882a593Smuzhiyun );
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun #define trace_kvm_halt_poll_ns_grow(vcpu_id, new, old) \
398*4882a593Smuzhiyun 	trace_kvm_halt_poll_ns(true, vcpu_id, new, old)
399*4882a593Smuzhiyun #define trace_kvm_halt_poll_ns_shrink(vcpu_id, new, old) \
400*4882a593Smuzhiyun 	trace_kvm_halt_poll_ns(false, vcpu_id, new, old)
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun #endif /* _TRACE_KVM_MAIN_H */
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun /* This part must be outside protection */
405*4882a593Smuzhiyun #include <trace/define_trace.h>
406