1 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
4 #include <linux/tracepoint.h>
10 #define TRACE_SYSTEM kvm
11 #define TRACE_INCLUDE_PATH .
12 #undef TRACE_INCLUDE_FILE
13 #define TRACE_INCLUDE_FILE trace
16 * Helpers for vcpu-specific tracepoints containing the same information
17 * as s390dbf VCPU_EVENTs.
19 #define VCPU_PROTO_COMMON struct kvm_vcpu *vcpu
20 #define VCPU_ARGS_COMMON vcpu
21 #define VCPU_FIELD_COMMON __field(int, id) \
22 __field(unsigned long, pswmask) \
23 __field(unsigned long, pswaddr)
24 #define VCPU_ASSIGN_COMMON do { \
25 __entry->id = vcpu->vcpu_id; \
26 __entry->pswmask = vcpu->arch.sie_block->gpsw.mask; \
27 __entry->pswaddr = vcpu->arch.sie_block->gpsw.addr; \
29 #define VCPU_TP_PRINTK(p_str, p_args...) \
30 TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id, \
31 __entry->pswmask, __entry->pswaddr, p_args)
34 * Tracepoints for SIE entry and exit.
36 TRACE_EVENT(kvm_s390_sie_enter
,
37 TP_PROTO(VCPU_PROTO_COMMON
, int cpuflags
),
38 TP_ARGS(VCPU_ARGS_COMMON
, cpuflags
),
42 __field(int, cpuflags
)
47 __entry
->cpuflags
= cpuflags
;
50 VCPU_TP_PRINTK("entering sie flags %x", __entry
->cpuflags
)
53 TRACE_EVENT(kvm_s390_sie_fault
,
54 TP_PROTO(VCPU_PROTO_COMMON
),
55 TP_ARGS(VCPU_ARGS_COMMON
),
65 VCPU_TP_PRINTK("%s", "fault in sie instruction")
68 #define sie_intercept_code \
69 {0x04, "Instruction"}, \
70 {0x08, "Program interruption"}, \
71 {0x0C, "Instruction and program interruption"}, \
72 {0x10, "External request"}, \
73 {0x14, "External interruption"}, \
74 {0x18, "I/O request"}, \
75 {0x1C, "Wait state"}, \
77 {0x28, "Stop request"}
79 TRACE_EVENT(kvm_s390_sie_exit
,
80 TP_PROTO(VCPU_PROTO_COMMON
, u8 icptcode
),
81 TP_ARGS(VCPU_ARGS_COMMON
, icptcode
),
90 __entry
->icptcode
= icptcode
;
93 VCPU_TP_PRINTK("exit sie icptcode %d (%s)", __entry
->icptcode
,
94 __print_symbolic(__entry
->icptcode
,
99 * Trace point for intercepted instructions.
101 TRACE_EVENT(kvm_s390_intercept_instruction
,
102 TP_PROTO(VCPU_PROTO_COMMON
, __u16 ipa
, __u32 ipb
),
103 TP_ARGS(VCPU_ARGS_COMMON
, ipa
, ipb
),
107 __field(__u64
, instruction
)
108 __field(char, insn
[8])
113 __entry
->instruction
= ((__u64
)ipa
<< 48) |
117 VCPU_TP_PRINTK("intercepted instruction %016llx (%s)",
118 __entry
->instruction
,
119 insn_to_mnemonic((unsigned char *)
120 &__entry
->instruction
,
121 __entry
->insn
, sizeof(__entry
->insn
)) ?
122 "unknown" : __entry
->insn
)
126 * Trace point for intercepted program interruptions.
128 TRACE_EVENT(kvm_s390_intercept_prog
,
129 TP_PROTO(VCPU_PROTO_COMMON
, __u16 code
),
130 TP_ARGS(VCPU_ARGS_COMMON
, code
),
139 __entry
->code
= code
;
142 VCPU_TP_PRINTK("intercepted program interruption %04x",
147 * Trace point for validity intercepts.
149 TRACE_EVENT(kvm_s390_intercept_validity
,
150 TP_PROTO(VCPU_PROTO_COMMON
, __u16 viwhy
),
151 TP_ARGS(VCPU_ARGS_COMMON
, viwhy
),
155 __field(__u16
, viwhy
)
160 __entry
->viwhy
= viwhy
;
163 VCPU_TP_PRINTK("got validity intercept %04x", __entry
->viwhy
)
167 * Trace points for instructions that are of special interest.
170 #define sigp_order_codes \
171 {SIGP_SENSE, "sense"}, \
172 {SIGP_EXTERNAL_CALL, "external call"}, \
173 {SIGP_EMERGENCY_SIGNAL, "emergency signal"}, \
174 {SIGP_STOP, "stop"}, \
175 {SIGP_STOP_AND_STORE_STATUS, "stop and store status"}, \
176 {SIGP_SET_ARCHITECTURE, "set architecture"}, \
177 {SIGP_SET_PREFIX, "set prefix"}, \
178 {SIGP_SENSE_RUNNING, "sense running"}, \
179 {SIGP_RESTART, "restart"}
181 TRACE_EVENT(kvm_s390_handle_sigp
,
182 TP_PROTO(VCPU_PROTO_COMMON
, __u8 order_code
, __u16 cpu_addr
, \
184 TP_ARGS(VCPU_ARGS_COMMON
, order_code
, cpu_addr
, parameter
),
188 __field(__u8
, order_code
)
189 __field(__u16
, cpu_addr
)
190 __field(__u32
, parameter
)
195 __entry
->order_code
= order_code
;
196 __entry
->cpu_addr
= cpu_addr
;
197 __entry
->parameter
= parameter
;
200 VCPU_TP_PRINTK("handle sigp order %02x (%s), cpu address %04x, " \
201 "parameter %08x", __entry
->order_code
,
202 __print_symbolic(__entry
->order_code
,
204 __entry
->cpu_addr
, __entry
->parameter
)
207 #define diagnose_codes \
208 {0x10, "release pages"}, \
209 {0x44, "time slice end"}, \
210 {0x308, "ipl functions"}, \
211 {0x500, "kvm hypercall"}, \
212 {0x501, "kvm breakpoint"}
214 TRACE_EVENT(kvm_s390_handle_diag
,
215 TP_PROTO(VCPU_PROTO_COMMON
, __u16 code
),
216 TP_ARGS(VCPU_ARGS_COMMON
, code
),
225 __entry
->code
= code
;
228 VCPU_TP_PRINTK("handle diagnose call %04x (%s)", __entry
->code
,
229 __print_symbolic(__entry
->code
, diagnose_codes
))
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
),
247 __entry
->reg1
= reg1
;
248 __entry
->reg3
= reg3
;
249 __entry
->addr
= addr
;
252 VCPU_TP_PRINTK("%s: loading cr %x-%x from %016llx",
253 __entry
->g
? "lctlg" : "lctl",
254 __entry
->reg1
, __entry
->reg3
, __entry
->addr
)
257 TRACE_EVENT(kvm_s390_handle_prefix
,
258 TP_PROTO(VCPU_PROTO_COMMON
, int set
, u32 address
),
259 TP_ARGS(VCPU_ARGS_COMMON
, set
, address
),
264 __field(u32
, address
)
270 __entry
->address
= address
;
273 VCPU_TP_PRINTK("%s prefix to %08x",
274 __entry
->set
? "setting" : "storing",
278 TRACE_EVENT(kvm_s390_handle_stap
,
279 TP_PROTO(VCPU_PROTO_COMMON
, u64 address
),
280 TP_ARGS(VCPU_ARGS_COMMON
, address
),
284 __field(u64
, address
)
289 __entry
->address
= address
;
292 VCPU_TP_PRINTK("storing cpu address to %016llx",
296 TRACE_EVENT(kvm_s390_handle_stfl
,
297 TP_PROTO(VCPU_PROTO_COMMON
, unsigned int facility_list
),
298 TP_ARGS(VCPU_ARGS_COMMON
, facility_list
),
302 __field(unsigned int, facility_list
)
307 __entry
->facility_list
= facility_list
;
310 VCPU_TP_PRINTK("store facility list value %08x",
311 __entry
->facility_list
)
314 TRACE_EVENT(kvm_s390_handle_stsi
,
315 TP_PROTO(VCPU_PROTO_COMMON
, int fc
, int sel1
, int sel2
, u64 addr
),
316 TP_ARGS(VCPU_ARGS_COMMON
, fc
, sel1
, sel2
, addr
),
329 __entry
->sel1
= sel1
;
330 __entry
->sel2
= sel2
;
331 __entry
->addr
= addr
;
334 VCPU_TP_PRINTK("STSI %d.%d.%d information stored to %016llx",
335 __entry
->fc
, __entry
->sel1
, __entry
->sel2
,
339 #endif /* _TRACE_KVM_H */
341 /* This part must be outside protection */
342 #include <trace/define_trace.h>