xref: /openbmc/linux/arch/s390/kvm/trace.h (revision c4ee0af3)
1 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
2 #define _TRACE_KVM_H
3 
4 #include <linux/tracepoint.h>
5 #include <asm/sigp.h>
6 #include <asm/debug.h>
7 #include <asm/dis.h>
8 
9 #undef TRACE_SYSTEM
10 #define TRACE_SYSTEM kvm
11 #define TRACE_INCLUDE_PATH .
12 #undef TRACE_INCLUDE_FILE
13 #define TRACE_INCLUDE_FILE trace
14 
15 /*
16  * Helpers for vcpu-specific tracepoints containing the same information
17  * as s390dbf VCPU_EVENTs.
18  */
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;		\
28 	} while (0);
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)
32 
33 /*
34  * Tracepoints for SIE entry and exit.
35  */
36 TRACE_EVENT(kvm_s390_sie_enter,
37 	    TP_PROTO(VCPU_PROTO_COMMON, int cpuflags),
38 	    TP_ARGS(VCPU_ARGS_COMMON, cpuflags),
39 
40 	    TP_STRUCT__entry(
41 		    VCPU_FIELD_COMMON
42 		    __field(int, cpuflags)
43 		    ),
44 
45 	    TP_fast_assign(
46 		    VCPU_ASSIGN_COMMON
47 		    __entry->cpuflags = cpuflags;
48 		    ),
49 
50 	    VCPU_TP_PRINTK("entering sie flags %x", __entry->cpuflags)
51 	);
52 
53 TRACE_EVENT(kvm_s390_sie_fault,
54 	    TP_PROTO(VCPU_PROTO_COMMON),
55 	    TP_ARGS(VCPU_ARGS_COMMON),
56 
57 	    TP_STRUCT__entry(
58 		    VCPU_FIELD_COMMON
59 		    ),
60 
61 	    TP_fast_assign(
62 		    VCPU_ASSIGN_COMMON
63 		    ),
64 
65 	    VCPU_TP_PRINTK("%s", "fault in sie instruction")
66 	);
67 
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"},				\
76 	{0x20, "Validity"},				\
77 	{0x28, "Stop request"}
78 
79 TRACE_EVENT(kvm_s390_sie_exit,
80 	    TP_PROTO(VCPU_PROTO_COMMON, u8 icptcode),
81 	    TP_ARGS(VCPU_ARGS_COMMON, icptcode),
82 
83 	    TP_STRUCT__entry(
84 		    VCPU_FIELD_COMMON
85 		    __field(u8, icptcode)
86 		    ),
87 
88 	    TP_fast_assign(
89 		    VCPU_ASSIGN_COMMON
90 		    __entry->icptcode = icptcode;
91 		    ),
92 
93 	    VCPU_TP_PRINTK("exit sie icptcode %d (%s)", __entry->icptcode,
94 			   __print_symbolic(__entry->icptcode,
95 					    sie_intercept_code))
96 	);
97 
98 /*
99  * Trace point for intercepted instructions.
100  */
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),
104 
105 	    TP_STRUCT__entry(
106 		    VCPU_FIELD_COMMON
107 		    __field(__u64, instruction)
108 		    __field(char, insn[8])
109 		    ),
110 
111 	    TP_fast_assign(
112 		    VCPU_ASSIGN_COMMON
113 		    __entry->instruction = ((__u64)ipa << 48) |
114 		    ((__u64)ipb << 16);
115 		    ),
116 
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)
123 	);
124 
125 /*
126  * Trace point for intercepted program interruptions.
127  */
128 TRACE_EVENT(kvm_s390_intercept_prog,
129 	    TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
130 	    TP_ARGS(VCPU_ARGS_COMMON, code),
131 
132 	    TP_STRUCT__entry(
133 		    VCPU_FIELD_COMMON
134 		    __field(__u16, code)
135 		    ),
136 
137 	    TP_fast_assign(
138 		    VCPU_ASSIGN_COMMON
139 		    __entry->code = code;
140 		    ),
141 
142 	    VCPU_TP_PRINTK("intercepted program interruption %04x",
143 			   __entry->code)
144 	);
145 
146 /*
147  * Trace point for validity intercepts.
148  */
149 TRACE_EVENT(kvm_s390_intercept_validity,
150 	    TP_PROTO(VCPU_PROTO_COMMON, __u16 viwhy),
151 	    TP_ARGS(VCPU_ARGS_COMMON, viwhy),
152 
153 	    TP_STRUCT__entry(
154 		    VCPU_FIELD_COMMON
155 		    __field(__u16, viwhy)
156 		    ),
157 
158 	    TP_fast_assign(
159 		    VCPU_ASSIGN_COMMON
160 		    __entry->viwhy = viwhy;
161 		    ),
162 
163 	    VCPU_TP_PRINTK("got validity intercept %04x", __entry->viwhy)
164 	);
165 
166 /*
167  * Trace points for instructions that are of special interest.
168  */
169 
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"}
180 
181 TRACE_EVENT(kvm_s390_handle_sigp,
182 	    TP_PROTO(VCPU_PROTO_COMMON, __u8 order_code, __u16 cpu_addr, \
183 		     __u32 parameter),
184 	    TP_ARGS(VCPU_ARGS_COMMON, order_code, cpu_addr, parameter),
185 
186 	    TP_STRUCT__entry(
187 		    VCPU_FIELD_COMMON
188 		    __field(__u8, order_code)
189 		    __field(__u16, cpu_addr)
190 		    __field(__u32, parameter)
191 		    ),
192 
193 	    TP_fast_assign(
194 		    VCPU_ASSIGN_COMMON
195 		    __entry->order_code = order_code;
196 		    __entry->cpu_addr = cpu_addr;
197 		    __entry->parameter = parameter;
198 		    ),
199 
200 	    VCPU_TP_PRINTK("handle sigp order %02x (%s), cpu address %04x, " \
201 			   "parameter %08x", __entry->order_code,
202 			   __print_symbolic(__entry->order_code,
203 					    sigp_order_codes),
204 			   __entry->cpu_addr, __entry->parameter)
205 	);
206 
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"}
213 
214 TRACE_EVENT(kvm_s390_handle_diag,
215 	    TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
216 	    TP_ARGS(VCPU_ARGS_COMMON, code),
217 
218 	    TP_STRUCT__entry(
219 		    VCPU_FIELD_COMMON
220 		    __field(__u16, code)
221 		    ),
222 
223 	    TP_fast_assign(
224 		    VCPU_ASSIGN_COMMON
225 		    __entry->code = code;
226 		    ),
227 
228 	    VCPU_TP_PRINTK("handle diagnose call %04x (%s)", __entry->code,
229 			   __print_symbolic(__entry->code, diagnose_codes))
230 	);
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 
236 	    TP_STRUCT__entry(
237 		    VCPU_FIELD_COMMON
238 		    __field(int, g)
239 		    __field(int, reg1)
240 		    __field(int, reg3)
241 		    __field(u64, addr)
242 		    ),
243 
244 	    TP_fast_assign(
245 		    VCPU_ASSIGN_COMMON
246 		    __entry->g = g;
247 		    __entry->reg1 = reg1;
248 		    __entry->reg3 = reg3;
249 		    __entry->addr = addr;
250 		    ),
251 
252 	    VCPU_TP_PRINTK("%s: loading cr %x-%x from %016llx",
253 			   __entry->g ? "lctlg" : "lctl",
254 			   __entry->reg1, __entry->reg3, __entry->addr)
255 	);
256 
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),
260 
261 	    TP_STRUCT__entry(
262 		    VCPU_FIELD_COMMON
263 		    __field(int, set)
264 		    __field(u32, address)
265 		    ),
266 
267 	    TP_fast_assign(
268 		    VCPU_ASSIGN_COMMON
269 		    __entry->set = set;
270 		    __entry->address = address;
271 		    ),
272 
273 	    VCPU_TP_PRINTK("%s prefix to %08x",
274 			   __entry->set ? "setting" : "storing",
275 			   __entry->address)
276 	);
277 
278 TRACE_EVENT(kvm_s390_handle_stap,
279 	    TP_PROTO(VCPU_PROTO_COMMON, u64 address),
280 	    TP_ARGS(VCPU_ARGS_COMMON, address),
281 
282 	    TP_STRUCT__entry(
283 		    VCPU_FIELD_COMMON
284 		    __field(u64, address)
285 		    ),
286 
287 	    TP_fast_assign(
288 		    VCPU_ASSIGN_COMMON
289 		    __entry->address = address;
290 		    ),
291 
292 	    VCPU_TP_PRINTK("storing cpu address to %016llx",
293 			   __entry->address)
294 	);
295 
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),
299 
300 	    TP_STRUCT__entry(
301 		    VCPU_FIELD_COMMON
302 		    __field(unsigned int, facility_list)
303 		    ),
304 
305 	    TP_fast_assign(
306 		    VCPU_ASSIGN_COMMON
307 		    __entry->facility_list = facility_list;
308 		    ),
309 
310 	    VCPU_TP_PRINTK("store facility list value %08x",
311 			   __entry->facility_list)
312 	);
313 
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),
317 
318 	    TP_STRUCT__entry(
319 		    VCPU_FIELD_COMMON
320 		    __field(int, fc)
321 		    __field(int, sel1)
322 		    __field(int, sel2)
323 		    __field(u64, addr)
324 		    ),
325 
326 	    TP_fast_assign(
327 		    VCPU_ASSIGN_COMMON
328 		    __entry->fc = fc;
329 		    __entry->sel1 = sel1;
330 		    __entry->sel2 = sel2;
331 		    __entry->addr = addr;
332 		    ),
333 
334 	    VCPU_TP_PRINTK("STSI %d.%d.%d information stored to %016llx",
335 			   __entry->fc, __entry->sel1, __entry->sel2,
336 			   __entry->addr)
337 	);
338 
339 #endif /* _TRACE_KVM_H */
340 
341 /* This part must be outside protection */
342 #include <trace/define_trace.h>
343