xref: /linux/include/trace/events/xen.h (revision 056a5087d87ead77dedbe9cf5bde53b7cd4b4651)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 #define TRACE_SYSTEM xen
4 
5 #if !defined(_TRACE_XEN_H) || defined(TRACE_HEADER_MULTI_READ)
6 #define _TRACE_XEN_H
7 
8 #include <linux/tracepoint.h>
9 #include <asm/xen/hypervisor.h>
10 #include <asm/xen/trace_types.h>
11 
12 struct multicall_entry;
13 
14 /* Multicalls */
15 TRACE_EVENT(xen_mc_batch,
16 	    TP_PROTO(unsigned long flags),
17 	    TP_ARGS(flags),
18 	    TP_STRUCT__entry(
19 		    __field(unsigned long, flags)
20 		    ),
21 	    TP_fast_assign(__entry->flags = flags),
22 	    TP_printk("start batch lazy flags %lx", __entry->flags)
23 	);
24 
25 TRACE_EVENT(xen_mc_issue,
26 	    TP_PROTO(bool flush, unsigned long flags),
27 	    TP_ARGS(flush, flags),
28 	    TP_STRUCT__entry(
29 		    __field(unsigned long, flags)
30 		    __field(bool, flush)
31 		    ),
32 	    TP_fast_assign(__entry->flush = flush;
33 			   __entry->flags = flags;
34 		    ),
35 	    TP_printk("flush: %s, flags %lx",
36 		      __entry->flush ? "yes" : "no", __entry->flags)
37 	);
38 
39 TRACE_DEFINE_SIZEOF(ulong);
40 
41 TRACE_EVENT(xen_mc_entry,
42 	    TP_PROTO(struct multicall_entry *mc, unsigned nargs),
43 	    TP_ARGS(mc, nargs),
44 	    TP_STRUCT__entry(
45 		    __field(unsigned int, op)
46 		    __field(unsigned int, nargs)
47 		    __array(unsigned long, args, 6)
48 		    ),
49 	    TP_fast_assign(__entry->op = mc->op;
50 			   __entry->nargs = nargs;
51 			   memcpy(__entry->args, mc->args, sizeof(ulong) * nargs);
52 			   memset(__entry->args + nargs, 0, sizeof(ulong) * (6 - nargs));
53 		    ),
54 	    TP_printk("op %u%s args [%lx, %lx, %lx, %lx, %lx, %lx]",
55 		      __entry->op, xen_hypercall_name(__entry->op),
56 		      __entry->args[0], __entry->args[1], __entry->args[2],
57 		      __entry->args[3], __entry->args[4], __entry->args[5])
58 	);
59 
60 TRACE_EVENT(xen_mc_entry_alloc,
61 	    TP_PROTO(size_t args),
62 	    TP_ARGS(args),
63 	    TP_STRUCT__entry(
64 		    __field(size_t, args)
65 		    ),
66 	    TP_fast_assign(__entry->args = args),
67 	    TP_printk("alloc entry %zu arg bytes", __entry->args)
68 	);
69 
70 TRACE_EVENT(xen_mc_callback,
71 	    TP_PROTO(xen_mc_callback_fn_t fn, void *data),
72 	    TP_ARGS(fn, data),
73 	    TP_STRUCT__entry(
74 		    /*
75 		     * Use field_struct to avoid is_signed_type()
76 		     * comparison of a function pointer.
77 		     */
78 		    __field_struct(xen_mc_callback_fn_t, fn)
79 		    __field(void *, data)
80 		    ),
81 	    TP_fast_assign(
82 		    __entry->fn = fn;
83 		    __entry->data = data;
84 		    ),
85 	    TP_printk("callback %ps, data %p",
86 		      __entry->fn, __entry->data)
87 	);
88 
89 TRACE_EVENT(xen_mc_flush_reason,
90 	    TP_PROTO(enum xen_mc_flush_reason reason),
91 	    TP_ARGS(reason),
92 	    TP_STRUCT__entry(
93 		    __field(enum xen_mc_flush_reason, reason)
94 		    ),
95 	    TP_fast_assign(__entry->reason = reason),
96 	    TP_printk("flush reason %s",
97 		      (__entry->reason == XEN_MC_FL_NONE) ? "NONE" :
98 		      (__entry->reason == XEN_MC_FL_BATCH) ? "BATCH" :
99 		      (__entry->reason == XEN_MC_FL_ARGS) ? "ARGS" :
100 		      (__entry->reason == XEN_MC_FL_CALLBACK) ? "CALLBACK" : "??")
101 	);
102 
103 TRACE_EVENT(xen_mc_flush,
104 	    TP_PROTO(unsigned mcidx, unsigned argidx, unsigned cbidx),
105 	    TP_ARGS(mcidx, argidx, cbidx),
106 	    TP_STRUCT__entry(
107 		    __field(unsigned, mcidx)
108 		    __field(unsigned, argidx)
109 		    __field(unsigned, cbidx)
110 		    ),
111 	    TP_fast_assign(__entry->mcidx = mcidx;
112 			   __entry->argidx = argidx;
113 			   __entry->cbidx = cbidx),
114 	    TP_printk("flushing %u hypercalls, %u arg bytes, %u callbacks",
115 		      __entry->mcidx, __entry->argidx, __entry->cbidx)
116 	);
117 
118 TRACE_EVENT(xen_mc_extend_args,
119 	    TP_PROTO(unsigned long op, size_t args, enum xen_mc_extend_args res),
120 	    TP_ARGS(op, args, res),
121 	    TP_STRUCT__entry(
122 		    __field(unsigned int, op)
123 		    __field(size_t, args)
124 		    __field(enum xen_mc_extend_args, res)
125 		    ),
126 	    TP_fast_assign(__entry->op = op;
127 			   __entry->args = args;
128 			   __entry->res = res),
129 	    TP_printk("extending op %u%s by %zu bytes res %s",
130 		      __entry->op, xen_hypercall_name(__entry->op),
131 		      __entry->args,
132 		      __entry->res == XEN_MC_XE_OK ? "OK" :
133 		      __entry->res == XEN_MC_XE_BAD_OP ? "BAD_OP" :
134 		      __entry->res == XEN_MC_XE_NO_SPACE ? "NO_SPACE" : "???")
135 	);
136 
137 /* mmu */
138 TRACE_DEFINE_SIZEOF(pteval_t);
139 
140 TRACE_EVENT(xen_mmu_set_pte,
141 	    TP_PROTO(pte_t *ptep, pte_t pteval),
142 	    TP_ARGS(ptep, pteval),
143 	    TP_STRUCT__entry(
144 		    __field(pte_t *, ptep)
145 		    __field(pteval_t, pteval)
146 		    ),
147 	    TP_fast_assign(__entry->ptep = ptep;
148 			   __entry->pteval = pteval.pte),
149 	    TP_printk("ptep %p pteval %0*llx (raw %0*llx)",
150 		      __entry->ptep,
151 		      (int)sizeof(pteval_t) * 2, (unsigned long long)pte_val(native_make_pte(__entry->pteval)),
152 		      (int)sizeof(pteval_t) * 2, (unsigned long long)__entry->pteval)
153 	);
154 
155 TRACE_DEFINE_SIZEOF(pmdval_t);
156 
157 TRACE_EVENT(xen_mmu_set_pmd,
158 	    TP_PROTO(pmd_t *pmdp, pmd_t pmdval),
159 	    TP_ARGS(pmdp, pmdval),
160 	    TP_STRUCT__entry(
161 		    __field(pmd_t *, pmdp)
162 		    __field(pmdval_t, pmdval)
163 		    ),
164 	    TP_fast_assign(__entry->pmdp = pmdp;
165 			   __entry->pmdval = pmdval.pmd),
166 	    TP_printk("pmdp %p pmdval %0*llx (raw %0*llx)",
167 		      __entry->pmdp,
168 		      (int)sizeof(pmdval_t) * 2, (unsigned long long)pmd_val(native_make_pmd(__entry->pmdval)),
169 		      (int)sizeof(pmdval_t) * 2, (unsigned long long)__entry->pmdval)
170 	);
171 
172 TRACE_DEFINE_SIZEOF(pudval_t);
173 
174 TRACE_EVENT(xen_mmu_set_pud,
175 	    TP_PROTO(pud_t *pudp, pud_t pudval),
176 	    TP_ARGS(pudp, pudval),
177 	    TP_STRUCT__entry(
178 		    __field(pud_t *, pudp)
179 		    __field(pudval_t, pudval)
180 		    ),
181 	    TP_fast_assign(__entry->pudp = pudp;
182 			   __entry->pudval = native_pud_val(pudval)),
183 	    TP_printk("pudp %p pudval %0*llx (raw %0*llx)",
184 		      __entry->pudp,
185 		      (int)sizeof(pudval_t) * 2, (unsigned long long)pud_val(native_make_pud(__entry->pudval)),
186 		      (int)sizeof(pudval_t) * 2, (unsigned long long)__entry->pudval)
187 	);
188 
189 TRACE_DEFINE_SIZEOF(p4dval_t);
190 
191 TRACE_EVENT(xen_mmu_set_p4d,
192 	    TP_PROTO(p4d_t *p4dp, p4d_t *user_p4dp, p4d_t p4dval),
193 	    TP_ARGS(p4dp, user_p4dp, p4dval),
194 	    TP_STRUCT__entry(
195 		    __field(p4d_t *, p4dp)
196 		    __field(p4d_t *, user_p4dp)
197 		    __field(p4dval_t, p4dval)
198 		    ),
199 	    TP_fast_assign(__entry->p4dp = p4dp;
200 			   __entry->user_p4dp = user_p4dp;
201 			   __entry->p4dval = p4d_val(p4dval)),
202 	    TP_printk("p4dp %p user_p4dp %p p4dval %0*llx (raw %0*llx)",
203 		      __entry->p4dp, __entry->user_p4dp,
204 		      (int)sizeof(p4dval_t) * 2, (unsigned long long)pgd_val(native_make_pgd(__entry->p4dval)),
205 		      (int)sizeof(p4dval_t) * 2, (unsigned long long)__entry->p4dval)
206 	);
207 
208 DECLARE_EVENT_CLASS(xen_mmu_ptep_modify_prot,
209 	    TP_PROTO(struct mm_struct *mm, unsigned long addr,
210 		     pte_t *ptep, pte_t pteval),
211 	    TP_ARGS(mm, addr, ptep, pteval),
212 	    TP_STRUCT__entry(
213 		    __field(struct mm_struct *, mm)
214 		    __field(unsigned long, addr)
215 		    __field(pte_t *, ptep)
216 		    __field(pteval_t, pteval)
217 		    ),
218 	    TP_fast_assign(__entry->mm = mm;
219 			   __entry->addr = addr;
220 			   __entry->ptep = ptep;
221 			   __entry->pteval = pteval.pte),
222 	    TP_printk("mm %p addr %lx ptep %p pteval %0*llx (raw %0*llx)",
223 		      __entry->mm, __entry->addr, __entry->ptep,
224 		      (int)sizeof(pteval_t) * 2, (unsigned long long)pte_val(native_make_pte(__entry->pteval)),
225 		      (int)sizeof(pteval_t) * 2, (unsigned long long)__entry->pteval)
226 	);
227 #define DEFINE_XEN_MMU_PTEP_MODIFY_PROT(name)				\
228 	DEFINE_EVENT(xen_mmu_ptep_modify_prot, name,			\
229 		     TP_PROTO(struct mm_struct *mm, unsigned long addr,	\
230 			      pte_t *ptep, pte_t pteval),		\
231 		     TP_ARGS(mm, addr, ptep, pteval))
232 
233 DEFINE_XEN_MMU_PTEP_MODIFY_PROT(xen_mmu_ptep_modify_prot_start);
234 DEFINE_XEN_MMU_PTEP_MODIFY_PROT(xen_mmu_ptep_modify_prot_commit);
235 
236 TRACE_EVENT(xen_mmu_alloc_ptpage,
237 	    TP_PROTO(struct mm_struct *mm, unsigned long pfn, unsigned level, bool pinned),
238 	    TP_ARGS(mm, pfn, level, pinned),
239 	    TP_STRUCT__entry(
240 		    __field(struct mm_struct *, mm)
241 		    __field(unsigned long, pfn)
242 		    __field(unsigned, level)
243 		    __field(bool, pinned)
244 		    ),
245 	    TP_fast_assign(__entry->mm = mm;
246 			   __entry->pfn = pfn;
247 			   __entry->level = level;
248 			   __entry->pinned = pinned),
249 	    TP_printk("mm %p  pfn %lx  level %d  %spinned",
250 		      __entry->mm, __entry->pfn, __entry->level,
251 		      __entry->pinned ? "" : "un")
252 	);
253 
254 TRACE_EVENT(xen_mmu_release_ptpage,
255 	    TP_PROTO(unsigned long pfn, unsigned level, bool pinned),
256 	    TP_ARGS(pfn, level, pinned),
257 	    TP_STRUCT__entry(
258 		    __field(unsigned long, pfn)
259 		    __field(unsigned, level)
260 		    __field(bool, pinned)
261 		    ),
262 	    TP_fast_assign(__entry->pfn = pfn;
263 			   __entry->level = level;
264 			   __entry->pinned = pinned),
265 	    TP_printk("pfn %lx  level %d  %spinned",
266 		      __entry->pfn, __entry->level,
267 		      __entry->pinned ? "" : "un")
268 	);
269 
270 DECLARE_EVENT_CLASS(xen_mmu_pgd,
271 	    TP_PROTO(struct mm_struct *mm, pgd_t *pgd),
272 	    TP_ARGS(mm, pgd),
273 	    TP_STRUCT__entry(
274 		    __field(struct mm_struct *, mm)
275 		    __field(pgd_t *, pgd)
276 		    ),
277 	    TP_fast_assign(__entry->mm = mm;
278 			   __entry->pgd = pgd),
279 	    TP_printk("mm %p pgd %p", __entry->mm, __entry->pgd)
280 	);
281 #define DEFINE_XEN_MMU_PGD_EVENT(name)				\
282 	DEFINE_EVENT(xen_mmu_pgd, name,				\
283 		TP_PROTO(struct mm_struct *mm, pgd_t *pgd),	\
284 		     TP_ARGS(mm, pgd))
285 
286 DEFINE_XEN_MMU_PGD_EVENT(xen_mmu_pgd_pin);
287 DEFINE_XEN_MMU_PGD_EVENT(xen_mmu_pgd_unpin);
288 
289 TRACE_EVENT(xen_mmu_flush_tlb_one_user,
290 	    TP_PROTO(unsigned long addr),
291 	    TP_ARGS(addr),
292 	    TP_STRUCT__entry(
293 		    __field(unsigned long, addr)
294 		    ),
295 	    TP_fast_assign(__entry->addr = addr),
296 	    TP_printk("addr %lx", __entry->addr)
297 	);
298 
299 TRACE_EVENT(xen_mmu_flush_tlb_multi,
300 	    TP_PROTO(const struct cpumask *cpus, struct mm_struct *mm,
301 		     unsigned long addr, unsigned long end),
302 	    TP_ARGS(cpus, mm, addr, end),
303 	    TP_STRUCT__entry(
304 		    __field(unsigned, ncpus)
305 		    __field(struct mm_struct *, mm)
306 		    __field(unsigned long, addr)
307 		    __field(unsigned long, end)
308 		    ),
309 	    TP_fast_assign(__entry->ncpus = cpumask_weight(cpus);
310 			   __entry->mm = mm;
311 			   __entry->addr = addr,
312 			   __entry->end = end),
313 	    TP_printk("ncpus %d mm %p addr %lx, end %lx",
314 		      __entry->ncpus, __entry->mm, __entry->addr, __entry->end)
315 	);
316 
317 TRACE_EVENT(xen_mmu_write_cr3,
318 	    TP_PROTO(bool kernel, unsigned long cr3),
319 	    TP_ARGS(kernel, cr3),
320 	    TP_STRUCT__entry(
321 		    __field(bool, kernel)
322 		    __field(unsigned long, cr3)
323 		    ),
324 	    TP_fast_assign(__entry->kernel = kernel;
325 			   __entry->cr3 = cr3),
326 	    TP_printk("%s cr3 %lx",
327 		      __entry->kernel ? "kernel" : "user", __entry->cr3)
328 	);
329 
330 
331 /* CPU */
332 TRACE_EVENT(xen_cpu_write_ldt_entry,
333 	    TP_PROTO(struct desc_struct *dt, int entrynum, u64 desc),
334 	    TP_ARGS(dt, entrynum, desc),
335 	    TP_STRUCT__entry(
336 		    __field(struct desc_struct *, dt)
337 		    __field(int, entrynum)
338 		    __field(u64, desc)
339 		    ),
340 	    TP_fast_assign(__entry->dt = dt;
341 			   __entry->entrynum = entrynum;
342 			   __entry->desc = desc;
343 		    ),
344 	    TP_printk("dt %p  entrynum %d  entry %016llx",
345 		      __entry->dt, __entry->entrynum,
346 		      (unsigned long long)__entry->desc)
347 	);
348 
349 TRACE_EVENT(xen_cpu_write_idt_entry,
350 	    TP_PROTO(gate_desc *dt, int entrynum, const gate_desc *ent),
351 	    TP_ARGS(dt, entrynum, ent),
352 	    TP_STRUCT__entry(
353 		    __field(gate_desc *, dt)
354 		    __field(int, entrynum)
355 		    ),
356 	    TP_fast_assign(__entry->dt = dt;
357 			   __entry->entrynum = entrynum;
358 		    ),
359 	    TP_printk("dt %p  entrynum %d",
360 		      __entry->dt, __entry->entrynum)
361 	);
362 
363 TRACE_EVENT(xen_cpu_load_idt,
364 	    TP_PROTO(const struct desc_ptr *desc),
365 	    TP_ARGS(desc),
366 	    TP_STRUCT__entry(
367 		    __field(unsigned long, addr)
368 		    ),
369 	    TP_fast_assign(__entry->addr = desc->address),
370 	    TP_printk("addr %lx", __entry->addr)
371 	);
372 
373 TRACE_EVENT(xen_cpu_write_gdt_entry,
374 	    TP_PROTO(struct desc_struct *dt, int entrynum, const void *desc, int type),
375 	    TP_ARGS(dt, entrynum, desc, type),
376 	    TP_STRUCT__entry(
377 		    __field(u64, desc)
378 		    __field(struct desc_struct *, dt)
379 		    __field(int, entrynum)
380 		    __field(int, type)
381 		    ),
382 	    TP_fast_assign(__entry->dt = dt;
383 			   __entry->entrynum = entrynum;
384 			   __entry->desc = *(u64 *)desc;
385 			   __entry->type = type;
386 		    ),
387 	    TP_printk("dt %p  entrynum %d  type %d  desc %016llx",
388 		      __entry->dt, __entry->entrynum, __entry->type,
389 		      (unsigned long long)__entry->desc)
390 	);
391 
392 TRACE_EVENT(xen_cpu_set_ldt,
393 	    TP_PROTO(const void *addr, unsigned entries),
394 	    TP_ARGS(addr, entries),
395 	    TP_STRUCT__entry(
396 		    __field(const void *, addr)
397 		    __field(unsigned, entries)
398 		    ),
399 	    TP_fast_assign(__entry->addr = addr;
400 			   __entry->entries = entries),
401 	    TP_printk("addr %p  entries %u",
402 		      __entry->addr, __entry->entries)
403 	);
404 
405 #endif /*  _TRACE_XEN_H */
406 
407 /* This part must be outside protection */
408 #include <trace/define_trace.h>
409