trace.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
  2. #define _TRACE_KVM_H
  3. #include <linux/tracepoint.h>
  4. #undef TRACE_SYSTEM
  5. #define TRACE_SYSTEM kvm
  6. #define TRACE_INCLUDE_PATH .
  7. #define TRACE_INCLUDE_FILE trace
  8. /*
  9. * Tracepoint for guest mode entry.
  10. */
  11. TRACE_EVENT(kvm_ppc_instr,
  12. TP_PROTO(unsigned int inst, unsigned long _pc, unsigned int emulate),
  13. TP_ARGS(inst, _pc, emulate),
  14. TP_STRUCT__entry(
  15. __field( unsigned int, inst )
  16. __field( unsigned long, pc )
  17. __field( unsigned int, emulate )
  18. ),
  19. TP_fast_assign(
  20. __entry->inst = inst;
  21. __entry->pc = _pc;
  22. __entry->emulate = emulate;
  23. ),
  24. TP_printk("inst %u pc 0x%lx emulate %u\n",
  25. __entry->inst, __entry->pc, __entry->emulate)
  26. );
  27. #ifdef CONFIG_PPC_BOOK3S
  28. #define kvm_trace_symbol_exit \
  29. {0x100, "SYSTEM_RESET"}, \
  30. {0x200, "MACHINE_CHECK"}, \
  31. {0x300, "DATA_STORAGE"}, \
  32. {0x380, "DATA_SEGMENT"}, \
  33. {0x400, "INST_STORAGE"}, \
  34. {0x480, "INST_SEGMENT"}, \
  35. {0x500, "EXTERNAL"}, \
  36. {0x501, "EXTERNAL_LEVEL"}, \
  37. {0x502, "EXTERNAL_HV"}, \
  38. {0x600, "ALIGNMENT"}, \
  39. {0x700, "PROGRAM"}, \
  40. {0x800, "FP_UNAVAIL"}, \
  41. {0x900, "DECREMENTER"}, \
  42. {0x980, "HV_DECREMENTER"}, \
  43. {0xc00, "SYSCALL"}, \
  44. {0xd00, "TRACE"}, \
  45. {0xe00, "H_DATA_STORAGE"}, \
  46. {0xe20, "H_INST_STORAGE"}, \
  47. {0xe40, "H_EMUL_ASSIST"}, \
  48. {0xf00, "PERFMON"}, \
  49. {0xf20, "ALTIVEC"}, \
  50. {0xf40, "VSX"}
  51. #else
  52. #define kvm_trace_symbol_exit \
  53. {0, "CRITICAL"}, \
  54. {1, "MACHINE_CHECK"}, \
  55. {2, "DATA_STORAGE"}, \
  56. {3, "INST_STORAGE"}, \
  57. {4, "EXTERNAL"}, \
  58. {5, "ALIGNMENT"}, \
  59. {6, "PROGRAM"}, \
  60. {7, "FP_UNAVAIL"}, \
  61. {8, "SYSCALL"}, \
  62. {9, "AP_UNAVAIL"}, \
  63. {10, "DECREMENTER"}, \
  64. {11, "FIT"}, \
  65. {12, "WATCHDOG"}, \
  66. {13, "DTLB_MISS"}, \
  67. {14, "ITLB_MISS"}, \
  68. {15, "DEBUG"}, \
  69. {32, "SPE_UNAVAIL"}, \
  70. {33, "SPE_FP_DATA"}, \
  71. {34, "SPE_FP_ROUND"}, \
  72. {35, "PERFORMANCE_MONITOR"}, \
  73. {36, "DOORBELL"}, \
  74. {37, "DOORBELL_CRITICAL"}, \
  75. {38, "GUEST_DBELL"}, \
  76. {39, "GUEST_DBELL_CRIT"}, \
  77. {40, "HV_SYSCALL"}, \
  78. {41, "HV_PRIV"}
  79. #endif
  80. TRACE_EVENT(kvm_exit,
  81. TP_PROTO(unsigned int exit_nr, struct kvm_vcpu *vcpu),
  82. TP_ARGS(exit_nr, vcpu),
  83. TP_STRUCT__entry(
  84. __field( unsigned int, exit_nr )
  85. __field( unsigned long, pc )
  86. __field( unsigned long, msr )
  87. __field( unsigned long, dar )
  88. #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
  89. __field( unsigned long, srr1 )
  90. #endif
  91. __field( unsigned long, last_inst )
  92. ),
  93. TP_fast_assign(
  94. __entry->exit_nr = exit_nr;
  95. __entry->pc = kvmppc_get_pc(vcpu);
  96. __entry->dar = kvmppc_get_fault_dar(vcpu);
  97. __entry->msr = vcpu->arch.shared->msr;
  98. #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
  99. __entry->srr1 = vcpu->arch.shadow_srr1;
  100. #endif
  101. __entry->last_inst = vcpu->arch.last_inst;
  102. ),
  103. TP_printk("exit=%s"
  104. " | pc=0x%lx"
  105. " | msr=0x%lx"
  106. " | dar=0x%lx"
  107. #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
  108. " | srr1=0x%lx"
  109. #endif
  110. " | last_inst=0x%lx"
  111. ,
  112. __print_symbolic(__entry->exit_nr, kvm_trace_symbol_exit),
  113. __entry->pc,
  114. __entry->msr,
  115. __entry->dar,
  116. #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
  117. __entry->srr1,
  118. #endif
  119. __entry->last_inst
  120. )
  121. );
  122. TRACE_EVENT(kvm_unmap_hva,
  123. TP_PROTO(unsigned long hva),
  124. TP_ARGS(hva),
  125. TP_STRUCT__entry(
  126. __field( unsigned long, hva )
  127. ),
  128. TP_fast_assign(
  129. __entry->hva = hva;
  130. ),
  131. TP_printk("unmap hva 0x%lx\n", __entry->hva)
  132. );
  133. TRACE_EVENT(kvm_stlb_inval,
  134. TP_PROTO(unsigned int stlb_index),
  135. TP_ARGS(stlb_index),
  136. TP_STRUCT__entry(
  137. __field( unsigned int, stlb_index )
  138. ),
  139. TP_fast_assign(
  140. __entry->stlb_index = stlb_index;
  141. ),
  142. TP_printk("stlb_index %u", __entry->stlb_index)
  143. );
  144. TRACE_EVENT(kvm_stlb_write,
  145. TP_PROTO(unsigned int victim, unsigned int tid, unsigned int word0,
  146. unsigned int word1, unsigned int word2),
  147. TP_ARGS(victim, tid, word0, word1, word2),
  148. TP_STRUCT__entry(
  149. __field( unsigned int, victim )
  150. __field( unsigned int, tid )
  151. __field( unsigned int, word0 )
  152. __field( unsigned int, word1 )
  153. __field( unsigned int, word2 )
  154. ),
  155. TP_fast_assign(
  156. __entry->victim = victim;
  157. __entry->tid = tid;
  158. __entry->word0 = word0;
  159. __entry->word1 = word1;
  160. __entry->word2 = word2;
  161. ),
  162. TP_printk("victim %u tid %u w0 %u w1 %u w2 %u",
  163. __entry->victim, __entry->tid, __entry->word0,
  164. __entry->word1, __entry->word2)
  165. );
  166. TRACE_EVENT(kvm_gtlb_write,
  167. TP_PROTO(unsigned int gtlb_index, unsigned int tid, unsigned int word0,
  168. unsigned int word1, unsigned int word2),
  169. TP_ARGS(gtlb_index, tid, word0, word1, word2),
  170. TP_STRUCT__entry(
  171. __field( unsigned int, gtlb_index )
  172. __field( unsigned int, tid )
  173. __field( unsigned int, word0 )
  174. __field( unsigned int, word1 )
  175. __field( unsigned int, word2 )
  176. ),
  177. TP_fast_assign(
  178. __entry->gtlb_index = gtlb_index;
  179. __entry->tid = tid;
  180. __entry->word0 = word0;
  181. __entry->word1 = word1;
  182. __entry->word2 = word2;
  183. ),
  184. TP_printk("gtlb_index %u tid %u w0 %u w1 %u w2 %u",
  185. __entry->gtlb_index, __entry->tid, __entry->word0,
  186. __entry->word1, __entry->word2)
  187. );
  188. TRACE_EVENT(kvm_check_requests,
  189. TP_PROTO(struct kvm_vcpu *vcpu),
  190. TP_ARGS(vcpu),
  191. TP_STRUCT__entry(
  192. __field( __u32, cpu_nr )
  193. __field( __u32, requests )
  194. ),
  195. TP_fast_assign(
  196. __entry->cpu_nr = vcpu->vcpu_id;
  197. __entry->requests = vcpu->requests;
  198. ),
  199. TP_printk("vcpu=%x requests=%x",
  200. __entry->cpu_nr, __entry->requests)
  201. );
  202. /*************************************************************************
  203. * Book3S trace points *
  204. *************************************************************************/
  205. #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
  206. TRACE_EVENT(kvm_book3s_reenter,
  207. TP_PROTO(int r, struct kvm_vcpu *vcpu),
  208. TP_ARGS(r, vcpu),
  209. TP_STRUCT__entry(
  210. __field( unsigned int, r )
  211. __field( unsigned long, pc )
  212. ),
  213. TP_fast_assign(
  214. __entry->r = r;
  215. __entry->pc = kvmppc_get_pc(vcpu);
  216. ),
  217. TP_printk("reentry r=%d | pc=0x%lx", __entry->r, __entry->pc)
  218. );
  219. #ifdef CONFIG_PPC_BOOK3S_64
  220. TRACE_EVENT(kvm_book3s_64_mmu_map,
  221. TP_PROTO(int rflags, ulong hpteg, ulong va, pfn_t hpaddr,
  222. struct kvmppc_pte *orig_pte),
  223. TP_ARGS(rflags, hpteg, va, hpaddr, orig_pte),
  224. TP_STRUCT__entry(
  225. __field( unsigned char, flag_w )
  226. __field( unsigned char, flag_x )
  227. __field( unsigned long, eaddr )
  228. __field( unsigned long, hpteg )
  229. __field( unsigned long, va )
  230. __field( unsigned long long, vpage )
  231. __field( unsigned long, hpaddr )
  232. ),
  233. TP_fast_assign(
  234. __entry->flag_w = ((rflags & HPTE_R_PP) == 3) ? '-' : 'w';
  235. __entry->flag_x = (rflags & HPTE_R_N) ? '-' : 'x';
  236. __entry->eaddr = orig_pte->eaddr;
  237. __entry->hpteg = hpteg;
  238. __entry->va = va;
  239. __entry->vpage = orig_pte->vpage;
  240. __entry->hpaddr = hpaddr;
  241. ),
  242. TP_printk("KVM: %c%c Map 0x%lx: [%lx] 0x%lx (0x%llx) -> %lx",
  243. __entry->flag_w, __entry->flag_x, __entry->eaddr,
  244. __entry->hpteg, __entry->va, __entry->vpage, __entry->hpaddr)
  245. );
  246. #endif /* CONFIG_PPC_BOOK3S_64 */
  247. TRACE_EVENT(kvm_book3s_mmu_map,
  248. TP_PROTO(struct hpte_cache *pte),
  249. TP_ARGS(pte),
  250. TP_STRUCT__entry(
  251. __field( u64, host_vpn )
  252. __field( u64, pfn )
  253. __field( ulong, eaddr )
  254. __field( u64, vpage )
  255. __field( ulong, raddr )
  256. __field( int, flags )
  257. ),
  258. TP_fast_assign(
  259. __entry->host_vpn = pte->host_vpn;
  260. __entry->pfn = pte->pfn;
  261. __entry->eaddr = pte->pte.eaddr;
  262. __entry->vpage = pte->pte.vpage;
  263. __entry->raddr = pte->pte.raddr;
  264. __entry->flags = (pte->pte.may_read ? 0x4 : 0) |
  265. (pte->pte.may_write ? 0x2 : 0) |
  266. (pte->pte.may_execute ? 0x1 : 0);
  267. ),
  268. TP_printk("Map: hvpn=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]",
  269. __entry->host_vpn, __entry->pfn, __entry->eaddr,
  270. __entry->vpage, __entry->raddr, __entry->flags)
  271. );
  272. TRACE_EVENT(kvm_book3s_mmu_invalidate,
  273. TP_PROTO(struct hpte_cache *pte),
  274. TP_ARGS(pte),
  275. TP_STRUCT__entry(
  276. __field( u64, host_vpn )
  277. __field( u64, pfn )
  278. __field( ulong, eaddr )
  279. __field( u64, vpage )
  280. __field( ulong, raddr )
  281. __field( int, flags )
  282. ),
  283. TP_fast_assign(
  284. __entry->host_vpn = pte->host_vpn;
  285. __entry->pfn = pte->pfn;
  286. __entry->eaddr = pte->pte.eaddr;
  287. __entry->vpage = pte->pte.vpage;
  288. __entry->raddr = pte->pte.raddr;
  289. __entry->flags = (pte->pte.may_read ? 0x4 : 0) |
  290. (pte->pte.may_write ? 0x2 : 0) |
  291. (pte->pte.may_execute ? 0x1 : 0);
  292. ),
  293. TP_printk("Flush: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]",
  294. __entry->host_vpn, __entry->pfn, __entry->eaddr,
  295. __entry->vpage, __entry->raddr, __entry->flags)
  296. );
  297. TRACE_EVENT(kvm_book3s_mmu_flush,
  298. TP_PROTO(const char *type, struct kvm_vcpu *vcpu, unsigned long long p1,
  299. unsigned long long p2),
  300. TP_ARGS(type, vcpu, p1, p2),
  301. TP_STRUCT__entry(
  302. __field( int, count )
  303. __field( unsigned long long, p1 )
  304. __field( unsigned long long, p2 )
  305. __field( const char *, type )
  306. ),
  307. TP_fast_assign(
  308. __entry->count = to_book3s(vcpu)->hpte_cache_count;
  309. __entry->p1 = p1;
  310. __entry->p2 = p2;
  311. __entry->type = type;
  312. ),
  313. TP_printk("Flush %d %sPTEs: %llx - %llx",
  314. __entry->count, __entry->type, __entry->p1, __entry->p2)
  315. );
  316. TRACE_EVENT(kvm_book3s_slb_found,
  317. TP_PROTO(unsigned long long gvsid, unsigned long long hvsid),
  318. TP_ARGS(gvsid, hvsid),
  319. TP_STRUCT__entry(
  320. __field( unsigned long long, gvsid )
  321. __field( unsigned long long, hvsid )
  322. ),
  323. TP_fast_assign(
  324. __entry->gvsid = gvsid;
  325. __entry->hvsid = hvsid;
  326. ),
  327. TP_printk("%llx -> %llx", __entry->gvsid, __entry->hvsid)
  328. );
  329. TRACE_EVENT(kvm_book3s_slb_fail,
  330. TP_PROTO(u16 sid_map_mask, unsigned long long gvsid),
  331. TP_ARGS(sid_map_mask, gvsid),
  332. TP_STRUCT__entry(
  333. __field( unsigned short, sid_map_mask )
  334. __field( unsigned long long, gvsid )
  335. ),
  336. TP_fast_assign(
  337. __entry->sid_map_mask = sid_map_mask;
  338. __entry->gvsid = gvsid;
  339. ),
  340. TP_printk("%x/%x: %llx", __entry->sid_map_mask,
  341. SID_MAP_MASK - __entry->sid_map_mask, __entry->gvsid)
  342. );
  343. TRACE_EVENT(kvm_book3s_slb_map,
  344. TP_PROTO(u16 sid_map_mask, unsigned long long gvsid,
  345. unsigned long long hvsid),
  346. TP_ARGS(sid_map_mask, gvsid, hvsid),
  347. TP_STRUCT__entry(
  348. __field( unsigned short, sid_map_mask )
  349. __field( unsigned long long, guest_vsid )
  350. __field( unsigned long long, host_vsid )
  351. ),
  352. TP_fast_assign(
  353. __entry->sid_map_mask = sid_map_mask;
  354. __entry->guest_vsid = gvsid;
  355. __entry->host_vsid = hvsid;
  356. ),
  357. TP_printk("%x: %llx -> %llx", __entry->sid_map_mask,
  358. __entry->guest_vsid, __entry->host_vsid)
  359. );
  360. TRACE_EVENT(kvm_book3s_slbmte,
  361. TP_PROTO(u64 slb_vsid, u64 slb_esid),
  362. TP_ARGS(slb_vsid, slb_esid),
  363. TP_STRUCT__entry(
  364. __field( u64, slb_vsid )
  365. __field( u64, slb_esid )
  366. ),
  367. TP_fast_assign(
  368. __entry->slb_vsid = slb_vsid;
  369. __entry->slb_esid = slb_esid;
  370. ),
  371. TP_printk("%llx, %llx", __entry->slb_vsid, __entry->slb_esid)
  372. );
  373. #endif /* CONFIG_PPC_BOOK3S */
  374. /*************************************************************************
  375. * Book3E trace points *
  376. *************************************************************************/
  377. #ifdef CONFIG_BOOKE
  378. TRACE_EVENT(kvm_booke206_stlb_write,
  379. TP_PROTO(__u32 mas0, __u32 mas8, __u32 mas1, __u64 mas2, __u64 mas7_3),
  380. TP_ARGS(mas0, mas8, mas1, mas2, mas7_3),
  381. TP_STRUCT__entry(
  382. __field( __u32, mas0 )
  383. __field( __u32, mas8 )
  384. __field( __u32, mas1 )
  385. __field( __u64, mas2 )
  386. __field( __u64, mas7_3 )
  387. ),
  388. TP_fast_assign(
  389. __entry->mas0 = mas0;
  390. __entry->mas8 = mas8;
  391. __entry->mas1 = mas1;
  392. __entry->mas2 = mas2;
  393. __entry->mas7_3 = mas7_3;
  394. ),
  395. TP_printk("mas0=%x mas8=%x mas1=%x mas2=%llx mas7_3=%llx",
  396. __entry->mas0, __entry->mas8, __entry->mas1,
  397. __entry->mas2, __entry->mas7_3)
  398. );
  399. TRACE_EVENT(kvm_booke206_gtlb_write,
  400. TP_PROTO(__u32 mas0, __u32 mas1, __u64 mas2, __u64 mas7_3),
  401. TP_ARGS(mas0, mas1, mas2, mas7_3),
  402. TP_STRUCT__entry(
  403. __field( __u32, mas0 )
  404. __field( __u32, mas1 )
  405. __field( __u64, mas2 )
  406. __field( __u64, mas7_3 )
  407. ),
  408. TP_fast_assign(
  409. __entry->mas0 = mas0;
  410. __entry->mas1 = mas1;
  411. __entry->mas2 = mas2;
  412. __entry->mas7_3 = mas7_3;
  413. ),
  414. TP_printk("mas0=%x mas1=%x mas2=%llx mas7_3=%llx",
  415. __entry->mas0, __entry->mas1,
  416. __entry->mas2, __entry->mas7_3)
  417. );
  418. TRACE_EVENT(kvm_booke206_ref_release,
  419. TP_PROTO(__u64 pfn, __u32 flags),
  420. TP_ARGS(pfn, flags),
  421. TP_STRUCT__entry(
  422. __field( __u64, pfn )
  423. __field( __u32, flags )
  424. ),
  425. TP_fast_assign(
  426. __entry->pfn = pfn;
  427. __entry->flags = flags;
  428. ),
  429. TP_printk("pfn=%llx flags=%x",
  430. __entry->pfn, __entry->flags)
  431. );
  432. TRACE_EVENT(kvm_booke_queue_irqprio,
  433. TP_PROTO(struct kvm_vcpu *vcpu, unsigned int priority),
  434. TP_ARGS(vcpu, priority),
  435. TP_STRUCT__entry(
  436. __field( __u32, cpu_nr )
  437. __field( __u32, priority )
  438. __field( unsigned long, pending )
  439. ),
  440. TP_fast_assign(
  441. __entry->cpu_nr = vcpu->vcpu_id;
  442. __entry->priority = priority;
  443. __entry->pending = vcpu->arch.pending_exceptions;
  444. ),
  445. TP_printk("vcpu=%x prio=%x pending=%lx",
  446. __entry->cpu_nr, __entry->priority, __entry->pending)
  447. );
  448. #endif
  449. #endif /* _TRACE_KVM_H */
  450. /* This part must be outside protection */
  451. #include <trace/define_trace.h>