Update kernel probes to more detailed match to kernel versions
[lttng-modules.git] / instrumentation / events / lttng-module / kvm.h
1 #if !defined(_TRACE_KVM_MAIN_H) || defined(TRACE_HEADER_MULTI_READ)
2 #define _TRACE_KVM_MAIN_H
3
4 #include <linux/tracepoint.h>
5 #include <linux/version.h>
6
7 #undef TRACE_SYSTEM
8 #define TRACE_SYSTEM kvm
9
10 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
11
12 #define ERSN(x) { KVM_EXIT_##x, "KVM_EXIT_" #x }
13
14 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
15
16 #define kvm_trace_exit_reason \
17 ERSN(UNKNOWN), ERSN(EXCEPTION), ERSN(IO), ERSN(HYPERCALL), \
18 ERSN(DEBUG), ERSN(HLT), ERSN(MMIO), ERSN(IRQ_WINDOW_OPEN), \
19 ERSN(SHUTDOWN), ERSN(FAIL_ENTRY), ERSN(INTR), ERSN(SET_TPR), \
20 ERSN(TPR_ACCESS), ERSN(S390_SIEIC), ERSN(S390_RESET), ERSN(DCR),\
21 ERSN(NMI), ERSN(INTERNAL_ERROR), ERSN(OSI), ERSN(PAPR_HCALL), \
22 ERSN(S390_UCONTROL)
23
24 #else
25
26 #define kvm_trace_exit_reason \
27 ERSN(UNKNOWN), ERSN(EXCEPTION), ERSN(IO), ERSN(HYPERCALL), \
28 ERSN(DEBUG), ERSN(HLT), ERSN(MMIO), ERSN(IRQ_WINDOW_OPEN), \
29 ERSN(SHUTDOWN), ERSN(FAIL_ENTRY), ERSN(INTR), ERSN(SET_TPR), \
30 ERSN(TPR_ACCESS), ERSN(S390_SIEIC), ERSN(S390_RESET), ERSN(DCR),\
31 ERSN(NMI), ERSN(INTERNAL_ERROR), ERSN(OSI)
32
33 #endif
34
35 TRACE_EVENT(kvm_userspace_exit,
36 TP_PROTO(__u32 reason, int errno),
37 TP_ARGS(reason, errno),
38
39 TP_STRUCT__entry(
40 __field( __u32, reason )
41 __field( int, errno )
42 ),
43
44 TP_fast_assign(
45 tp_assign(reason, reason)
46 tp_assign(errno, errno)
47 ),
48
49 TP_printk("reason %s (%d)",
50 __entry->errno < 0 ?
51 (__entry->errno == -EINTR ? "restart" : "error") :
52 __print_symbolic(__entry->reason, kvm_trace_exit_reason),
53 __entry->errno < 0 ? -__entry->errno : __entry->reason)
54 )
55 #endif
56
57 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
58 #if defined(__KVM_HAVE_IOAPIC)
59 #undef __KVM_HAVE_IRQ_LINE
60 #define __KVM_HAVE_IRQ_LINE
61 #endif
62 #endif
63
64 #if defined(__KVM_HAVE_IRQ_LINE)
65 TRACE_EVENT(kvm_set_irq,
66 TP_PROTO(unsigned int gsi, int level, int irq_source_id),
67 TP_ARGS(gsi, level, irq_source_id),
68
69 TP_STRUCT__entry(
70 __field( unsigned int, gsi )
71 __field( int, level )
72 __field( int, irq_source_id )
73 ),
74
75 TP_fast_assign(
76 tp_assign(gsi, gsi)
77 tp_assign(level, level)
78 tp_assign(irq_source_id, irq_source_id)
79 ),
80
81 TP_printk("gsi %u level %d source %d",
82 __entry->gsi, __entry->level, __entry->irq_source_id)
83 )
84 #endif
85
86 #if defined(__KVM_HAVE_IOAPIC)
87 #define kvm_deliver_mode \
88 {0x0, "Fixed"}, \
89 {0x1, "LowPrio"}, \
90 {0x2, "SMI"}, \
91 {0x3, "Res3"}, \
92 {0x4, "NMI"}, \
93 {0x5, "INIT"}, \
94 {0x6, "SIPI"}, \
95 {0x7, "ExtINT"}
96
97 TRACE_EVENT(kvm_ioapic_set_irq,
98 TP_PROTO(__u64 e, int pin, bool coalesced),
99 TP_ARGS(e, pin, coalesced),
100
101 TP_STRUCT__entry(
102 __field( __u64, e )
103 __field( int, pin )
104 __field( bool, coalesced )
105 ),
106
107 TP_fast_assign(
108 tp_assign(e, e)
109 tp_assign(pin, pin)
110 tp_assign(coalesced, coalesced)
111 ),
112
113 TP_printk("pin %u dst %x vec=%u (%s|%s|%s%s)%s",
114 __entry->pin, (u8)(__entry->e >> 56), (u8)__entry->e,
115 __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode),
116 (__entry->e & (1<<11)) ? "logical" : "physical",
117 (__entry->e & (1<<15)) ? "level" : "edge",
118 (__entry->e & (1<<16)) ? "|masked" : "",
119 __entry->coalesced ? " (coalesced)" : "")
120 )
121
122 TRACE_EVENT(kvm_msi_set_irq,
123 TP_PROTO(__u64 address, __u64 data),
124 TP_ARGS(address, data),
125
126 TP_STRUCT__entry(
127 __field( __u64, address )
128 __field( __u64, data )
129 ),
130
131 TP_fast_assign(
132 tp_assign(address, address)
133 tp_assign(data, data)
134 ),
135
136 TP_printk("dst %u vec %x (%s|%s|%s%s)",
137 (u8)(__entry->address >> 12), (u8)__entry->data,
138 __print_symbolic((__entry->data >> 8 & 0x7), kvm_deliver_mode),
139 (__entry->address & (1<<2)) ? "logical" : "physical",
140 (__entry->data & (1<<15)) ? "level" : "edge",
141 (__entry->address & (1<<3)) ? "|rh" : "")
142 )
143
144 #define kvm_irqchips \
145 {KVM_IRQCHIP_PIC_MASTER, "PIC master"}, \
146 {KVM_IRQCHIP_PIC_SLAVE, "PIC slave"}, \
147 {KVM_IRQCHIP_IOAPIC, "IOAPIC"}
148
149 TRACE_EVENT(kvm_ack_irq,
150 TP_PROTO(unsigned int irqchip, unsigned int pin),
151 TP_ARGS(irqchip, pin),
152
153 TP_STRUCT__entry(
154 __field( unsigned int, irqchip )
155 __field( unsigned int, pin )
156 ),
157
158 TP_fast_assign(
159 tp_assign(irqchip, irqchip)
160 tp_assign(pin, pin)
161 ),
162
163 TP_printk("irqchip %s pin %u",
164 __print_symbolic(__entry->irqchip, kvm_irqchips),
165 __entry->pin)
166 )
167
168
169
170 #endif /* defined(__KVM_HAVE_IOAPIC) */
171
172 #define KVM_TRACE_MMIO_READ_UNSATISFIED 0
173 #define KVM_TRACE_MMIO_READ 1
174 #define KVM_TRACE_MMIO_WRITE 2
175
176 #define kvm_trace_symbol_mmio \
177 { KVM_TRACE_MMIO_READ_UNSATISFIED, "unsatisfied-read" }, \
178 { KVM_TRACE_MMIO_READ, "read" }, \
179 { KVM_TRACE_MMIO_WRITE, "write" }
180
181 TRACE_EVENT(kvm_mmio,
182 TP_PROTO(int type, int len, u64 gpa, u64 val),
183 TP_ARGS(type, len, gpa, val),
184
185 TP_STRUCT__entry(
186 __field( u32, type )
187 __field( u32, len )
188 __field( u64, gpa )
189 __field( u64, val )
190 ),
191
192 TP_fast_assign(
193 tp_assign(type, type)
194 tp_assign(len, len)
195 tp_assign(gpa, gpa)
196 tp_assign(val, val)
197 ),
198
199 TP_printk("mmio %s len %u gpa 0x%llx val 0x%llx",
200 __print_symbolic(__entry->type, kvm_trace_symbol_mmio),
201 __entry->len, __entry->gpa, __entry->val)
202 )
203
204 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
205
206 #define kvm_fpu_load_symbol \
207 {0, "unload"}, \
208 {1, "load"}
209
210 TRACE_EVENT(kvm_fpu,
211 TP_PROTO(int load),
212 TP_ARGS(load),
213
214 TP_STRUCT__entry(
215 __field( u32, load )
216 ),
217
218 TP_fast_assign(
219 tp_assign(load, load)
220 ),
221
222 TP_printk("%s", __print_symbolic(__entry->load, kvm_fpu_load_symbol))
223 )
224
225 TRACE_EVENT(kvm_age_page,
226 TP_PROTO(ulong hva, struct kvm_memory_slot *slot, int ref),
227 TP_ARGS(hva, slot, ref),
228
229 TP_STRUCT__entry(
230 __field( u64, hva )
231 __field( u64, gfn )
232 __field( u8, referenced )
233 ),
234
235 TP_fast_assign(
236 tp_assign(hva, hva)
237 tp_assign(gfn,
238 slot->base_gfn + ((hva - slot->userspace_addr) >> PAGE_SHIFT))
239 tp_assign(referenced, ref)
240 ),
241
242 TP_printk("hva %llx gfn %llx %s",
243 __entry->hva, __entry->gfn,
244 __entry->referenced ? "YOUNG" : "OLD")
245 )
246 #endif
247
248 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
249
250 #ifdef CONFIG_KVM_ASYNC_PF
251 DECLARE_EVENT_CLASS(kvm_async_get_page_class,
252
253 TP_PROTO(u64 gva, u64 gfn),
254
255 TP_ARGS(gva, gfn),
256
257 TP_STRUCT__entry(
258 __field(__u64, gva)
259 __field(u64, gfn)
260 ),
261
262 TP_fast_assign(
263 tp_assign(gva, gva)
264 tp_assign(gfn, gfn)
265 ),
266
267 TP_printk("gva = %#llx, gfn = %#llx", __entry->gva, __entry->gfn)
268 )
269
270 DEFINE_EVENT(kvm_async_get_page_class, kvm_try_async_get_page,
271
272 TP_PROTO(u64 gva, u64 gfn),
273
274 TP_ARGS(gva, gfn)
275 )
276
277 DEFINE_EVENT(kvm_async_get_page_class, kvm_async_pf_doublefault,
278
279 TP_PROTO(u64 gva, u64 gfn),
280
281 TP_ARGS(gva, gfn)
282 )
283
284 DECLARE_EVENT_CLASS(kvm_async_pf_nopresent_ready,
285
286 TP_PROTO(u64 token, u64 gva),
287
288 TP_ARGS(token, gva),
289
290 TP_STRUCT__entry(
291 __field(__u64, token)
292 __field(__u64, gva)
293 ),
294
295 TP_fast_assign(
296 tp_assign(token, token)
297 tp_assign(gva, gva)
298 ),
299
300 TP_printk("token %#llx gva %#llx", __entry->token, __entry->gva)
301
302 )
303
304 DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_not_present,
305
306 TP_PROTO(u64 token, u64 gva),
307
308 TP_ARGS(token, gva)
309 )
310
311 DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_ready,
312
313 TP_PROTO(u64 token, u64 gva),
314
315 TP_ARGS(token, gva)
316 )
317
318 TRACE_EVENT(
319 kvm_async_pf_completed,
320 TP_PROTO(unsigned long address, struct page *page, u64 gva),
321 TP_ARGS(address, page, gva),
322
323 TP_STRUCT__entry(
324 __field(unsigned long, address)
325 __field(pfn_t, pfn)
326 __field(u64, gva)
327 ),
328
329 TP_fast_assign(
330 tp_assign(address, address)
331 tp_assign(pfn, page ? page_to_pfn(page) : 0)
332 tp_assign(gva, gva)
333 ),
334
335 TP_printk("gva %#llx address %#lx pfn %#llx", __entry->gva,
336 __entry->address, __entry->pfn)
337 )
338
339 #endif
340
341 #endif
342
343 #endif /* _TRACE_KVM_MAIN_H */
344
345 /* This part must be outside protection */
346 #include "../../../probes/define_trace.h"
This page took 0.037486 seconds and 5 git commands to generate.