trace.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
  2. #define _TRACE_KVM_H
  3. #include <linux/tracepoint.h>
  4. #include <asm/sigp.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_major_guest_pfault,
  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", "major fault, maybe applicable for pfault")
  39. );
  40. TRACE_EVENT(kvm_s390_pfault_init,
  41. TP_PROTO(VCPU_PROTO_COMMON, long pfault_token),
  42. TP_ARGS(VCPU_ARGS_COMMON, pfault_token),
  43. TP_STRUCT__entry(
  44. VCPU_FIELD_COMMON
  45. __field(long, pfault_token)
  46. ),
  47. TP_fast_assign(
  48. VCPU_ASSIGN_COMMON
  49. __entry->pfault_token = pfault_token;
  50. ),
  51. VCPU_TP_PRINTK("init pfault token %ld", __entry->pfault_token)
  52. );
  53. TRACE_EVENT(kvm_s390_pfault_done,
  54. TP_PROTO(VCPU_PROTO_COMMON, long pfault_token),
  55. TP_ARGS(VCPU_ARGS_COMMON, pfault_token),
  56. TP_STRUCT__entry(
  57. VCPU_FIELD_COMMON
  58. __field(long, pfault_token)
  59. ),
  60. TP_fast_assign(
  61. VCPU_ASSIGN_COMMON
  62. __entry->pfault_token = pfault_token;
  63. ),
  64. VCPU_TP_PRINTK("done pfault token %ld", __entry->pfault_token)
  65. );
  66. /*
  67. * Tracepoints for SIE entry and exit.
  68. */
  69. TRACE_EVENT(kvm_s390_sie_enter,
  70. TP_PROTO(VCPU_PROTO_COMMON, int cpuflags),
  71. TP_ARGS(VCPU_ARGS_COMMON, cpuflags),
  72. TP_STRUCT__entry(
  73. VCPU_FIELD_COMMON
  74. __field(int, cpuflags)
  75. ),
  76. TP_fast_assign(
  77. VCPU_ASSIGN_COMMON
  78. __entry->cpuflags = cpuflags;
  79. ),
  80. VCPU_TP_PRINTK("entering sie flags %x", __entry->cpuflags)
  81. );
  82. TRACE_EVENT(kvm_s390_sie_fault,
  83. TP_PROTO(VCPU_PROTO_COMMON),
  84. TP_ARGS(VCPU_ARGS_COMMON),
  85. TP_STRUCT__entry(
  86. VCPU_FIELD_COMMON
  87. ),
  88. TP_fast_assign(
  89. VCPU_ASSIGN_COMMON
  90. ),
  91. VCPU_TP_PRINTK("%s", "fault in sie instruction")
  92. );
  93. #define sie_intercept_code \
  94. {0x04, "Instruction"}, \
  95. {0x08, "Program interruption"}, \
  96. {0x0C, "Instruction and program interruption"}, \
  97. {0x10, "External request"}, \
  98. {0x14, "External interruption"}, \
  99. {0x18, "I/O request"}, \
  100. {0x1C, "Wait state"}, \
  101. {0x20, "Validity"}, \
  102. {0x28, "Stop request"}
  103. TRACE_EVENT(kvm_s390_sie_exit,
  104. TP_PROTO(VCPU_PROTO_COMMON, u8 icptcode),
  105. TP_ARGS(VCPU_ARGS_COMMON, icptcode),
  106. TP_STRUCT__entry(
  107. VCPU_FIELD_COMMON
  108. __field(u8, icptcode)
  109. ),
  110. TP_fast_assign(
  111. VCPU_ASSIGN_COMMON
  112. __entry->icptcode = icptcode;
  113. ),
  114. VCPU_TP_PRINTK("exit sie icptcode %d (%s)", __entry->icptcode,
  115. __print_symbolic(__entry->icptcode,
  116. sie_intercept_code))
  117. );
  118. /*
  119. * Trace point for intercepted instructions.
  120. */
  121. TRACE_EVENT(kvm_s390_intercept_instruction,
  122. TP_PROTO(VCPU_PROTO_COMMON, __u16 ipa, __u32 ipb),
  123. TP_ARGS(VCPU_ARGS_COMMON, ipa, ipb),
  124. TP_STRUCT__entry(
  125. VCPU_FIELD_COMMON
  126. __field(__u64, instruction)
  127. __field(char, insn[8])
  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. insn_to_mnemonic((unsigned char *)
  137. &__entry->instruction,
  138. __entry->insn, sizeof(__entry->insn)) ?
  139. "unknown" : __entry->insn)
  140. );
  141. /*
  142. * Trace point for intercepted program interruptions.
  143. */
  144. TRACE_EVENT(kvm_s390_intercept_prog,
  145. TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
  146. TP_ARGS(VCPU_ARGS_COMMON, code),
  147. TP_STRUCT__entry(
  148. VCPU_FIELD_COMMON
  149. __field(__u16, code)
  150. ),
  151. TP_fast_assign(
  152. VCPU_ASSIGN_COMMON
  153. __entry->code = code;
  154. ),
  155. VCPU_TP_PRINTK("intercepted program interruption %04x",
  156. __entry->code)
  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. #define sigp_order_codes \
  178. {SIGP_SENSE, "sense"}, \
  179. {SIGP_EXTERNAL_CALL, "external call"}, \
  180. {SIGP_EMERGENCY_SIGNAL, "emergency signal"}, \
  181. {SIGP_STOP, "stop"}, \
  182. {SIGP_STOP_AND_STORE_STATUS, "stop and store status"}, \
  183. {SIGP_SET_ARCHITECTURE, "set architecture"}, \
  184. {SIGP_SET_PREFIX, "set prefix"}, \
  185. {SIGP_STORE_STATUS_AT_ADDRESS, "store status at addr"}, \
  186. {SIGP_SENSE_RUNNING, "sense running"}, \
  187. {SIGP_RESTART, "restart"}
  188. TRACE_EVENT(kvm_s390_handle_sigp,
  189. TP_PROTO(VCPU_PROTO_COMMON, __u8 order_code, __u16 cpu_addr, \
  190. __u32 parameter),
  191. TP_ARGS(VCPU_ARGS_COMMON, order_code, cpu_addr, parameter),
  192. TP_STRUCT__entry(
  193. VCPU_FIELD_COMMON
  194. __field(__u8, order_code)
  195. __field(__u16, cpu_addr)
  196. __field(__u32, parameter)
  197. ),
  198. TP_fast_assign(
  199. VCPU_ASSIGN_COMMON
  200. __entry->order_code = order_code;
  201. __entry->cpu_addr = cpu_addr;
  202. __entry->parameter = parameter;
  203. ),
  204. VCPU_TP_PRINTK("handle sigp order %02x (%s), cpu address %04x, " \
  205. "parameter %08x", __entry->order_code,
  206. __print_symbolic(__entry->order_code,
  207. sigp_order_codes),
  208. __entry->cpu_addr, __entry->parameter)
  209. );
  210. #define diagnose_codes \
  211. {0x10, "release pages"}, \
  212. {0x44, "time slice end"}, \
  213. {0x308, "ipl functions"}, \
  214. {0x500, "kvm hypercall"}, \
  215. {0x501, "kvm breakpoint"}
  216. TRACE_EVENT(kvm_s390_handle_diag,
  217. TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
  218. TP_ARGS(VCPU_ARGS_COMMON, code),
  219. TP_STRUCT__entry(
  220. VCPU_FIELD_COMMON
  221. __field(__u16, code)
  222. ),
  223. TP_fast_assign(
  224. VCPU_ASSIGN_COMMON
  225. __entry->code = code;
  226. ),
  227. VCPU_TP_PRINTK("handle diagnose call %04x (%s)", __entry->code,
  228. __print_symbolic(__entry->code, diagnose_codes))
  229. );
  230. TRACE_EVENT(kvm_s390_handle_lctl,
  231. TP_PROTO(VCPU_PROTO_COMMON, int g, int reg1, int reg3, u64 addr),
  232. TP_ARGS(VCPU_ARGS_COMMON, g, reg1, reg3, addr),
  233. TP_STRUCT__entry(
  234. VCPU_FIELD_COMMON
  235. __field(int, g)
  236. __field(int, reg1)
  237. __field(int, reg3)
  238. __field(u64, addr)
  239. ),
  240. TP_fast_assign(
  241. VCPU_ASSIGN_COMMON
  242. __entry->g = g;
  243. __entry->reg1 = reg1;
  244. __entry->reg3 = reg3;
  245. __entry->addr = addr;
  246. ),
  247. VCPU_TP_PRINTK("%s: loading cr %x-%x from %016llx",
  248. __entry->g ? "lctlg" : "lctl",
  249. __entry->reg1, __entry->reg3, __entry->addr)
  250. );
  251. TRACE_EVENT(kvm_s390_handle_prefix,
  252. TP_PROTO(VCPU_PROTO_COMMON, int set, u32 address),
  253. TP_ARGS(VCPU_ARGS_COMMON, set, address),
  254. TP_STRUCT__entry(
  255. VCPU_FIELD_COMMON
  256. __field(int, set)
  257. __field(u32, address)
  258. ),
  259. TP_fast_assign(
  260. VCPU_ASSIGN_COMMON
  261. __entry->set = set;
  262. __entry->address = address;
  263. ),
  264. VCPU_TP_PRINTK("%s prefix to %08x",
  265. __entry->set ? "setting" : "storing",
  266. __entry->address)
  267. );
  268. TRACE_EVENT(kvm_s390_handle_stap,
  269. TP_PROTO(VCPU_PROTO_COMMON, u64 address),
  270. TP_ARGS(VCPU_ARGS_COMMON, address),
  271. TP_STRUCT__entry(
  272. VCPU_FIELD_COMMON
  273. __field(u64, address)
  274. ),
  275. TP_fast_assign(
  276. VCPU_ASSIGN_COMMON
  277. __entry->address = address;
  278. ),
  279. VCPU_TP_PRINTK("storing cpu address to %016llx",
  280. __entry->address)
  281. );
  282. TRACE_EVENT(kvm_s390_handle_stfl,
  283. TP_PROTO(VCPU_PROTO_COMMON, unsigned int facility_list),
  284. TP_ARGS(VCPU_ARGS_COMMON, facility_list),
  285. TP_STRUCT__entry(
  286. VCPU_FIELD_COMMON
  287. __field(unsigned int, facility_list)
  288. ),
  289. TP_fast_assign(
  290. VCPU_ASSIGN_COMMON
  291. __entry->facility_list = facility_list;
  292. ),
  293. VCPU_TP_PRINTK("store facility list value %08x",
  294. __entry->facility_list)
  295. );
  296. TRACE_EVENT(kvm_s390_handle_stsi,
  297. TP_PROTO(VCPU_PROTO_COMMON, int fc, int sel1, int sel2, u64 addr),
  298. TP_ARGS(VCPU_ARGS_COMMON, fc, sel1, sel2, addr),
  299. TP_STRUCT__entry(
  300. VCPU_FIELD_COMMON
  301. __field(int, fc)
  302. __field(int, sel1)
  303. __field(int, sel2)
  304. __field(u64, addr)
  305. ),
  306. TP_fast_assign(
  307. VCPU_ASSIGN_COMMON
  308. __entry->fc = fc;
  309. __entry->sel1 = sel1;
  310. __entry->sel2 = sel2;
  311. __entry->addr = addr;
  312. ),
  313. VCPU_TP_PRINTK("STSI %d.%d.%d information stored to %016llx",
  314. __entry->fc, __entry->sel1, __entry->sel2,
  315. __entry->addr)
  316. );
  317. #endif /* _TRACE_KVM_H */
  318. /* This part must be outside protection */
  319. #include <trace/define_trace.h>