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