trace.h 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
  3. #define _TRACE_KVM_H
  4. #include <linux/tracepoint.h>
  5. #include <asm/vmx.h>
  6. #include <asm/svm.h>
  7. #include <asm/clocksource.h>
  8. #include <asm/pvclock-abi.h>
  9. #undef TRACE_SYSTEM
  10. #define TRACE_SYSTEM kvm
  11. /*
  12. * Tracepoint for guest mode entry.
  13. */
  14. TRACE_EVENT(kvm_entry,
  15. TP_PROTO(struct kvm_vcpu *vcpu),
  16. TP_ARGS(vcpu),
  17. TP_STRUCT__entry(
  18. __field( unsigned int, vcpu_id )
  19. __field( unsigned long, rip )
  20. ),
  21. TP_fast_assign(
  22. __entry->vcpu_id = vcpu->vcpu_id;
  23. __entry->rip = kvm_rip_read(vcpu);
  24. ),
  25. TP_printk("vcpu %u, rip 0x%lx", __entry->vcpu_id, __entry->rip)
  26. );
  27. /*
  28. * Tracepoint for hypercall.
  29. */
  30. TRACE_EVENT(kvm_hypercall,
  31. TP_PROTO(unsigned long nr, unsigned long a0, unsigned long a1,
  32. unsigned long a2, unsigned long a3),
  33. TP_ARGS(nr, a0, a1, a2, a3),
  34. TP_STRUCT__entry(
  35. __field( unsigned long, nr )
  36. __field( unsigned long, a0 )
  37. __field( unsigned long, a1 )
  38. __field( unsigned long, a2 )
  39. __field( unsigned long, a3 )
  40. ),
  41. TP_fast_assign(
  42. __entry->nr = nr;
  43. __entry->a0 = a0;
  44. __entry->a1 = a1;
  45. __entry->a2 = a2;
  46. __entry->a3 = a3;
  47. ),
  48. TP_printk("nr 0x%lx a0 0x%lx a1 0x%lx a2 0x%lx a3 0x%lx",
  49. __entry->nr, __entry->a0, __entry->a1, __entry->a2,
  50. __entry->a3)
  51. );
  52. /*
  53. * Tracepoint for hypercall.
  54. */
  55. TRACE_EVENT(kvm_hv_hypercall,
  56. TP_PROTO(__u16 code, bool fast, __u16 rep_cnt, __u16 rep_idx,
  57. __u64 ingpa, __u64 outgpa),
  58. TP_ARGS(code, fast, rep_cnt, rep_idx, ingpa, outgpa),
  59. TP_STRUCT__entry(
  60. __field( __u16, rep_cnt )
  61. __field( __u16, rep_idx )
  62. __field( __u64, ingpa )
  63. __field( __u64, outgpa )
  64. __field( __u16, code )
  65. __field( bool, fast )
  66. ),
  67. TP_fast_assign(
  68. __entry->rep_cnt = rep_cnt;
  69. __entry->rep_idx = rep_idx;
  70. __entry->ingpa = ingpa;
  71. __entry->outgpa = outgpa;
  72. __entry->code = code;
  73. __entry->fast = fast;
  74. ),
  75. TP_printk("code 0x%x %s cnt 0x%x idx 0x%x in 0x%llx out 0x%llx",
  76. __entry->code, __entry->fast ? "fast" : "slow",
  77. __entry->rep_cnt, __entry->rep_idx, __entry->ingpa,
  78. __entry->outgpa)
  79. );
  80. /*
  81. * Tracepoint for PIO.
  82. */
  83. #define KVM_PIO_IN 0
  84. #define KVM_PIO_OUT 1
  85. TRACE_EVENT(kvm_pio,
  86. TP_PROTO(unsigned int rw, unsigned int port, unsigned int size,
  87. unsigned int count, void *data),
  88. TP_ARGS(rw, port, size, count, data),
  89. TP_STRUCT__entry(
  90. __field( unsigned int, rw )
  91. __field( unsigned int, port )
  92. __field( unsigned int, size )
  93. __field( unsigned int, count )
  94. __field( unsigned int, val )
  95. ),
  96. TP_fast_assign(
  97. __entry->rw = rw;
  98. __entry->port = port;
  99. __entry->size = size;
  100. __entry->count = count;
  101. if (size == 1)
  102. __entry->val = *(unsigned char *)data;
  103. else if (size == 2)
  104. __entry->val = *(unsigned short *)data;
  105. else
  106. __entry->val = *(unsigned int *)data;
  107. ),
  108. TP_printk("pio_%s at 0x%x size %d count %d val 0x%x %s",
  109. __entry->rw ? "write" : "read",
  110. __entry->port, __entry->size, __entry->count, __entry->val,
  111. __entry->count > 1 ? "(...)" : "")
  112. );
  113. /*
  114. * Tracepoint for fast mmio.
  115. */
  116. TRACE_EVENT(kvm_fast_mmio,
  117. TP_PROTO(u64 gpa),
  118. TP_ARGS(gpa),
  119. TP_STRUCT__entry(
  120. __field(u64, gpa)
  121. ),
  122. TP_fast_assign(
  123. __entry->gpa = gpa;
  124. ),
  125. TP_printk("fast mmio at gpa 0x%llx", __entry->gpa)
  126. );
  127. /*
  128. * Tracepoint for cpuid.
  129. */
  130. TRACE_EVENT(kvm_cpuid,
  131. TP_PROTO(unsigned int function, unsigned int index, unsigned long rax,
  132. unsigned long rbx, unsigned long rcx, unsigned long rdx,
  133. bool found, bool used_max_basic),
  134. TP_ARGS(function, index, rax, rbx, rcx, rdx, found, used_max_basic),
  135. TP_STRUCT__entry(
  136. __field( unsigned int, function )
  137. __field( unsigned int, index )
  138. __field( unsigned long, rax )
  139. __field( unsigned long, rbx )
  140. __field( unsigned long, rcx )
  141. __field( unsigned long, rdx )
  142. __field( bool, found )
  143. __field( bool, used_max_basic )
  144. ),
  145. TP_fast_assign(
  146. __entry->function = function;
  147. __entry->index = index;
  148. __entry->rax = rax;
  149. __entry->rbx = rbx;
  150. __entry->rcx = rcx;
  151. __entry->rdx = rdx;
  152. __entry->found = found;
  153. __entry->used_max_basic = used_max_basic;
  154. ),
  155. TP_printk("func %x idx %x rax %lx rbx %lx rcx %lx rdx %lx, cpuid entry %s%s",
  156. __entry->function, __entry->index, __entry->rax,
  157. __entry->rbx, __entry->rcx, __entry->rdx,
  158. __entry->found ? "found" : "not found",
  159. __entry->used_max_basic ? ", used max basic" : "")
  160. );
  161. #define AREG(x) { APIC_##x, "APIC_" #x }
  162. #define kvm_trace_symbol_apic \
  163. AREG(ID), AREG(LVR), AREG(TASKPRI), AREG(ARBPRI), AREG(PROCPRI), \
  164. AREG(EOI), AREG(RRR), AREG(LDR), AREG(DFR), AREG(SPIV), AREG(ISR), \
  165. AREG(TMR), AREG(IRR), AREG(ESR), AREG(ICR), AREG(ICR2), AREG(LVTT), \
  166. AREG(LVTTHMR), AREG(LVTPC), AREG(LVT0), AREG(LVT1), AREG(LVTERR), \
  167. AREG(TMICT), AREG(TMCCT), AREG(TDCR), AREG(SELF_IPI), AREG(EFEAT), \
  168. AREG(ECTRL)
  169. /*
  170. * Tracepoint for apic access.
  171. */
  172. TRACE_EVENT(kvm_apic,
  173. TP_PROTO(unsigned int rw, unsigned int reg, unsigned int val),
  174. TP_ARGS(rw, reg, val),
  175. TP_STRUCT__entry(
  176. __field( unsigned int, rw )
  177. __field( unsigned int, reg )
  178. __field( unsigned int, val )
  179. ),
  180. TP_fast_assign(
  181. __entry->rw = rw;
  182. __entry->reg = reg;
  183. __entry->val = val;
  184. ),
  185. TP_printk("apic_%s %s = 0x%x",
  186. __entry->rw ? "write" : "read",
  187. __print_symbolic(__entry->reg, kvm_trace_symbol_apic),
  188. __entry->val)
  189. );
  190. #define trace_kvm_apic_read(reg, val) trace_kvm_apic(0, reg, val)
  191. #define trace_kvm_apic_write(reg, val) trace_kvm_apic(1, reg, val)
  192. #define KVM_ISA_VMX 1
  193. #define KVM_ISA_SVM 2
  194. #define kvm_print_exit_reason(exit_reason, isa) \
  195. (isa == KVM_ISA_VMX) ? \
  196. __print_symbolic(exit_reason & 0xffff, VMX_EXIT_REASONS) : \
  197. __print_symbolic(exit_reason, SVM_EXIT_REASONS), \
  198. (isa == KVM_ISA_VMX && exit_reason & ~0xffff) ? " " : "", \
  199. (isa == KVM_ISA_VMX) ? \
  200. __print_flags(exit_reason & ~0xffff, " ", VMX_EXIT_REASON_FLAGS) : ""
  201. #define TRACE_EVENT_KVM_EXIT(name) \
  202. TRACE_EVENT(name, \
  203. TP_PROTO(unsigned int exit_reason, struct kvm_vcpu *vcpu, u32 isa), \
  204. TP_ARGS(exit_reason, vcpu, isa), \
  205. \
  206. TP_STRUCT__entry( \
  207. __field( unsigned int, exit_reason ) \
  208. __field( unsigned long, guest_rip ) \
  209. __field( u32, isa ) \
  210. __field( u64, info1 ) \
  211. __field( u64, info2 ) \
  212. __field( u32, intr_info ) \
  213. __field( u32, error_code ) \
  214. __field( unsigned int, vcpu_id ) \
  215. ), \
  216. \
  217. TP_fast_assign( \
  218. __entry->exit_reason = exit_reason; \
  219. __entry->guest_rip = kvm_rip_read(vcpu); \
  220. __entry->isa = isa; \
  221. __entry->vcpu_id = vcpu->vcpu_id; \
  222. kvm_x86_ops.get_exit_info(vcpu, &__entry->info1, \
  223. &__entry->info2, \
  224. &__entry->intr_info, \
  225. &__entry->error_code); \
  226. ), \
  227. \
  228. TP_printk("vcpu %u reason %s%s%s rip 0x%lx info1 0x%016llx " \
  229. "info2 0x%016llx intr_info 0x%08x error_code 0x%08x", \
  230. __entry->vcpu_id, \
  231. kvm_print_exit_reason(__entry->exit_reason, __entry->isa), \
  232. __entry->guest_rip, __entry->info1, __entry->info2, \
  233. __entry->intr_info, __entry->error_code) \
  234. )
  235. /*
  236. * Tracepoint for kvm guest exit:
  237. */
  238. TRACE_EVENT_KVM_EXIT(kvm_exit);
  239. /*
  240. * Tracepoint for kvm interrupt injection:
  241. */
  242. TRACE_EVENT(kvm_inj_virq,
  243. TP_PROTO(unsigned int irq),
  244. TP_ARGS(irq),
  245. TP_STRUCT__entry(
  246. __field( unsigned int, irq )
  247. ),
  248. TP_fast_assign(
  249. __entry->irq = irq;
  250. ),
  251. TP_printk("irq %u", __entry->irq)
  252. );
  253. #define EXS(x) { x##_VECTOR, "#" #x }
  254. #define kvm_trace_sym_exc \
  255. EXS(DE), EXS(DB), EXS(BP), EXS(OF), EXS(BR), EXS(UD), EXS(NM), \
  256. EXS(DF), EXS(TS), EXS(NP), EXS(SS), EXS(GP), EXS(PF), \
  257. EXS(MF), EXS(AC), EXS(MC)
  258. /*
  259. * Tracepoint for kvm interrupt injection:
  260. */
  261. TRACE_EVENT(kvm_inj_exception,
  262. TP_PROTO(unsigned exception, bool has_error, unsigned error_code),
  263. TP_ARGS(exception, has_error, error_code),
  264. TP_STRUCT__entry(
  265. __field( u8, exception )
  266. __field( u8, has_error )
  267. __field( u32, error_code )
  268. ),
  269. TP_fast_assign(
  270. __entry->exception = exception;
  271. __entry->has_error = has_error;
  272. __entry->error_code = error_code;
  273. ),
  274. TP_printk("%s (0x%x)",
  275. __print_symbolic(__entry->exception, kvm_trace_sym_exc),
  276. /* FIXME: don't print error_code if not present */
  277. __entry->has_error ? __entry->error_code : 0)
  278. );
  279. /*
  280. * Tracepoint for page fault.
  281. */
  282. TRACE_EVENT(kvm_page_fault,
  283. TP_PROTO(unsigned long fault_address, unsigned int error_code),
  284. TP_ARGS(fault_address, error_code),
  285. TP_STRUCT__entry(
  286. __field( unsigned long, fault_address )
  287. __field( unsigned int, error_code )
  288. ),
  289. TP_fast_assign(
  290. __entry->fault_address = fault_address;
  291. __entry->error_code = error_code;
  292. ),
  293. TP_printk("address %lx error_code %x",
  294. __entry->fault_address, __entry->error_code)
  295. );
  296. /*
  297. * Tracepoint for guest MSR access.
  298. */
  299. TRACE_EVENT(kvm_msr,
  300. TP_PROTO(unsigned write, u32 ecx, u64 data, bool exception),
  301. TP_ARGS(write, ecx, data, exception),
  302. TP_STRUCT__entry(
  303. __field( unsigned, write )
  304. __field( u32, ecx )
  305. __field( u64, data )
  306. __field( u8, exception )
  307. ),
  308. TP_fast_assign(
  309. __entry->write = write;
  310. __entry->ecx = ecx;
  311. __entry->data = data;
  312. __entry->exception = exception;
  313. ),
  314. TP_printk("msr_%s %x = 0x%llx%s",
  315. __entry->write ? "write" : "read",
  316. __entry->ecx, __entry->data,
  317. __entry->exception ? " (#GP)" : "")
  318. );
  319. #define trace_kvm_msr_read(ecx, data) trace_kvm_msr(0, ecx, data, false)
  320. #define trace_kvm_msr_write(ecx, data) trace_kvm_msr(1, ecx, data, false)
  321. #define trace_kvm_msr_read_ex(ecx) trace_kvm_msr(0, ecx, 0, true)
  322. #define trace_kvm_msr_write_ex(ecx, data) trace_kvm_msr(1, ecx, data, true)
  323. /*
  324. * Tracepoint for guest CR access.
  325. */
  326. TRACE_EVENT(kvm_cr,
  327. TP_PROTO(unsigned int rw, unsigned int cr, unsigned long val),
  328. TP_ARGS(rw, cr, val),
  329. TP_STRUCT__entry(
  330. __field( unsigned int, rw )
  331. __field( unsigned int, cr )
  332. __field( unsigned long, val )
  333. ),
  334. TP_fast_assign(
  335. __entry->rw = rw;
  336. __entry->cr = cr;
  337. __entry->val = val;
  338. ),
  339. TP_printk("cr_%s %x = 0x%lx",
  340. __entry->rw ? "write" : "read",
  341. __entry->cr, __entry->val)
  342. );
  343. #define trace_kvm_cr_read(cr, val) trace_kvm_cr(0, cr, val)
  344. #define trace_kvm_cr_write(cr, val) trace_kvm_cr(1, cr, val)
  345. TRACE_EVENT(kvm_pic_set_irq,
  346. TP_PROTO(__u8 chip, __u8 pin, __u8 elcr, __u8 imr, bool coalesced),
  347. TP_ARGS(chip, pin, elcr, imr, coalesced),
  348. TP_STRUCT__entry(
  349. __field( __u8, chip )
  350. __field( __u8, pin )
  351. __field( __u8, elcr )
  352. __field( __u8, imr )
  353. __field( bool, coalesced )
  354. ),
  355. TP_fast_assign(
  356. __entry->chip = chip;
  357. __entry->pin = pin;
  358. __entry->elcr = elcr;
  359. __entry->imr = imr;
  360. __entry->coalesced = coalesced;
  361. ),
  362. TP_printk("chip %u pin %u (%s%s)%s",
  363. __entry->chip, __entry->pin,
  364. (__entry->elcr & (1 << __entry->pin)) ? "level":"edge",
  365. (__entry->imr & (1 << __entry->pin)) ? "|masked":"",
  366. __entry->coalesced ? " (coalesced)" : "")
  367. );
  368. #define kvm_apic_dst_shorthand \
  369. {0x0, "dst"}, \
  370. {0x1, "self"}, \
  371. {0x2, "all"}, \
  372. {0x3, "all-but-self"}
  373. TRACE_EVENT(kvm_apic_ipi,
  374. TP_PROTO(__u32 icr_low, __u32 dest_id),
  375. TP_ARGS(icr_low, dest_id),
  376. TP_STRUCT__entry(
  377. __field( __u32, icr_low )
  378. __field( __u32, dest_id )
  379. ),
  380. TP_fast_assign(
  381. __entry->icr_low = icr_low;
  382. __entry->dest_id = dest_id;
  383. ),
  384. TP_printk("dst %x vec %u (%s|%s|%s|%s|%s)",
  385. __entry->dest_id, (u8)__entry->icr_low,
  386. __print_symbolic((__entry->icr_low >> 8 & 0x7),
  387. kvm_deliver_mode),
  388. (__entry->icr_low & (1<<11)) ? "logical" : "physical",
  389. (__entry->icr_low & (1<<14)) ? "assert" : "de-assert",
  390. (__entry->icr_low & (1<<15)) ? "level" : "edge",
  391. __print_symbolic((__entry->icr_low >> 18 & 0x3),
  392. kvm_apic_dst_shorthand))
  393. );
  394. TRACE_EVENT(kvm_apic_accept_irq,
  395. TP_PROTO(__u32 apicid, __u16 dm, __u16 tm, __u8 vec),
  396. TP_ARGS(apicid, dm, tm, vec),
  397. TP_STRUCT__entry(
  398. __field( __u32, apicid )
  399. __field( __u16, dm )
  400. __field( __u16, tm )
  401. __field( __u8, vec )
  402. ),
  403. TP_fast_assign(
  404. __entry->apicid = apicid;
  405. __entry->dm = dm;
  406. __entry->tm = tm;
  407. __entry->vec = vec;
  408. ),
  409. TP_printk("apicid %x vec %u (%s|%s)",
  410. __entry->apicid, __entry->vec,
  411. __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
  412. __entry->tm ? "level" : "edge")
  413. );
  414. TRACE_EVENT(kvm_eoi,
  415. TP_PROTO(struct kvm_lapic *apic, int vector),
  416. TP_ARGS(apic, vector),
  417. TP_STRUCT__entry(
  418. __field( __u32, apicid )
  419. __field( int, vector )
  420. ),
  421. TP_fast_assign(
  422. __entry->apicid = apic->vcpu->vcpu_id;
  423. __entry->vector = vector;
  424. ),
  425. TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
  426. );
  427. TRACE_EVENT(kvm_pv_eoi,
  428. TP_PROTO(struct kvm_lapic *apic, int vector),
  429. TP_ARGS(apic, vector),
  430. TP_STRUCT__entry(
  431. __field( __u32, apicid )
  432. __field( int, vector )
  433. ),
  434. TP_fast_assign(
  435. __entry->apicid = apic->vcpu->vcpu_id;
  436. __entry->vector = vector;
  437. ),
  438. TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
  439. );
  440. /*
  441. * Tracepoint for nested VMRUN
  442. */
  443. TRACE_EVENT(kvm_nested_vmrun,
  444. TP_PROTO(__u64 rip, __u64 vmcb, __u64 nested_rip, __u32 int_ctl,
  445. __u32 event_inj, bool npt),
  446. TP_ARGS(rip, vmcb, nested_rip, int_ctl, event_inj, npt),
  447. TP_STRUCT__entry(
  448. __field( __u64, rip )
  449. __field( __u64, vmcb )
  450. __field( __u64, nested_rip )
  451. __field( __u32, int_ctl )
  452. __field( __u32, event_inj )
  453. __field( bool, npt )
  454. ),
  455. TP_fast_assign(
  456. __entry->rip = rip;
  457. __entry->vmcb = vmcb;
  458. __entry->nested_rip = nested_rip;
  459. __entry->int_ctl = int_ctl;
  460. __entry->event_inj = event_inj;
  461. __entry->npt = npt;
  462. ),
  463. TP_printk("rip: 0x%016llx vmcb: 0x%016llx nrip: 0x%016llx int_ctl: 0x%08x "
  464. "event_inj: 0x%08x npt: %s",
  465. __entry->rip, __entry->vmcb, __entry->nested_rip,
  466. __entry->int_ctl, __entry->event_inj,
  467. __entry->npt ? "on" : "off")
  468. );
  469. TRACE_EVENT(kvm_nested_intercepts,
  470. TP_PROTO(__u16 cr_read, __u16 cr_write, __u32 exceptions,
  471. __u32 intercept1, __u32 intercept2, __u32 intercept3),
  472. TP_ARGS(cr_read, cr_write, exceptions, intercept1,
  473. intercept2, intercept3),
  474. TP_STRUCT__entry(
  475. __field( __u16, cr_read )
  476. __field( __u16, cr_write )
  477. __field( __u32, exceptions )
  478. __field( __u32, intercept1 )
  479. __field( __u32, intercept2 )
  480. __field( __u32, intercept3 )
  481. ),
  482. TP_fast_assign(
  483. __entry->cr_read = cr_read;
  484. __entry->cr_write = cr_write;
  485. __entry->exceptions = exceptions;
  486. __entry->intercept1 = intercept1;
  487. __entry->intercept2 = intercept2;
  488. __entry->intercept3 = intercept3;
  489. ),
  490. TP_printk("cr_read: %04x cr_write: %04x excp: %08x "
  491. "intercepts: %08x %08x %08x",
  492. __entry->cr_read, __entry->cr_write, __entry->exceptions,
  493. __entry->intercept1, __entry->intercept2, __entry->intercept3)
  494. );
  495. /*
  496. * Tracepoint for #VMEXIT while nested
  497. */
  498. TRACE_EVENT_KVM_EXIT(kvm_nested_vmexit);
  499. /*
  500. * Tracepoint for #VMEXIT reinjected to the guest
  501. */
  502. TRACE_EVENT(kvm_nested_vmexit_inject,
  503. TP_PROTO(__u32 exit_code,
  504. __u64 exit_info1, __u64 exit_info2,
  505. __u32 exit_int_info, __u32 exit_int_info_err, __u32 isa),
  506. TP_ARGS(exit_code, exit_info1, exit_info2,
  507. exit_int_info, exit_int_info_err, isa),
  508. TP_STRUCT__entry(
  509. __field( __u32, exit_code )
  510. __field( __u64, exit_info1 )
  511. __field( __u64, exit_info2 )
  512. __field( __u32, exit_int_info )
  513. __field( __u32, exit_int_info_err )
  514. __field( __u32, isa )
  515. ),
  516. TP_fast_assign(
  517. __entry->exit_code = exit_code;
  518. __entry->exit_info1 = exit_info1;
  519. __entry->exit_info2 = exit_info2;
  520. __entry->exit_int_info = exit_int_info;
  521. __entry->exit_int_info_err = exit_int_info_err;
  522. __entry->isa = isa;
  523. ),
  524. TP_printk("reason: %s%s%s ext_inf1: 0x%016llx "
  525. "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x",
  526. kvm_print_exit_reason(__entry->exit_code, __entry->isa),
  527. __entry->exit_info1, __entry->exit_info2,
  528. __entry->exit_int_info, __entry->exit_int_info_err)
  529. );
  530. /*
  531. * Tracepoint for nested #vmexit because of interrupt pending
  532. */
  533. TRACE_EVENT(kvm_nested_intr_vmexit,
  534. TP_PROTO(__u64 rip),
  535. TP_ARGS(rip),
  536. TP_STRUCT__entry(
  537. __field( __u64, rip )
  538. ),
  539. TP_fast_assign(
  540. __entry->rip = rip
  541. ),
  542. TP_printk("rip: 0x%016llx", __entry->rip)
  543. );
  544. /*
  545. * Tracepoint for nested #vmexit because of interrupt pending
  546. */
  547. TRACE_EVENT(kvm_invlpga,
  548. TP_PROTO(__u64 rip, int asid, u64 address),
  549. TP_ARGS(rip, asid, address),
  550. TP_STRUCT__entry(
  551. __field( __u64, rip )
  552. __field( int, asid )
  553. __field( __u64, address )
  554. ),
  555. TP_fast_assign(
  556. __entry->rip = rip;
  557. __entry->asid = asid;
  558. __entry->address = address;
  559. ),
  560. TP_printk("rip: 0x%016llx asid: %d address: 0x%016llx",
  561. __entry->rip, __entry->asid, __entry->address)
  562. );
  563. /*
  564. * Tracepoint for nested #vmexit because of interrupt pending
  565. */
  566. TRACE_EVENT(kvm_skinit,
  567. TP_PROTO(__u64 rip, __u32 slb),
  568. TP_ARGS(rip, slb),
  569. TP_STRUCT__entry(
  570. __field( __u64, rip )
  571. __field( __u32, slb )
  572. ),
  573. TP_fast_assign(
  574. __entry->rip = rip;
  575. __entry->slb = slb;
  576. ),
  577. TP_printk("rip: 0x%016llx slb: 0x%08x",
  578. __entry->rip, __entry->slb)
  579. );
  580. #define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
  581. #define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
  582. #define KVM_EMUL_INSN_F_CS_D (1 << 2)
  583. #define KVM_EMUL_INSN_F_CS_L (1 << 3)
  584. #define kvm_trace_symbol_emul_flags \
  585. { 0, "real" }, \
  586. { KVM_EMUL_INSN_F_CR0_PE \
  587. | KVM_EMUL_INSN_F_EFL_VM, "vm16" }, \
  588. { KVM_EMUL_INSN_F_CR0_PE, "prot16" }, \
  589. { KVM_EMUL_INSN_F_CR0_PE \
  590. | KVM_EMUL_INSN_F_CS_D, "prot32" }, \
  591. { KVM_EMUL_INSN_F_CR0_PE \
  592. | KVM_EMUL_INSN_F_CS_L, "prot64" }
  593. #define kei_decode_mode(mode) ({ \
  594. u8 flags = 0xff; \
  595. switch (mode) { \
  596. case X86EMUL_MODE_REAL: \
  597. flags = 0; \
  598. break; \
  599. case X86EMUL_MODE_VM86: \
  600. flags = KVM_EMUL_INSN_F_EFL_VM; \
  601. break; \
  602. case X86EMUL_MODE_PROT16: \
  603. flags = KVM_EMUL_INSN_F_CR0_PE; \
  604. break; \
  605. case X86EMUL_MODE_PROT32: \
  606. flags = KVM_EMUL_INSN_F_CR0_PE \
  607. | KVM_EMUL_INSN_F_CS_D; \
  608. break; \
  609. case X86EMUL_MODE_PROT64: \
  610. flags = KVM_EMUL_INSN_F_CR0_PE \
  611. | KVM_EMUL_INSN_F_CS_L; \
  612. break; \
  613. } \
  614. flags; \
  615. })
  616. TRACE_EVENT(kvm_emulate_insn,
  617. TP_PROTO(struct kvm_vcpu *vcpu, __u8 failed),
  618. TP_ARGS(vcpu, failed),
  619. TP_STRUCT__entry(
  620. __field( __u64, rip )
  621. __field( __u32, csbase )
  622. __field( __u8, len )
  623. __array( __u8, insn, 15 )
  624. __field( __u8, flags )
  625. __field( __u8, failed )
  626. ),
  627. TP_fast_assign(
  628. __entry->csbase = kvm_x86_ops.get_segment_base(vcpu, VCPU_SREG_CS);
  629. __entry->len = vcpu->arch.emulate_ctxt->fetch.ptr
  630. - vcpu->arch.emulate_ctxt->fetch.data;
  631. __entry->rip = vcpu->arch.emulate_ctxt->_eip - __entry->len;
  632. memcpy(__entry->insn,
  633. vcpu->arch.emulate_ctxt->fetch.data,
  634. 15);
  635. __entry->flags = kei_decode_mode(vcpu->arch.emulate_ctxt->mode);
  636. __entry->failed = failed;
  637. ),
  638. TP_printk("%x:%llx:%s (%s)%s",
  639. __entry->csbase, __entry->rip,
  640. __print_hex(__entry->insn, __entry->len),
  641. __print_symbolic(__entry->flags,
  642. kvm_trace_symbol_emul_flags),
  643. __entry->failed ? " failed" : ""
  644. )
  645. );
  646. #define trace_kvm_emulate_insn_start(vcpu) trace_kvm_emulate_insn(vcpu, 0)
  647. #define trace_kvm_emulate_insn_failed(vcpu) trace_kvm_emulate_insn(vcpu, 1)
  648. TRACE_EVENT(
  649. vcpu_match_mmio,
  650. TP_PROTO(gva_t gva, gpa_t gpa, bool write, bool gpa_match),
  651. TP_ARGS(gva, gpa, write, gpa_match),
  652. TP_STRUCT__entry(
  653. __field(gva_t, gva)
  654. __field(gpa_t, gpa)
  655. __field(bool, write)
  656. __field(bool, gpa_match)
  657. ),
  658. TP_fast_assign(
  659. __entry->gva = gva;
  660. __entry->gpa = gpa;
  661. __entry->write = write;
  662. __entry->gpa_match = gpa_match
  663. ),
  664. TP_printk("gva %#lx gpa %#llx %s %s", __entry->gva, __entry->gpa,
  665. __entry->write ? "Write" : "Read",
  666. __entry->gpa_match ? "GPA" : "GVA")
  667. );
  668. TRACE_EVENT(kvm_write_tsc_offset,
  669. TP_PROTO(unsigned int vcpu_id, __u64 previous_tsc_offset,
  670. __u64 next_tsc_offset),
  671. TP_ARGS(vcpu_id, previous_tsc_offset, next_tsc_offset),
  672. TP_STRUCT__entry(
  673. __field( unsigned int, vcpu_id )
  674. __field( __u64, previous_tsc_offset )
  675. __field( __u64, next_tsc_offset )
  676. ),
  677. TP_fast_assign(
  678. __entry->vcpu_id = vcpu_id;
  679. __entry->previous_tsc_offset = previous_tsc_offset;
  680. __entry->next_tsc_offset = next_tsc_offset;
  681. ),
  682. TP_printk("vcpu=%u prev=%llu next=%llu", __entry->vcpu_id,
  683. __entry->previous_tsc_offset, __entry->next_tsc_offset)
  684. );
  685. #ifdef CONFIG_X86_64
  686. #define host_clocks \
  687. {VDSO_CLOCKMODE_NONE, "none"}, \
  688. {VDSO_CLOCKMODE_TSC, "tsc"} \
  689. TRACE_EVENT(kvm_update_master_clock,
  690. TP_PROTO(bool use_master_clock, unsigned int host_clock, bool offset_matched),
  691. TP_ARGS(use_master_clock, host_clock, offset_matched),
  692. TP_STRUCT__entry(
  693. __field( bool, use_master_clock )
  694. __field( unsigned int, host_clock )
  695. __field( bool, offset_matched )
  696. ),
  697. TP_fast_assign(
  698. __entry->use_master_clock = use_master_clock;
  699. __entry->host_clock = host_clock;
  700. __entry->offset_matched = offset_matched;
  701. ),
  702. TP_printk("masterclock %d hostclock %s offsetmatched %u",
  703. __entry->use_master_clock,
  704. __print_symbolic(__entry->host_clock, host_clocks),
  705. __entry->offset_matched)
  706. );
  707. TRACE_EVENT(kvm_track_tsc,
  708. TP_PROTO(unsigned int vcpu_id, unsigned int nr_matched,
  709. unsigned int online_vcpus, bool use_master_clock,
  710. unsigned int host_clock),
  711. TP_ARGS(vcpu_id, nr_matched, online_vcpus, use_master_clock,
  712. host_clock),
  713. TP_STRUCT__entry(
  714. __field( unsigned int, vcpu_id )
  715. __field( unsigned int, nr_vcpus_matched_tsc )
  716. __field( unsigned int, online_vcpus )
  717. __field( bool, use_master_clock )
  718. __field( unsigned int, host_clock )
  719. ),
  720. TP_fast_assign(
  721. __entry->vcpu_id = vcpu_id;
  722. __entry->nr_vcpus_matched_tsc = nr_matched;
  723. __entry->online_vcpus = online_vcpus;
  724. __entry->use_master_clock = use_master_clock;
  725. __entry->host_clock = host_clock;
  726. ),
  727. TP_printk("vcpu_id %u masterclock %u offsetmatched %u nr_online %u"
  728. " hostclock %s",
  729. __entry->vcpu_id, __entry->use_master_clock,
  730. __entry->nr_vcpus_matched_tsc, __entry->online_vcpus,
  731. __print_symbolic(__entry->host_clock, host_clocks))
  732. );
  733. #endif /* CONFIG_X86_64 */
  734. /*
  735. * Tracepoint for PML full VMEXIT.
  736. */
  737. TRACE_EVENT(kvm_pml_full,
  738. TP_PROTO(unsigned int vcpu_id),
  739. TP_ARGS(vcpu_id),
  740. TP_STRUCT__entry(
  741. __field( unsigned int, vcpu_id )
  742. ),
  743. TP_fast_assign(
  744. __entry->vcpu_id = vcpu_id;
  745. ),
  746. TP_printk("vcpu %d: PML full", __entry->vcpu_id)
  747. );
  748. TRACE_EVENT(kvm_ple_window_update,
  749. TP_PROTO(unsigned int vcpu_id, unsigned int new, unsigned int old),
  750. TP_ARGS(vcpu_id, new, old),
  751. TP_STRUCT__entry(
  752. __field( unsigned int, vcpu_id )
  753. __field( unsigned int, new )
  754. __field( unsigned int, old )
  755. ),
  756. TP_fast_assign(
  757. __entry->vcpu_id = vcpu_id;
  758. __entry->new = new;
  759. __entry->old = old;
  760. ),
  761. TP_printk("vcpu %u old %u new %u (%s)",
  762. __entry->vcpu_id, __entry->old, __entry->new,
  763. __entry->old < __entry->new ? "growed" : "shrinked")
  764. );
  765. TRACE_EVENT(kvm_pvclock_update,
  766. TP_PROTO(unsigned int vcpu_id, struct pvclock_vcpu_time_info *pvclock),
  767. TP_ARGS(vcpu_id, pvclock),
  768. TP_STRUCT__entry(
  769. __field( unsigned int, vcpu_id )
  770. __field( __u32, version )
  771. __field( __u64, tsc_timestamp )
  772. __field( __u64, system_time )
  773. __field( __u32, tsc_to_system_mul )
  774. __field( __s8, tsc_shift )
  775. __field( __u8, flags )
  776. ),
  777. TP_fast_assign(
  778. __entry->vcpu_id = vcpu_id;
  779. __entry->version = pvclock->version;
  780. __entry->tsc_timestamp = pvclock->tsc_timestamp;
  781. __entry->system_time = pvclock->system_time;
  782. __entry->tsc_to_system_mul = pvclock->tsc_to_system_mul;
  783. __entry->tsc_shift = pvclock->tsc_shift;
  784. __entry->flags = pvclock->flags;
  785. ),
  786. TP_printk("vcpu_id %u, pvclock { version %u, tsc_timestamp 0x%llx, "
  787. "system_time 0x%llx, tsc_to_system_mul 0x%x, tsc_shift %d, "
  788. "flags 0x%x }",
  789. __entry->vcpu_id,
  790. __entry->version,
  791. __entry->tsc_timestamp,
  792. __entry->system_time,
  793. __entry->tsc_to_system_mul,
  794. __entry->tsc_shift,
  795. __entry->flags)
  796. );
  797. TRACE_EVENT(kvm_wait_lapic_expire,
  798. TP_PROTO(unsigned int vcpu_id, s64 delta),
  799. TP_ARGS(vcpu_id, delta),
  800. TP_STRUCT__entry(
  801. __field( unsigned int, vcpu_id )
  802. __field( s64, delta )
  803. ),
  804. TP_fast_assign(
  805. __entry->vcpu_id = vcpu_id;
  806. __entry->delta = delta;
  807. ),
  808. TP_printk("vcpu %u: delta %lld (%s)",
  809. __entry->vcpu_id,
  810. __entry->delta,
  811. __entry->delta < 0 ? "early" : "late")
  812. );
  813. TRACE_EVENT(kvm_enter_smm,
  814. TP_PROTO(unsigned int vcpu_id, u64 smbase, bool entering),
  815. TP_ARGS(vcpu_id, smbase, entering),
  816. TP_STRUCT__entry(
  817. __field( unsigned int, vcpu_id )
  818. __field( u64, smbase )
  819. __field( bool, entering )
  820. ),
  821. TP_fast_assign(
  822. __entry->vcpu_id = vcpu_id;
  823. __entry->smbase = smbase;
  824. __entry->entering = entering;
  825. ),
  826. TP_printk("vcpu %u: %s SMM, smbase 0x%llx",
  827. __entry->vcpu_id,
  828. __entry->entering ? "entering" : "leaving",
  829. __entry->smbase)
  830. );
  831. /*
  832. * Tracepoint for VT-d posted-interrupts.
  833. */
  834. TRACE_EVENT(kvm_pi_irte_update,
  835. TP_PROTO(unsigned int host_irq, unsigned int vcpu_id,
  836. unsigned int gsi, unsigned int gvec,
  837. u64 pi_desc_addr, bool set),
  838. TP_ARGS(host_irq, vcpu_id, gsi, gvec, pi_desc_addr, set),
  839. TP_STRUCT__entry(
  840. __field( unsigned int, host_irq )
  841. __field( unsigned int, vcpu_id )
  842. __field( unsigned int, gsi )
  843. __field( unsigned int, gvec )
  844. __field( u64, pi_desc_addr )
  845. __field( bool, set )
  846. ),
  847. TP_fast_assign(
  848. __entry->host_irq = host_irq;
  849. __entry->vcpu_id = vcpu_id;
  850. __entry->gsi = gsi;
  851. __entry->gvec = gvec;
  852. __entry->pi_desc_addr = pi_desc_addr;
  853. __entry->set = set;
  854. ),
  855. TP_printk("VT-d PI is %s for irq %u, vcpu %u, gsi: 0x%x, "
  856. "gvec: 0x%x, pi_desc_addr: 0x%llx",
  857. __entry->set ? "enabled and being updated" : "disabled",
  858. __entry->host_irq,
  859. __entry->vcpu_id,
  860. __entry->gsi,
  861. __entry->gvec,
  862. __entry->pi_desc_addr)
  863. );
  864. /*
  865. * Tracepoint for kvm_hv_notify_acked_sint.
  866. */
  867. TRACE_EVENT(kvm_hv_notify_acked_sint,
  868. TP_PROTO(int vcpu_id, u32 sint),
  869. TP_ARGS(vcpu_id, sint),
  870. TP_STRUCT__entry(
  871. __field(int, vcpu_id)
  872. __field(u32, sint)
  873. ),
  874. TP_fast_assign(
  875. __entry->vcpu_id = vcpu_id;
  876. __entry->sint = sint;
  877. ),
  878. TP_printk("vcpu_id %d sint %u", __entry->vcpu_id, __entry->sint)
  879. );
  880. /*
  881. * Tracepoint for synic_set_irq.
  882. */
  883. TRACE_EVENT(kvm_hv_synic_set_irq,
  884. TP_PROTO(int vcpu_id, u32 sint, int vector, int ret),
  885. TP_ARGS(vcpu_id, sint, vector, ret),
  886. TP_STRUCT__entry(
  887. __field(int, vcpu_id)
  888. __field(u32, sint)
  889. __field(int, vector)
  890. __field(int, ret)
  891. ),
  892. TP_fast_assign(
  893. __entry->vcpu_id = vcpu_id;
  894. __entry->sint = sint;
  895. __entry->vector = vector;
  896. __entry->ret = ret;
  897. ),
  898. TP_printk("vcpu_id %d sint %u vector %d ret %d",
  899. __entry->vcpu_id, __entry->sint, __entry->vector,
  900. __entry->ret)
  901. );
  902. /*
  903. * Tracepoint for kvm_hv_synic_send_eoi.
  904. */
  905. TRACE_EVENT(kvm_hv_synic_send_eoi,
  906. TP_PROTO(int vcpu_id, int vector),
  907. TP_ARGS(vcpu_id, vector),
  908. TP_STRUCT__entry(
  909. __field(int, vcpu_id)
  910. __field(u32, sint)
  911. __field(int, vector)
  912. __field(int, ret)
  913. ),
  914. TP_fast_assign(
  915. __entry->vcpu_id = vcpu_id;
  916. __entry->vector = vector;
  917. ),
  918. TP_printk("vcpu_id %d vector %d", __entry->vcpu_id, __entry->vector)
  919. );
  920. /*
  921. * Tracepoint for synic_set_msr.
  922. */
  923. TRACE_EVENT(kvm_hv_synic_set_msr,
  924. TP_PROTO(int vcpu_id, u32 msr, u64 data, bool host),
  925. TP_ARGS(vcpu_id, msr, data, host),
  926. TP_STRUCT__entry(
  927. __field(int, vcpu_id)
  928. __field(u32, msr)
  929. __field(u64, data)
  930. __field(bool, host)
  931. ),
  932. TP_fast_assign(
  933. __entry->vcpu_id = vcpu_id;
  934. __entry->msr = msr;
  935. __entry->data = data;
  936. __entry->host = host
  937. ),
  938. TP_printk("vcpu_id %d msr 0x%x data 0x%llx host %d",
  939. __entry->vcpu_id, __entry->msr, __entry->data, __entry->host)
  940. );
  941. /*
  942. * Tracepoint for stimer_set_config.
  943. */
  944. TRACE_EVENT(kvm_hv_stimer_set_config,
  945. TP_PROTO(int vcpu_id, int timer_index, u64 config, bool host),
  946. TP_ARGS(vcpu_id, timer_index, config, host),
  947. TP_STRUCT__entry(
  948. __field(int, vcpu_id)
  949. __field(int, timer_index)
  950. __field(u64, config)
  951. __field(bool, host)
  952. ),
  953. TP_fast_assign(
  954. __entry->vcpu_id = vcpu_id;
  955. __entry->timer_index = timer_index;
  956. __entry->config = config;
  957. __entry->host = host;
  958. ),
  959. TP_printk("vcpu_id %d timer %d config 0x%llx host %d",
  960. __entry->vcpu_id, __entry->timer_index, __entry->config,
  961. __entry->host)
  962. );
  963. /*
  964. * Tracepoint for stimer_set_count.
  965. */
  966. TRACE_EVENT(kvm_hv_stimer_set_count,
  967. TP_PROTO(int vcpu_id, int timer_index, u64 count, bool host),
  968. TP_ARGS(vcpu_id, timer_index, count, host),
  969. TP_STRUCT__entry(
  970. __field(int, vcpu_id)
  971. __field(int, timer_index)
  972. __field(u64, count)
  973. __field(bool, host)
  974. ),
  975. TP_fast_assign(
  976. __entry->vcpu_id = vcpu_id;
  977. __entry->timer_index = timer_index;
  978. __entry->count = count;
  979. __entry->host = host;
  980. ),
  981. TP_printk("vcpu_id %d timer %d count %llu host %d",
  982. __entry->vcpu_id, __entry->timer_index, __entry->count,
  983. __entry->host)
  984. );
  985. /*
  986. * Tracepoint for stimer_start(periodic timer case).
  987. */
  988. TRACE_EVENT(kvm_hv_stimer_start_periodic,
  989. TP_PROTO(int vcpu_id, int timer_index, u64 time_now, u64 exp_time),
  990. TP_ARGS(vcpu_id, timer_index, time_now, exp_time),
  991. TP_STRUCT__entry(
  992. __field(int, vcpu_id)
  993. __field(int, timer_index)
  994. __field(u64, time_now)
  995. __field(u64, exp_time)
  996. ),
  997. TP_fast_assign(
  998. __entry->vcpu_id = vcpu_id;
  999. __entry->timer_index = timer_index;
  1000. __entry->time_now = time_now;
  1001. __entry->exp_time = exp_time;
  1002. ),
  1003. TP_printk("vcpu_id %d timer %d time_now %llu exp_time %llu",
  1004. __entry->vcpu_id, __entry->timer_index, __entry->time_now,
  1005. __entry->exp_time)
  1006. );
  1007. /*
  1008. * Tracepoint for stimer_start(one-shot timer case).
  1009. */
  1010. TRACE_EVENT(kvm_hv_stimer_start_one_shot,
  1011. TP_PROTO(int vcpu_id, int timer_index, u64 time_now, u64 count),
  1012. TP_ARGS(vcpu_id, timer_index, time_now, count),
  1013. TP_STRUCT__entry(
  1014. __field(int, vcpu_id)
  1015. __field(int, timer_index)
  1016. __field(u64, time_now)
  1017. __field(u64, count)
  1018. ),
  1019. TP_fast_assign(
  1020. __entry->vcpu_id = vcpu_id;
  1021. __entry->timer_index = timer_index;
  1022. __entry->time_now = time_now;
  1023. __entry->count = count;
  1024. ),
  1025. TP_printk("vcpu_id %d timer %d time_now %llu count %llu",
  1026. __entry->vcpu_id, __entry->timer_index, __entry->time_now,
  1027. __entry->count)
  1028. );
  1029. /*
  1030. * Tracepoint for stimer_timer_callback.
  1031. */
  1032. TRACE_EVENT(kvm_hv_stimer_callback,
  1033. TP_PROTO(int vcpu_id, int timer_index),
  1034. TP_ARGS(vcpu_id, timer_index),
  1035. TP_STRUCT__entry(
  1036. __field(int, vcpu_id)
  1037. __field(int, timer_index)
  1038. ),
  1039. TP_fast_assign(
  1040. __entry->vcpu_id = vcpu_id;
  1041. __entry->timer_index = timer_index;
  1042. ),
  1043. TP_printk("vcpu_id %d timer %d",
  1044. __entry->vcpu_id, __entry->timer_index)
  1045. );
  1046. /*
  1047. * Tracepoint for stimer_expiration.
  1048. */
  1049. TRACE_EVENT(kvm_hv_stimer_expiration,
  1050. TP_PROTO(int vcpu_id, int timer_index, int direct, int msg_send_result),
  1051. TP_ARGS(vcpu_id, timer_index, direct, msg_send_result),
  1052. TP_STRUCT__entry(
  1053. __field(int, vcpu_id)
  1054. __field(int, timer_index)
  1055. __field(int, direct)
  1056. __field(int, msg_send_result)
  1057. ),
  1058. TP_fast_assign(
  1059. __entry->vcpu_id = vcpu_id;
  1060. __entry->timer_index = timer_index;
  1061. __entry->direct = direct;
  1062. __entry->msg_send_result = msg_send_result;
  1063. ),
  1064. TP_printk("vcpu_id %d timer %d direct %d send result %d",
  1065. __entry->vcpu_id, __entry->timer_index,
  1066. __entry->direct, __entry->msg_send_result)
  1067. );
  1068. /*
  1069. * Tracepoint for stimer_cleanup.
  1070. */
  1071. TRACE_EVENT(kvm_hv_stimer_cleanup,
  1072. TP_PROTO(int vcpu_id, int timer_index),
  1073. TP_ARGS(vcpu_id, timer_index),
  1074. TP_STRUCT__entry(
  1075. __field(int, vcpu_id)
  1076. __field(int, timer_index)
  1077. ),
  1078. TP_fast_assign(
  1079. __entry->vcpu_id = vcpu_id;
  1080. __entry->timer_index = timer_index;
  1081. ),
  1082. TP_printk("vcpu_id %d timer %d",
  1083. __entry->vcpu_id, __entry->timer_index)
  1084. );
  1085. TRACE_EVENT(kvm_apicv_update_request,
  1086. TP_PROTO(bool activate, unsigned long bit),
  1087. TP_ARGS(activate, bit),
  1088. TP_STRUCT__entry(
  1089. __field(bool, activate)
  1090. __field(unsigned long, bit)
  1091. ),
  1092. TP_fast_assign(
  1093. __entry->activate = activate;
  1094. __entry->bit = bit;
  1095. ),
  1096. TP_printk("%s bit=%lu",
  1097. __entry->activate ? "activate" : "deactivate",
  1098. __entry->bit)
  1099. );
  1100. /*
  1101. * Tracepoint for AMD AVIC
  1102. */
  1103. TRACE_EVENT(kvm_avic_incomplete_ipi,
  1104. TP_PROTO(u32 vcpu, u32 icrh, u32 icrl, u32 id, u32 index),
  1105. TP_ARGS(vcpu, icrh, icrl, id, index),
  1106. TP_STRUCT__entry(
  1107. __field(u32, vcpu)
  1108. __field(u32, icrh)
  1109. __field(u32, icrl)
  1110. __field(u32, id)
  1111. __field(u32, index)
  1112. ),
  1113. TP_fast_assign(
  1114. __entry->vcpu = vcpu;
  1115. __entry->icrh = icrh;
  1116. __entry->icrl = icrl;
  1117. __entry->id = id;
  1118. __entry->index = index;
  1119. ),
  1120. TP_printk("vcpu=%u, icrh:icrl=%#010x:%08x, id=%u, index=%u",
  1121. __entry->vcpu, __entry->icrh, __entry->icrl,
  1122. __entry->id, __entry->index)
  1123. );
  1124. TRACE_EVENT(kvm_avic_unaccelerated_access,
  1125. TP_PROTO(u32 vcpu, u32 offset, bool ft, bool rw, u32 vec),
  1126. TP_ARGS(vcpu, offset, ft, rw, vec),
  1127. TP_STRUCT__entry(
  1128. __field(u32, vcpu)
  1129. __field(u32, offset)
  1130. __field(bool, ft)
  1131. __field(bool, rw)
  1132. __field(u32, vec)
  1133. ),
  1134. TP_fast_assign(
  1135. __entry->vcpu = vcpu;
  1136. __entry->offset = offset;
  1137. __entry->ft = ft;
  1138. __entry->rw = rw;
  1139. __entry->vec = vec;
  1140. ),
  1141. TP_printk("vcpu=%u, offset=%#x(%s), %s, %s, vec=%#x",
  1142. __entry->vcpu,
  1143. __entry->offset,
  1144. __print_symbolic(__entry->offset, kvm_trace_symbol_apic),
  1145. __entry->ft ? "trap" : "fault",
  1146. __entry->rw ? "write" : "read",
  1147. __entry->vec)
  1148. );
  1149. TRACE_EVENT(kvm_avic_ga_log,
  1150. TP_PROTO(u32 vmid, u32 vcpuid),
  1151. TP_ARGS(vmid, vcpuid),
  1152. TP_STRUCT__entry(
  1153. __field(u32, vmid)
  1154. __field(u32, vcpuid)
  1155. ),
  1156. TP_fast_assign(
  1157. __entry->vmid = vmid;
  1158. __entry->vcpuid = vcpuid;
  1159. ),
  1160. TP_printk("vmid=%u, vcpuid=%u",
  1161. __entry->vmid, __entry->vcpuid)
  1162. );
  1163. TRACE_EVENT(kvm_hv_timer_state,
  1164. TP_PROTO(unsigned int vcpu_id, unsigned int hv_timer_in_use),
  1165. TP_ARGS(vcpu_id, hv_timer_in_use),
  1166. TP_STRUCT__entry(
  1167. __field(unsigned int, vcpu_id)
  1168. __field(unsigned int, hv_timer_in_use)
  1169. ),
  1170. TP_fast_assign(
  1171. __entry->vcpu_id = vcpu_id;
  1172. __entry->hv_timer_in_use = hv_timer_in_use;
  1173. ),
  1174. TP_printk("vcpu_id %x hv_timer %x",
  1175. __entry->vcpu_id,
  1176. __entry->hv_timer_in_use)
  1177. );
  1178. /*
  1179. * Tracepoint for kvm_hv_flush_tlb.
  1180. */
  1181. TRACE_EVENT(kvm_hv_flush_tlb,
  1182. TP_PROTO(u64 processor_mask, u64 address_space, u64 flags),
  1183. TP_ARGS(processor_mask, address_space, flags),
  1184. TP_STRUCT__entry(
  1185. __field(u64, processor_mask)
  1186. __field(u64, address_space)
  1187. __field(u64, flags)
  1188. ),
  1189. TP_fast_assign(
  1190. __entry->processor_mask = processor_mask;
  1191. __entry->address_space = address_space;
  1192. __entry->flags = flags;
  1193. ),
  1194. TP_printk("processor_mask 0x%llx address_space 0x%llx flags 0x%llx",
  1195. __entry->processor_mask, __entry->address_space,
  1196. __entry->flags)
  1197. );
  1198. /*
  1199. * Tracepoint for kvm_hv_flush_tlb_ex.
  1200. */
  1201. TRACE_EVENT(kvm_hv_flush_tlb_ex,
  1202. TP_PROTO(u64 valid_bank_mask, u64 format, u64 address_space, u64 flags),
  1203. TP_ARGS(valid_bank_mask, format, address_space, flags),
  1204. TP_STRUCT__entry(
  1205. __field(u64, valid_bank_mask)
  1206. __field(u64, format)
  1207. __field(u64, address_space)
  1208. __field(u64, flags)
  1209. ),
  1210. TP_fast_assign(
  1211. __entry->valid_bank_mask = valid_bank_mask;
  1212. __entry->format = format;
  1213. __entry->address_space = address_space;
  1214. __entry->flags = flags;
  1215. ),
  1216. TP_printk("valid_bank_mask 0x%llx format 0x%llx "
  1217. "address_space 0x%llx flags 0x%llx",
  1218. __entry->valid_bank_mask, __entry->format,
  1219. __entry->address_space, __entry->flags)
  1220. );
  1221. /*
  1222. * Tracepoints for kvm_hv_send_ipi.
  1223. */
  1224. TRACE_EVENT(kvm_hv_send_ipi,
  1225. TP_PROTO(u32 vector, u64 processor_mask),
  1226. TP_ARGS(vector, processor_mask),
  1227. TP_STRUCT__entry(
  1228. __field(u32, vector)
  1229. __field(u64, processor_mask)
  1230. ),
  1231. TP_fast_assign(
  1232. __entry->vector = vector;
  1233. __entry->processor_mask = processor_mask;
  1234. ),
  1235. TP_printk("vector %x processor_mask 0x%llx",
  1236. __entry->vector, __entry->processor_mask)
  1237. );
  1238. TRACE_EVENT(kvm_hv_send_ipi_ex,
  1239. TP_PROTO(u32 vector, u64 format, u64 valid_bank_mask),
  1240. TP_ARGS(vector, format, valid_bank_mask),
  1241. TP_STRUCT__entry(
  1242. __field(u32, vector)
  1243. __field(u64, format)
  1244. __field(u64, valid_bank_mask)
  1245. ),
  1246. TP_fast_assign(
  1247. __entry->vector = vector;
  1248. __entry->format = format;
  1249. __entry->valid_bank_mask = valid_bank_mask;
  1250. ),
  1251. TP_printk("vector %x format %llx valid_bank_mask 0x%llx",
  1252. __entry->vector, __entry->format,
  1253. __entry->valid_bank_mask)
  1254. );
  1255. TRACE_EVENT(kvm_pv_tlb_flush,
  1256. TP_PROTO(unsigned int vcpu_id, bool need_flush_tlb),
  1257. TP_ARGS(vcpu_id, need_flush_tlb),
  1258. TP_STRUCT__entry(
  1259. __field( unsigned int, vcpu_id )
  1260. __field( bool, need_flush_tlb )
  1261. ),
  1262. TP_fast_assign(
  1263. __entry->vcpu_id = vcpu_id;
  1264. __entry->need_flush_tlb = need_flush_tlb;
  1265. ),
  1266. TP_printk("vcpu %u need_flush_tlb %s", __entry->vcpu_id,
  1267. __entry->need_flush_tlb ? "true" : "false")
  1268. );
  1269. /*
  1270. * Tracepoint for failed nested VMX VM-Enter.
  1271. */
  1272. TRACE_EVENT(kvm_nested_vmenter_failed,
  1273. TP_PROTO(const char *msg, u32 err),
  1274. TP_ARGS(msg, err),
  1275. TP_STRUCT__entry(
  1276. __string(msg, msg)
  1277. __field(u32, err)
  1278. ),
  1279. TP_fast_assign(
  1280. __assign_str(msg, msg);
  1281. __entry->err = err;
  1282. ),
  1283. TP_printk("%s%s", __get_str(msg), !__entry->err ? "" :
  1284. __print_symbolic(__entry->err, VMX_VMENTER_INSTRUCTION_ERRORS))
  1285. );
  1286. /*
  1287. * Tracepoint for syndbg_set_msr.
  1288. */
  1289. TRACE_EVENT(kvm_hv_syndbg_set_msr,
  1290. TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data),
  1291. TP_ARGS(vcpu_id, vp_index, msr, data),
  1292. TP_STRUCT__entry(
  1293. __field(int, vcpu_id)
  1294. __field(u32, vp_index)
  1295. __field(u32, msr)
  1296. __field(u64, data)
  1297. ),
  1298. TP_fast_assign(
  1299. __entry->vcpu_id = vcpu_id;
  1300. __entry->vp_index = vp_index;
  1301. __entry->msr = msr;
  1302. __entry->data = data;
  1303. ),
  1304. TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx",
  1305. __entry->vcpu_id, __entry->vp_index, __entry->msr,
  1306. __entry->data)
  1307. );
  1308. /*
  1309. * Tracepoint for syndbg_get_msr.
  1310. */
  1311. TRACE_EVENT(kvm_hv_syndbg_get_msr,
  1312. TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data),
  1313. TP_ARGS(vcpu_id, vp_index, msr, data),
  1314. TP_STRUCT__entry(
  1315. __field(int, vcpu_id)
  1316. __field(u32, vp_index)
  1317. __field(u32, msr)
  1318. __field(u64, data)
  1319. ),
  1320. TP_fast_assign(
  1321. __entry->vcpu_id = vcpu_id;
  1322. __entry->vp_index = vp_index;
  1323. __entry->msr = msr;
  1324. __entry->data = data;
  1325. ),
  1326. TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx",
  1327. __entry->vcpu_id, __entry->vp_index, __entry->msr,
  1328. __entry->data)
  1329. );
  1330. #endif /* _TRACE_KVM_H */
  1331. #undef TRACE_INCLUDE_PATH
  1332. #define TRACE_INCLUDE_PATH ../../arch/x86/kvm
  1333. #undef TRACE_INCLUDE_FILE
  1334. #define TRACE_INCLUDE_FILE trace
  1335. /* This part must be outside protection */
  1336. #include <trace/define_trace.h>