1#if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ) 2#define _TRACE_KVM_H 3 4#include <linux/tracepoint.h> 5 6#undef TRACE_SYSTEM 7#define TRACE_SYSTEM kvm 8 9/* 10 * Tracepoints for entry/exit to guest 11 */ 12TRACE_EVENT(kvm_entry, 13 TP_PROTO(unsigned long vcpu_pc), 14 TP_ARGS(vcpu_pc), 15 16 TP_STRUCT__entry( 17 __field( unsigned long, vcpu_pc ) 18 ), 19 20 TP_fast_assign( 21 __entry->vcpu_pc = vcpu_pc; 22 ), 23 24 TP_printk("PC: 0x%08lx", __entry->vcpu_pc) 25); 26 27TRACE_EVENT(kvm_exit, 28 TP_PROTO(unsigned int exit_reason, unsigned long vcpu_pc), 29 TP_ARGS(exit_reason, vcpu_pc), 30 31 TP_STRUCT__entry( 32 __field( unsigned int, exit_reason ) 33 __field( unsigned long, vcpu_pc ) 34 ), 35 36 TP_fast_assign( 37 __entry->exit_reason = exit_reason; 38 __entry->vcpu_pc = vcpu_pc; 39 ), 40 41 TP_printk("HSR_EC: 0x%04x, PC: 0x%08lx", 42 __entry->exit_reason, 43 __entry->vcpu_pc) 44); 45 46TRACE_EVENT(kvm_guest_fault, 47 TP_PROTO(unsigned long vcpu_pc, unsigned long hsr, 48 unsigned long hxfar, 49 unsigned long long ipa), 50 TP_ARGS(vcpu_pc, hsr, hxfar, ipa), 51 52 TP_STRUCT__entry( 53 __field( unsigned long, vcpu_pc ) 54 __field( unsigned long, hsr ) 55 __field( unsigned long, hxfar ) 56 __field( unsigned long long, ipa ) 57 ), 58 59 TP_fast_assign( 60 __entry->vcpu_pc = vcpu_pc; 61 __entry->hsr = hsr; 62 __entry->hxfar = hxfar; 63 __entry->ipa = ipa; 64 ), 65 66 TP_printk("ipa %#llx, hsr %#08lx, hxfar %#08lx, pc %#08lx", 67 __entry->ipa, __entry->hsr, 68 __entry->hxfar, __entry->vcpu_pc) 69); 70 71TRACE_EVENT(kvm_access_fault, 72 TP_PROTO(unsigned long ipa), 73 TP_ARGS(ipa), 74 75 TP_STRUCT__entry( 76 __field( unsigned long, ipa ) 77 ), 78 79 TP_fast_assign( 80 __entry->ipa = ipa; 81 ), 82 83 TP_printk("IPA: %lx", __entry->ipa) 84); 85 86TRACE_EVENT(kvm_irq_line, 87 TP_PROTO(unsigned int type, int vcpu_idx, int irq_num, int level), 88 TP_ARGS(type, vcpu_idx, irq_num, level), 89 90 TP_STRUCT__entry( 91 __field( unsigned int, type ) 92 __field( int, vcpu_idx ) 93 __field( int, irq_num ) 94 __field( int, level ) 95 ), 96 97 TP_fast_assign( 98 __entry->type = type; 99 __entry->vcpu_idx = vcpu_idx; 100 __entry->irq_num = irq_num; 101 __entry->level = level; 102 ), 103 104 TP_printk("Inject %s interrupt (%d), vcpu->idx: %d, num: %d, level: %d", 105 (__entry->type == KVM_ARM_IRQ_TYPE_CPU) ? "CPU" : 106 (__entry->type == KVM_ARM_IRQ_TYPE_PPI) ? "VGIC PPI" : 107 (__entry->type == KVM_ARM_IRQ_TYPE_SPI) ? "VGIC SPI" : "UNKNOWN", 108 __entry->type, __entry->vcpu_idx, __entry->irq_num, __entry->level) 109); 110 111TRACE_EVENT(kvm_mmio_emulate, 112 TP_PROTO(unsigned long vcpu_pc, unsigned long instr, 113 unsigned long cpsr), 114 TP_ARGS(vcpu_pc, instr, cpsr), 115 116 TP_STRUCT__entry( 117 __field( unsigned long, vcpu_pc ) 118 __field( unsigned long, instr ) 119 __field( unsigned long, cpsr ) 120 ), 121 122 TP_fast_assign( 123 __entry->vcpu_pc = vcpu_pc; 124 __entry->instr = instr; 125 __entry->cpsr = cpsr; 126 ), 127 128 TP_printk("Emulate MMIO at: 0x%08lx (instr: %08lx, cpsr: %08lx)", 129 __entry->vcpu_pc, __entry->instr, __entry->cpsr) 130); 131 132/* Architecturally implementation defined CP15 register access */ 133TRACE_EVENT(kvm_emulate_cp15_imp, 134 TP_PROTO(unsigned long Op1, unsigned long Rt1, unsigned long CRn, 135 unsigned long CRm, unsigned long Op2, bool is_write), 136 TP_ARGS(Op1, Rt1, CRn, CRm, Op2, is_write), 137 138 TP_STRUCT__entry( 139 __field( unsigned int, Op1 ) 140 __field( unsigned int, Rt1 ) 141 __field( unsigned int, CRn ) 142 __field( unsigned int, CRm ) 143 __field( unsigned int, Op2 ) 144 __field( bool, is_write ) 145 ), 146 147 TP_fast_assign( 148 __entry->is_write = is_write; 149 __entry->Op1 = Op1; 150 __entry->Rt1 = Rt1; 151 __entry->CRn = CRn; 152 __entry->CRm = CRm; 153 __entry->Op2 = Op2; 154 ), 155 156 TP_printk("Implementation defined CP15: %s\tp15, %u, r%u, c%u, c%u, %u", 157 (__entry->is_write) ? "mcr" : "mrc", 158 __entry->Op1, __entry->Rt1, __entry->CRn, 159 __entry->CRm, __entry->Op2) 160); 161 162TRACE_EVENT(kvm_wfx, 163 TP_PROTO(unsigned long vcpu_pc, bool is_wfe), 164 TP_ARGS(vcpu_pc, is_wfe), 165 166 TP_STRUCT__entry( 167 __field( unsigned long, vcpu_pc ) 168 __field( bool, is_wfe ) 169 ), 170 171 TP_fast_assign( 172 __entry->vcpu_pc = vcpu_pc; 173 __entry->is_wfe = is_wfe; 174 ), 175 176 TP_printk("guest executed wf%c at: 0x%08lx", 177 __entry->is_wfe ? 'e' : 'i', __entry->vcpu_pc) 178); 179 180TRACE_EVENT(kvm_unmap_hva, 181 TP_PROTO(unsigned long hva), 182 TP_ARGS(hva), 183 184 TP_STRUCT__entry( 185 __field( unsigned long, hva ) 186 ), 187 188 TP_fast_assign( 189 __entry->hva = hva; 190 ), 191 192 TP_printk("mmu notifier unmap hva: %#08lx", __entry->hva) 193); 194 195TRACE_EVENT(kvm_unmap_hva_range, 196 TP_PROTO(unsigned long start, unsigned long end), 197 TP_ARGS(start, end), 198 199 TP_STRUCT__entry( 200 __field( unsigned long, start ) 201 __field( unsigned long, end ) 202 ), 203 204 TP_fast_assign( 205 __entry->start = start; 206 __entry->end = end; 207 ), 208 209 TP_printk("mmu notifier unmap range: %#08lx -- %#08lx", 210 __entry->start, __entry->end) 211); 212 213TRACE_EVENT(kvm_set_spte_hva, 214 TP_PROTO(unsigned long hva), 215 TP_ARGS(hva), 216 217 TP_STRUCT__entry( 218 __field( unsigned long, hva ) 219 ), 220 221 TP_fast_assign( 222 __entry->hva = hva; 223 ), 224 225 TP_printk("mmu notifier set pte hva: %#08lx", __entry->hva) 226); 227 228TRACE_EVENT(kvm_age_hva, 229 TP_PROTO(unsigned long start, unsigned long end), 230 TP_ARGS(start, end), 231 232 TP_STRUCT__entry( 233 __field( unsigned long, start ) 234 __field( unsigned long, end ) 235 ), 236 237 TP_fast_assign( 238 __entry->start = start; 239 __entry->end = end; 240 ), 241 242 TP_printk("mmu notifier age hva: %#08lx -- %#08lx", 243 __entry->start, __entry->end) 244); 245 246TRACE_EVENT(kvm_test_age_hva, 247 TP_PROTO(unsigned long hva), 248 TP_ARGS(hva), 249 250 TP_STRUCT__entry( 251 __field( unsigned long, hva ) 252 ), 253 254 TP_fast_assign( 255 __entry->hva = hva; 256 ), 257 258 TP_printk("mmu notifier test age hva: %#08lx", __entry->hva) 259); 260 261TRACE_EVENT(kvm_hvc, 262 TP_PROTO(unsigned long vcpu_pc, unsigned long r0, unsigned long imm), 263 TP_ARGS(vcpu_pc, r0, imm), 264 265 TP_STRUCT__entry( 266 __field( unsigned long, vcpu_pc ) 267 __field( unsigned long, r0 ) 268 __field( unsigned long, imm ) 269 ), 270 271 TP_fast_assign( 272 __entry->vcpu_pc = vcpu_pc; 273 __entry->r0 = r0; 274 __entry->imm = imm; 275 ), 276 277 TP_printk("HVC at 0x%08lx (r0: 0x%08lx, imm: 0x%lx", 278 __entry->vcpu_pc, __entry->r0, __entry->imm) 279); 280 281TRACE_EVENT(kvm_set_way_flush, 282 TP_PROTO(unsigned long vcpu_pc, bool cache), 283 TP_ARGS(vcpu_pc, cache), 284 285 TP_STRUCT__entry( 286 __field( unsigned long, vcpu_pc ) 287 __field( bool, cache ) 288 ), 289 290 TP_fast_assign( 291 __entry->vcpu_pc = vcpu_pc; 292 __entry->cache = cache; 293 ), 294 295 TP_printk("S/W flush at 0x%016lx (cache %s)", 296 __entry->vcpu_pc, __entry->cache ? "on" : "off") 297); 298 299TRACE_EVENT(kvm_toggle_cache, 300 TP_PROTO(unsigned long vcpu_pc, bool was, bool now), 301 TP_ARGS(vcpu_pc, was, now), 302 303 TP_STRUCT__entry( 304 __field( unsigned long, vcpu_pc ) 305 __field( bool, was ) 306 __field( bool, now ) 307 ), 308 309 TP_fast_assign( 310 __entry->vcpu_pc = vcpu_pc; 311 __entry->was = was; 312 __entry->now = now; 313 ), 314 315 TP_printk("VM op at 0x%016lx (cache was %s, now %s)", 316 __entry->vcpu_pc, __entry->was ? "on" : "off", 317 __entry->now ? "on" : "off") 318); 319 320#endif /* _TRACE_KVM_H */ 321 322#undef TRACE_INCLUDE_PATH 323#define TRACE_INCLUDE_PATH arch/arm/kvm 324#undef TRACE_INCLUDE_FILE 325#define TRACE_INCLUDE_FILE trace 326 327/* This part must be outside protection */ 328#include <trace/define_trace.h> 329