trace.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
  2. #define _TRACE_KVM_H
  3. #include <linux/tracepoint.h>
  4. #include <asm/sie.h>
  5. #include <asm/debug.h>
  6. #include <asm/dis.h>
  7. #undef TRACE_SYSTEM
  8. #define TRACE_SYSTEM kvm
  9. #define TRACE_INCLUDE_PATH .
  10. #undef TRACE_INCLUDE_FILE
  11. #define TRACE_INCLUDE_FILE trace
  12. /*
  13. * Helpers for vcpu-specific tracepoints containing the same information
  14. * as s390dbf VCPU_EVENTs.
  15. */
  16. #define VCPU_PROTO_COMMON struct kvm_vcpu *vcpu
  17. #define VCPU_ARGS_COMMON vcpu
  18. #define VCPU_FIELD_COMMON __field(int, id) \
  19. __field(unsigned long, pswmask) \
  20. __field(unsigned long, pswaddr)
  21. #define VCPU_ASSIGN_COMMON do { \
  22. __entry->id = vcpu->vcpu_id; \
  23. __entry->pswmask = vcpu->arch.sie_block->gpsw.mask; \
  24. __entry->pswaddr = vcpu->arch.sie_block->gpsw.addr; \
  25. } while (0);
  26. #define VCPU_TP_PRINTK(p_str, p_args...) \
  27. TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id, \
  28. __entry->pswmask, __entry->pswaddr, p_args)
  29. TRACE_EVENT(kvm_s390_skey_related_inst,
  30. TP_PROTO(VCPU_PROTO_COMMON),
  31. TP_ARGS(VCPU_ARGS_COMMON),
  32. TP_STRUCT__entry(
  33. VCPU_FIELD_COMMON
  34. ),
  35. TP_fast_assign(
  36. VCPU_ASSIGN_COMMON
  37. ),
  38. VCPU_TP_PRINTK("%s", "storage key related instruction")
  39. );
  40. TRACE_EVENT(kvm_s390_major_guest_pfault,
  41. TP_PROTO(VCPU_PROTO_COMMON),
  42. TP_ARGS(VCPU_ARGS_COMMON),
  43. TP_STRUCT__entry(
  44. VCPU_FIELD_COMMON
  45. ),
  46. TP_fast_assign(
  47. VCPU_ASSIGN_COMMON
  48. ),
  49. VCPU_TP_PRINTK("%s", "major fault, maybe applicable for pfault")
  50. );
  51. TRACE_EVENT(kvm_s390_pfault_init,
  52. TP_PROTO(VCPU_PROTO_COMMON, long pfault_token),
  53. TP_ARGS(VCPU_ARGS_COMMON, pfault_token),
  54. TP_STRUCT__entry(
  55. VCPU_FIELD_COMMON
  56. __field(long, pfault_token)
  57. ),
  58. TP_fast_assign(
  59. VCPU_ASSIGN_COMMON
  60. __entry->pfault_token = pfault_token;
  61. ),
  62. VCPU_TP_PRINTK("init pfault token %ld", __entry->pfault_token)
  63. );
  64. TRACE_EVENT(kvm_s390_pfault_done,
  65. TP_PROTO(VCPU_PROTO_COMMON, long pfault_token),
  66. TP_ARGS(VCPU_ARGS_COMMON, pfault_token),
  67. TP_STRUCT__entry(
  68. VCPU_FIELD_COMMON
  69. __field(long, pfault_token)
  70. ),
  71. TP_fast_assign(
  72. VCPU_ASSIGN_COMMON
  73. __entry->pfault_token = pfault_token;
  74. ),
  75. VCPU_TP_PRINTK("done pfault token %ld", __entry->pfault_token)
  76. );
  77. /*
  78. * Tracepoints for SIE entry and exit.
  79. */
  80. TRACE_EVENT(kvm_s390_sie_enter,
  81. TP_PROTO(VCPU_PROTO_COMMON, int cpuflags),
  82. TP_ARGS(VCPU_ARGS_COMMON, cpuflags),
  83. TP_STRUCT__entry(
  84. VCPU_FIELD_COMMON
  85. __field(int, cpuflags)
  86. ),
  87. TP_fast_assign(
  88. VCPU_ASSIGN_COMMON
  89. __entry->cpuflags = cpuflags;
  90. ),
  91. VCPU_TP_PRINTK("entering sie flags %x", __entry->cpuflags)
  92. );
  93. TRACE_EVENT(kvm_s390_sie_fault,
  94. TP_PROTO(VCPU_PROTO_COMMON),
  95. TP_ARGS(VCPU_ARGS_COMMON),
  96. TP_STRUCT__entry(
  97. VCPU_FIELD_COMMON
  98. ),
  99. TP_fast_assign(
  100. VCPU_ASSIGN_COMMON
  101. ),
  102. VCPU_TP_PRINTK("%s", "fault in sie instruction")
  103. );
  104. TRACE_EVENT(kvm_s390_sie_exit,
  105. TP_PROTO(VCPU_PROTO_COMMON, u8 icptcode),
  106. TP_ARGS(VCPU_ARGS_COMMON, icptcode),
  107. TP_STRUCT__entry(
  108. VCPU_FIELD_COMMON
  109. __field(u8, icptcode)
  110. ),
  111. TP_fast_assign(
  112. VCPU_ASSIGN_COMMON
  113. __entry->icptcode = icptcode;
  114. ),
  115. VCPU_TP_PRINTK("exit sie icptcode %d (%s)", __entry->icptcode,
  116. __print_symbolic(__entry->icptcode,
  117. sie_intercept_code))
  118. );
  119. /*
  120. * Trace point for intercepted instructions.
  121. */
  122. TRACE_EVENT(kvm_s390_intercept_instruction,
  123. TP_PROTO(VCPU_PROTO_COMMON, __u16 ipa, __u32 ipb),
  124. TP_ARGS(VCPU_ARGS_COMMON, ipa, ipb),
  125. TP_STRUCT__entry(
  126. VCPU_FIELD_COMMON
  127. __field(__u64, instruction)
  128. ),
  129. TP_fast_assign(
  130. VCPU_ASSIGN_COMMON
  131. __entry->instruction = ((__u64)ipa << 48) |
  132. ((__u64)ipb << 16);
  133. ),
  134. VCPU_TP_PRINTK("intercepted instruction %016llx (%s)",
  135. __entry->instruction,
  136. __print_symbolic(icpt_insn_decoder(__entry->instruction),
  137. icpt_insn_codes))
  138. );
  139. /*
  140. * Trace point for intercepted program interruptions.
  141. */
  142. TRACE_EVENT(kvm_s390_intercept_prog,
  143. TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
  144. TP_ARGS(VCPU_ARGS_COMMON, code),
  145. TP_STRUCT__entry(
  146. VCPU_FIELD_COMMON
  147. __field(__u16, code)
  148. ),
  149. TP_fast_assign(
  150. VCPU_ASSIGN_COMMON
  151. __entry->code = code;
  152. ),
  153. VCPU_TP_PRINTK("intercepted program interruption %04x (%s)",
  154. __entry->code,
  155. __print_symbolic(__entry->code,
  156. icpt_prog_codes))
  157. );
  158. /*
  159. * Trace point for validity intercepts.
  160. */
  161. TRACE_EVENT(kvm_s390_intercept_validity,
  162. TP_PROTO(VCPU_PROTO_COMMON, __u16 viwhy),
  163. TP_ARGS(VCPU_ARGS_COMMON, viwhy),
  164. TP_STRUCT__entry(
  165. VCPU_FIELD_COMMON
  166. __field(__u16, viwhy)
  167. ),
  168. TP_fast_assign(
  169. VCPU_ASSIGN_COMMON
  170. __entry->viwhy = viwhy;
  171. ),
  172. VCPU_TP_PRINTK("got validity intercept %04x", __entry->viwhy)
  173. );
  174. /*
  175. * Trace points for instructions that are of special interest.
  176. */
  177. TRACE_EVENT(kvm_s390_handle_sigp,
  178. TP_PROTO(VCPU_PROTO_COMMON, __u8 order_code, __u16 cpu_addr, \
  179. __u32 parameter),
  180. TP_ARGS(VCPU_ARGS_COMMON, order_code, cpu_addr, parameter),
  181. TP_STRUCT__entry(
  182. VCPU_FIELD_COMMON
  183. __field(__u8, order_code)
  184. __field(__u16, cpu_addr)
  185. __field(__u32, parameter)
  186. ),
  187. TP_fast_assign(
  188. VCPU_ASSIGN_COMMON
  189. __entry->order_code = order_code;
  190. __entry->cpu_addr = cpu_addr;
  191. __entry->parameter = parameter;
  192. ),
  193. VCPU_TP_PRINTK("handle sigp order %02x (%s), cpu address %04x, " \
  194. "parameter %08x", __entry->order_code,
  195. __print_symbolic(__entry->order_code,
  196. sigp_order_codes),
  197. __entry->cpu_addr, __entry->parameter)
  198. );
  199. TRACE_EVENT(kvm_s390_handle_sigp_pei,
  200. TP_PROTO(VCPU_PROTO_COMMON, __u8 order_code, __u16 cpu_addr),
  201. TP_ARGS(VCPU_ARGS_COMMON, order_code, cpu_addr),
  202. TP_STRUCT__entry(
  203. VCPU_FIELD_COMMON
  204. __field(__u8, order_code)
  205. __field(__u16, cpu_addr)
  206. ),
  207. TP_fast_assign(
  208. VCPU_ASSIGN_COMMON
  209. __entry->order_code = order_code;
  210. __entry->cpu_addr = cpu_addr;
  211. ),
  212. VCPU_TP_PRINTK("handle sigp pei order %02x (%s), cpu address %04x",
  213. __entry->order_code,
  214. __print_symbolic(__entry->order_code,
  215. sigp_order_codes),
  216. __entry->cpu_addr)
  217. );
  218. TRACE_EVENT(kvm_s390_handle_diag,
  219. TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
  220. TP_ARGS(VCPU_ARGS_COMMON, code),
  221. TP_STRUCT__entry(
  222. VCPU_FIELD_COMMON
  223. __field(__u16, code)
  224. ),
  225. TP_fast_assign(
  226. VCPU_ASSIGN_COMMON
  227. __entry->code = code;
  228. ),
  229. VCPU_TP_PRINTK("handle diagnose call %04x (%s)", __entry->code,
  230. __print_symbolic(__entry->code, diagnose_codes))
  231. );
  232. TRACE_EVENT(kvm_s390_handle_lctl,
  233. TP_PROTO(VCPU_PROTO_COMMON, int g, int reg1, int reg3, u64 addr),
  234. TP_ARGS(VCPU_ARGS_COMMON, g, reg1, reg3, addr),
  235. TP_STRUCT__entry(
  236. VCPU_FIELD_COMMON
  237. __field(int, g)
  238. __field(int, reg1)
  239. __field(int, reg3)
  240. __field(u64, addr)
  241. ),
  242. TP_fast_assign(
  243. VCPU_ASSIGN_COMMON
  244. __entry->g = g;
  245. __entry->reg1 = reg1;
  246. __entry->reg3 = reg3;
  247. __entry->addr = addr;
  248. ),
  249. VCPU_TP_PRINTK("%s: loading cr %x-%x from %016llx",
  250. __entry->g ? "lctlg" : "lctl",
  251. __entry->reg1, __entry->reg3, __entry->addr)
  252. );
  253. TRACE_EVENT(kvm_s390_handle_stctl,
  254. TP_PROTO(VCPU_PROTO_COMMON, int g, int reg1, int reg3, u64 addr),
  255. TP_ARGS(VCPU_ARGS_COMMON, g, reg1, reg3, addr),
  256. TP_STRUCT__entry(
  257. VCPU_FIELD_COMMON
  258. __field(int, g)
  259. __field(int, reg1)
  260. __field(int, reg3)
  261. __field(u64, addr)
  262. ),
  263. TP_fast_assign(
  264. VCPU_ASSIGN_COMMON
  265. __entry->g = g;
  266. __entry->reg1 = reg1;
  267. __entry->reg3 = reg3;
  268. __entry->addr = addr;
  269. ),
  270. VCPU_TP_PRINTK("%s: storing cr %x-%x to %016llx",
  271. __entry->g ? "stctg" : "stctl",
  272. __entry->reg1, __entry->reg3, __entry->addr)
  273. );
  274. TRACE_EVENT(kvm_s390_handle_prefix,
  275. TP_PROTO(VCPU_PROTO_COMMON, int set, u32 address),
  276. TP_ARGS(VCPU_ARGS_COMMON, set, address),
  277. TP_STRUCT__entry(
  278. VCPU_FIELD_COMMON
  279. __field(int, set)
  280. __field(u32, address)
  281. ),
  282. TP_fast_assign(
  283. VCPU_ASSIGN_COMMON
  284. __entry->set = set;
  285. __entry->address = address;
  286. ),
  287. VCPU_TP_PRINTK("%s prefix to %08x",
  288. __entry->set ? "setting" : "storing",
  289. __entry->address)
  290. );
  291. TRACE_EVENT(kvm_s390_handle_stap,
  292. TP_PROTO(VCPU_PROTO_COMMON, u64 address),
  293. TP_ARGS(VCPU_ARGS_COMMON, address),
  294. TP_STRUCT__entry(
  295. VCPU_FIELD_COMMON
  296. __field(u64, address)
  297. ),
  298. TP_fast_assign(
  299. VCPU_ASSIGN_COMMON
  300. __entry->address = address;
  301. ),
  302. VCPU_TP_PRINTK("storing cpu address to %016llx",
  303. __entry->address)
  304. );
  305. TRACE_EVENT(kvm_s390_handle_stfl,
  306. TP_PROTO(VCPU_PROTO_COMMON, unsigned int facility_list),
  307. TP_ARGS(VCPU_ARGS_COMMON, facility_list),
  308. TP_STRUCT__entry(
  309. VCPU_FIELD_COMMON
  310. __field(unsigned int, facility_list)
  311. ),
  312. TP_fast_assign(
  313. VCPU_ASSIGN_COMMON
  314. __entry->facility_list = facility_list;
  315. ),
  316. VCPU_TP_PRINTK("store facility list value %08x",
  317. __entry->facility_list)
  318. );
  319. TRACE_EVENT(kvm_s390_handle_stsi,
  320. TP_PROTO(VCPU_PROTO_COMMON, int fc, int sel1, int sel2, u64 addr),
  321. TP_ARGS(VCPU_ARGS_COMMON, fc, sel1, sel2, addr),
  322. TP_STRUCT__entry(
  323. VCPU_FIELD_COMMON
  324. __field(int, fc)
  325. __field(int, sel1)
  326. __field(int, sel2)
  327. __field(u64, addr)
  328. ),
  329. TP_fast_assign(
  330. VCPU_ASSIGN_COMMON
  331. __entry->fc = fc;
  332. __entry->sel1 = sel1;
  333. __entry->sel2 = sel2;
  334. __entry->addr = addr;
  335. ),
  336. VCPU_TP_PRINTK("STSI %d.%d.%d information stored to %016llx",
  337. __entry->fc, __entry->sel1, __entry->sel2,
  338. __entry->addr)
  339. );
  340. TRACE_EVENT(kvm_s390_handle_operexc,
  341. TP_PROTO(VCPU_PROTO_COMMON, __u16 ipa, __u32 ipb),
  342. TP_ARGS(VCPU_ARGS_COMMON, ipa, ipb),
  343. TP_STRUCT__entry(
  344. VCPU_FIELD_COMMON
  345. __field(__u64, instruction)
  346. ),
  347. TP_fast_assign(
  348. VCPU_ASSIGN_COMMON
  349. __entry->instruction = ((__u64)ipa << 48) |
  350. ((__u64)ipb << 16);
  351. ),
  352. VCPU_TP_PRINTK("operation exception on instruction %016llx (%s)",
  353. __entry->instruction,
  354. __print_symbolic(icpt_insn_decoder(__entry->instruction),
  355. icpt_insn_codes))
  356. );
  357. TRACE_EVENT(kvm_s390_handle_sthyi,
  358. TP_PROTO(VCPU_PROTO_COMMON, u64 code, u64 addr),
  359. TP_ARGS(VCPU_ARGS_COMMON, code, addr),
  360. TP_STRUCT__entry(
  361. VCPU_FIELD_COMMON
  362. __field(u64, code)
  363. __field(u64, addr)
  364. ),
  365. TP_fast_assign(
  366. VCPU_ASSIGN_COMMON
  367. __entry->code = code;
  368. __entry->addr = addr;
  369. ),
  370. VCPU_TP_PRINTK("STHYI fc: %llu addr: %016llx",
  371. __entry->code, __entry->addr)
  372. );
  373. #endif /* _TRACE_KVM_H */
  374. /* This part must be outside protection */
  375. #include <trace/define_trace.h>