1/*
2 * Copyright (c) 2013-2019, Intel Corporation
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 *  * Redistributions of source code must retain the above copyright notice,
8 *    this list of conditions and the following disclaimer.
9 *  * Redistributions in binary form must reproduce the above copyright notice,
10 *    this list of conditions and the following disclaimer in the documentation
11 *    and/or other materials provided with the distribution.
12 *  * Neither the name of Intel Corporation nor the names of its contributors
13 *    may be used to endorse or promote products derived from this software
14 *    without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include "ptunit.h"
30
31#include "pt_last_ip.h"
32#include "pt_decoder_function.h"
33#include "pt_query_decoder.h"
34#include "pt_encoder.h"
35#include "pt_opcodes.h"
36
37
38/* A query testing fixture. */
39
40struct ptu_decoder_fixture {
41	/* The test fixture initialization and finalization functions. */
42	struct ptunit_result (*init)(struct ptu_decoder_fixture *);
43	struct ptunit_result (*fini)(struct ptu_decoder_fixture *);
44
45	/* Encode an optional header for the test to read over. */
46	struct ptunit_result (*header)(struct ptu_decoder_fixture *);
47
48	/* The trace buffer. */
49	uint8_t buffer[1024];
50
51	/* The configuration under test. */
52	struct pt_config config;
53
54	/* A encoder and query decoder for the above configuration. */
55	struct pt_encoder encoder;
56	struct pt_query_decoder decoder;
57
58	/* For tracking last-ip in tests. */
59	struct pt_last_ip last_ip;
60};
61
62/* An invalid address. */
63static const uint64_t pt_dfix_bad_ip = (1ull << 62) - 1ull;
64
65/* A sign-extended address. */
66static const uint64_t pt_dfix_sext_ip = 0xffffff00ff00ff00ull;
67
68/* The highest possible address. */
69static const uint64_t pt_dfix_max_ip = (1ull << 47) - 1ull;
70
71/* The highest possible cr3 value. */
72static const uint64_t pt_dfix_max_cr3 = ((1ull << 47) - 1ull) & ~0x1full;
73
74/* Synchronize the decoder at the beginning of the trace stream, avoiding the
75 * initial PSB header.
76 */
77static struct ptunit_result ptu_sync_decoder(struct pt_query_decoder *decoder)
78{
79	ptu_ptr(decoder);
80	decoder->enabled = 1;
81
82	(void) pt_df_fetch(&decoder->next, decoder->pos, &decoder->config);
83	return ptu_passed();
84}
85
86/* Cut off the last encoded packet. */
87static struct ptunit_result cutoff(struct pt_query_decoder *decoder,
88				   const struct pt_encoder *encoder)
89{
90	uint8_t *pos;
91
92	ptu_ptr(decoder);
93	ptu_ptr(encoder);
94
95	pos = encoder->pos;
96	ptu_ptr(pos);
97
98	pos -= 1;
99	ptu_ptr_le(decoder->config.begin, pos);
100
101	decoder->config.end = pos;
102	return ptu_passed();
103}
104
105static struct ptunit_result indir_not_synced(struct ptu_decoder_fixture *dfix)
106{
107	struct pt_query_decoder *decoder = &dfix->decoder;
108	uint64_t ip = pt_dfix_bad_ip, addr = ip;
109	int errcode;
110
111	errcode = pt_qry_indirect_branch(decoder, &addr);
112	ptu_int_eq(errcode, -pte_nosync);
113	ptu_uint_eq(addr, ip);
114
115	return ptu_passed();
116}
117
118static struct ptunit_result cond_not_synced(struct ptu_decoder_fixture *dfix)
119{
120	struct pt_query_decoder *decoder = &dfix->decoder;
121	int errcode, tnt = 0xbc, taken = tnt;
122
123	errcode = pt_qry_cond_branch(decoder, &taken);
124	ptu_int_eq(errcode, -pte_nosync);
125	ptu_int_eq(taken, tnt);
126
127	return ptu_passed();
128}
129
130static struct ptunit_result event_not_synced(struct ptu_decoder_fixture *dfix)
131{
132	struct pt_query_decoder *decoder = &dfix->decoder;
133	struct pt_event event;
134	int errcode;
135
136	errcode = pt_qry_event(decoder, &event, sizeof(event));
137	ptu_int_eq(errcode, -pte_nosync);
138
139	return ptu_passed();
140}
141
142static struct ptunit_result sync_backward(struct ptu_decoder_fixture *dfix)
143{
144	struct pt_query_decoder *decoder = &dfix->decoder;
145	struct pt_encoder *encoder = &dfix->encoder;
146	uint64_t sync[3], offset, ip;
147	int errcode;
148
149	/* Check that we can use repeated pt_qry_sync_backward() to iterate over
150	 * synchronization points in backwards order.
151	 */
152
153	errcode = pt_enc_get_offset(encoder, &sync[0]);
154	ptu_int_ge(errcode, 0);
155
156	pt_encode_psb(encoder);
157	pt_encode_mode_exec(encoder, ptem_64bit);
158	pt_encode_psbend(encoder);
159
160	errcode = pt_enc_get_offset(encoder, &sync[1]);
161	ptu_int_ge(errcode, 0);
162
163	pt_encode_psb(encoder);
164	pt_encode_mode_exec(encoder, ptem_64bit);
165	pt_encode_psbend(encoder);
166
167	errcode = pt_enc_get_offset(encoder, &sync[2]);
168	ptu_int_ge(errcode, 0);
169
170	pt_encode_psb(encoder);
171	pt_encode_mode_exec(encoder, ptem_64bit);
172	pt_encode_psbend(encoder);
173
174	/* Synchronize repeatedly and check that we reach each PSB in the
175	 * correct order.
176	 */
177
178	errcode = pt_qry_sync_backward(decoder, &ip);
179	ptu_int_ge(errcode, 0);
180
181	errcode = pt_qry_get_sync_offset(decoder, &offset);
182	ptu_int_eq(errcode, 0);
183	ptu_uint_eq(offset, sync[2]);
184
185	errcode = pt_qry_sync_backward(decoder, &ip);
186	ptu_int_ge(errcode, 0);
187
188	errcode = pt_qry_get_sync_offset(decoder, &offset);
189	ptu_int_eq(errcode, 0);
190	ptu_uint_eq(offset, sync[1]);
191
192	errcode = pt_qry_sync_backward(decoder, &ip);
193	ptu_int_ge(errcode, 0);
194
195	errcode = pt_qry_get_sync_offset(decoder, &offset);
196	ptu_int_eq(errcode, 0);
197	ptu_uint_eq(offset, sync[0]);
198
199	errcode = pt_qry_sync_backward(decoder, &ip);
200	ptu_int_eq(errcode, -pte_eos);
201
202	return ptu_passed();
203}
204
205static struct ptunit_result
206sync_backward_empty_end(struct ptu_decoder_fixture *dfix)
207{
208	struct pt_query_decoder *decoder = &dfix->decoder;
209	struct pt_encoder *encoder = &dfix->encoder;
210	uint64_t sync[3], offset, ip;
211	int errcode;
212
213	/* Check that we can use repeated pt_qry_sync_backward() to iterate over
214	 * synchronization points in backwards order.
215	 *
216	 * There's an empty PSB+ at the end.  We skip it.
217	 */
218
219	errcode = pt_enc_get_offset(encoder, &sync[0]);
220	ptu_int_ge(errcode, 0);
221
222	pt_encode_psb(encoder);
223	pt_encode_mode_exec(encoder, ptem_64bit);
224	pt_encode_psbend(encoder);
225
226	errcode = pt_enc_get_offset(encoder, &sync[1]);
227	ptu_int_ge(errcode, 0);
228
229	pt_encode_psb(encoder);
230	pt_encode_mode_exec(encoder, ptem_64bit);
231	pt_encode_psbend(encoder);
232
233	errcode = pt_enc_get_offset(encoder, &sync[2]);
234	ptu_int_ge(errcode, 0);
235
236	pt_encode_psb(encoder);
237	pt_encode_psbend(encoder);
238
239	/* Synchronize repeatedly and check that we reach each PSB in the
240	 * correct order.
241	 */
242
243	errcode = pt_qry_sync_backward(decoder, &ip);
244	ptu_int_ge(errcode, 0);
245
246	errcode = pt_qry_get_sync_offset(decoder, &offset);
247	ptu_int_eq(errcode, 0);
248	ptu_uint_eq(offset, sync[1]);
249
250	errcode = pt_qry_sync_backward(decoder, &ip);
251	ptu_int_ge(errcode, 0);
252
253	errcode = pt_qry_get_sync_offset(decoder, &offset);
254	ptu_int_eq(errcode, 0);
255	ptu_uint_eq(offset, sync[0]);
256
257	errcode = pt_qry_sync_backward(decoder, &ip);
258	ptu_int_eq(errcode, -pte_eos);
259
260	return ptu_passed();
261}
262
263static struct ptunit_result
264sync_backward_empty_mid(struct ptu_decoder_fixture *dfix)
265{
266	struct pt_query_decoder *decoder = &dfix->decoder;
267	struct pt_encoder *encoder = &dfix->encoder;
268	uint64_t sync[3], offset, ip;
269	int errcode;
270
271	/* Check that we can use repeated pt_qry_sync_backward() to iterate over
272	 * synchronization points in backwards order.
273	 *
274	 * There's an empty PSB+ in the middle.  We skip it.
275	 */
276
277	errcode = pt_enc_get_offset(encoder, &sync[0]);
278	ptu_int_ge(errcode, 0);
279
280	pt_encode_psb(encoder);
281	pt_encode_mode_exec(encoder, ptem_64bit);
282	pt_encode_psbend(encoder);
283
284	errcode = pt_enc_get_offset(encoder, &sync[1]);
285	ptu_int_ge(errcode, 0);
286
287	pt_encode_psb(encoder);
288	pt_encode_psbend(encoder);
289
290	errcode = pt_enc_get_offset(encoder, &sync[2]);
291	ptu_int_ge(errcode, 0);
292
293	pt_encode_psb(encoder);
294	pt_encode_mode_exec(encoder, ptem_64bit);
295	pt_encode_psbend(encoder);
296
297	/* Synchronize repeatedly and check that we reach each PSB in the
298	 * correct order.
299	 */
300
301	errcode = pt_qry_sync_backward(decoder, &ip);
302	ptu_int_ge(errcode, 0);
303
304	errcode = pt_qry_get_sync_offset(decoder, &offset);
305	ptu_int_eq(errcode, 0);
306	ptu_uint_eq(offset, sync[2]);
307
308	errcode = pt_qry_sync_backward(decoder, &ip);
309	ptu_int_ge(errcode, 0);
310
311	errcode = pt_qry_get_sync_offset(decoder, &offset);
312	ptu_int_eq(errcode, 0);
313	ptu_uint_eq(offset, sync[0]);
314
315	errcode = pt_qry_sync_backward(decoder, &ip);
316	ptu_int_eq(errcode, -pte_eos);
317
318	return ptu_passed();
319}
320
321static struct ptunit_result
322sync_backward_empty_begin(struct ptu_decoder_fixture *dfix)
323{
324	struct pt_query_decoder *decoder = &dfix->decoder;
325	struct pt_encoder *encoder = &dfix->encoder;
326	uint64_t sync[3], offset, ip;
327	int errcode;
328
329	/* Check that we can use repeated pt_qry_sync_backward() to iterate over
330	 * synchronization points in backwards order.
331	 *
332	 * There's an empty PSB+ at the beginning.  We skip it.
333	 */
334
335	errcode = pt_enc_get_offset(encoder, &sync[0]);
336	ptu_int_ge(errcode, 0);
337
338	pt_encode_psb(encoder);
339	pt_encode_psbend(encoder);
340
341	errcode = pt_enc_get_offset(encoder, &sync[1]);
342	ptu_int_ge(errcode, 0);
343
344	pt_encode_psb(encoder);
345	pt_encode_mode_exec(encoder, ptem_64bit);
346	pt_encode_psbend(encoder);
347
348	errcode = pt_enc_get_offset(encoder, &sync[2]);
349	ptu_int_ge(errcode, 0);
350
351	pt_encode_psb(encoder);
352	pt_encode_mode_exec(encoder, ptem_64bit);
353	pt_encode_psbend(encoder);
354
355	/* Synchronize repeatedly and check that we reach each PSB in the
356	 * correct order.
357	 */
358
359	errcode = pt_qry_sync_backward(decoder, &ip);
360	ptu_int_ge(errcode, 0);
361
362	errcode = pt_qry_get_sync_offset(decoder, &offset);
363	ptu_int_eq(errcode, 0);
364	ptu_uint_eq(offset, sync[2]);
365
366	errcode = pt_qry_sync_backward(decoder, &ip);
367	ptu_int_ge(errcode, 0);
368
369	errcode = pt_qry_get_sync_offset(decoder, &offset);
370	ptu_int_eq(errcode, 0);
371	ptu_uint_eq(offset, sync[1]);
372
373	errcode = pt_qry_sync_backward(decoder, &ip);
374	ptu_int_eq(errcode, -pte_eos);
375
376	return ptu_passed();
377}
378
379static struct ptunit_result
380decode_sync_backward(struct ptu_decoder_fixture *dfix)
381{
382	struct pt_query_decoder *decoder = &dfix->decoder;
383	struct pt_encoder *encoder = &dfix->encoder;
384	struct pt_event event;
385	uint64_t sync[2], offset, ip;
386	int errcode;
387
388	/* Check that we can use sync_backward to re-sync at the current trace
389	 * segment as well as to find the previous trace segment.
390	 */
391
392	errcode = pt_enc_get_offset(encoder, &sync[0]);
393	ptu_int_ge(errcode, 0);
394
395	pt_encode_psb(encoder);
396	pt_encode_mode_exec(encoder, ptem_64bit);
397	pt_encode_psbend(encoder);
398
399	errcode = pt_enc_get_offset(encoder, &sync[1]);
400	ptu_int_ge(errcode, 0);
401
402	pt_encode_psb(encoder);
403	pt_encode_mode_exec(encoder, ptem_64bit);
404	pt_encode_psbend(encoder);
405
406
407	errcode = pt_qry_sync_forward(decoder, &ip);
408	ptu_int_ge(errcode, 0);
409
410	errcode = pt_qry_get_sync_offset(decoder, &offset);
411	ptu_int_eq(errcode, 0);
412	ptu_uint_eq(offset, sync[0]);
413
414	errcode = pt_qry_event(decoder, &event, sizeof(event));
415	ptu_int_ge(errcode, 0);
416	ptu_int_eq(event.type, ptev_exec_mode);
417
418	errcode = pt_qry_event(decoder, &event, sizeof(event));
419	ptu_int_ge(errcode, 0);
420	ptu_int_eq(event.type, ptev_exec_mode);
421
422	errcode = pt_qry_sync_backward(decoder, &ip);
423	ptu_int_ge(errcode, 0);
424
425	errcode = pt_qry_get_sync_offset(decoder, &offset);
426	ptu_int_eq(errcode, 0);
427	ptu_uint_eq(offset, sync[1]);
428
429	errcode = pt_qry_sync_backward(decoder, &ip);
430	ptu_int_ge(errcode, 0);
431
432	errcode = pt_qry_get_sync_offset(decoder, &offset);
433	ptu_int_eq(errcode, 0);
434	ptu_uint_eq(offset, sync[0]);
435
436	errcode = pt_qry_sync_backward(decoder, &ip);
437	ptu_int_eq(errcode, -pte_eos);
438
439	return ptu_passed();
440}
441
442static struct ptunit_result indir_null(struct ptu_decoder_fixture *dfix)
443{
444	struct pt_query_decoder *decoder = &dfix->decoder;
445	struct pt_config *config = &decoder->config;
446	uint64_t ip = pt_dfix_bad_ip, addr = ip;
447	int errcode;
448
449	errcode = pt_qry_indirect_branch(NULL, &addr);
450	ptu_int_eq(errcode, -pte_invalid);
451	ptu_uint_eq(addr, ip);
452
453	errcode = pt_qry_indirect_branch(decoder, NULL);
454	ptu_int_eq(errcode, -pte_invalid);
455	ptu_ptr_eq(decoder->pos, config->begin);
456
457	return ptu_passed();
458}
459
460static struct ptunit_result indir_empty(struct ptu_decoder_fixture *dfix)
461{
462	struct pt_query_decoder *decoder = &dfix->decoder;
463	struct pt_config *config = &decoder->config;
464	uint64_t ip = pt_dfix_bad_ip, addr = ip;
465	int errcode;
466
467	decoder->pos = config->end;
468
469	errcode = pt_qry_indirect_branch(decoder, &addr);
470	ptu_int_eq(errcode, -pte_eos);
471	ptu_uint_eq(addr, ip);
472
473	return ptu_passed();
474}
475
476static struct ptunit_result indir(struct ptu_decoder_fixture *dfix,
477				  enum pt_ip_compression ipc)
478{
479	struct pt_query_decoder *decoder = &dfix->decoder;
480	struct pt_encoder *encoder = &dfix->encoder;
481	struct pt_packet_ip packet;
482	uint64_t addr = pt_dfix_bad_ip;
483	int errcode;
484
485	packet.ipc = ipc;
486	packet.ip = pt_dfix_sext_ip;
487	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
488
489	pt_encode_tip(encoder, packet.ip, packet.ipc);
490
491	ptu_check(ptu_sync_decoder, decoder);
492
493	errcode = pt_qry_indirect_branch(decoder, &addr);
494	if (ipc == pt_ipc_suppressed) {
495		ptu_int_eq(errcode, pts_ip_suppressed | pts_eos);
496		ptu_uint_eq(addr, pt_dfix_bad_ip);
497	} else {
498		ptu_int_eq(errcode, pts_eos);
499		ptu_uint_eq(addr, dfix->last_ip.ip);
500	}
501
502	return ptu_passed();
503}
504
505static struct ptunit_result indir_tnt(struct ptu_decoder_fixture *dfix,
506				      enum pt_ip_compression ipc)
507{
508	struct pt_query_decoder *decoder = &dfix->decoder;
509	struct pt_encoder *encoder = &dfix->encoder;
510	struct pt_packet_ip packet;
511	uint64_t addr = pt_dfix_bad_ip;
512	int errcode;
513
514	packet.ipc = ipc;
515	packet.ip = pt_dfix_sext_ip;
516	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
517
518	pt_encode_tnt_8(encoder, 0ull, 1);
519	pt_encode_tip(encoder, packet.ip, packet.ipc);
520
521	ptu_check(ptu_sync_decoder, decoder);
522
523	errcode = pt_qry_indirect_branch(decoder, &addr);
524	if (ipc == pt_ipc_suppressed) {
525		ptu_int_eq(errcode, pts_ip_suppressed);
526		ptu_uint_eq(addr, pt_dfix_bad_ip);
527	} else {
528		ptu_int_eq(errcode, 0);
529		ptu_uint_eq(addr, dfix->last_ip.ip);
530	}
531
532	return ptu_passed();
533}
534
535static struct ptunit_result indir_cutoff_fail(struct ptu_decoder_fixture *dfix)
536{
537	struct pt_query_decoder *decoder = &dfix->decoder;
538	struct pt_encoder *encoder = &dfix->encoder;
539	uint64_t ip = pt_dfix_bad_ip, addr = ip;
540	int errcode;
541
542	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
543
544	ptu_check(cutoff, decoder, encoder);
545	ptu_check(ptu_sync_decoder, decoder);
546
547	errcode = pt_qry_indirect_branch(decoder, &addr);
548	ptu_int_eq(errcode, -pte_eos);
549	ptu_uint_eq(addr, ip);
550
551	return ptu_passed();
552}
553
554static struct ptunit_result
555indir_skip_tnt_fail(struct ptu_decoder_fixture *dfix)
556{
557	struct pt_query_decoder *decoder = &dfix->decoder;
558	struct pt_encoder *encoder = &dfix->encoder;
559	uint64_t ip = pt_dfix_bad_ip, addr = ip;
560	int errcode;
561
562	pt_encode_tnt_8(encoder, 0, 1);
563	pt_encode_tnt_8(encoder, 0, 1);
564	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
565
566	ptu_check(ptu_sync_decoder, decoder);
567
568	errcode = pt_qry_indirect_branch(decoder, &addr);
569	ptu_int_eq(errcode, -pte_bad_query);
570	ptu_uint_eq(addr, ip);
571
572	return ptu_passed();
573}
574
575static struct ptunit_result
576indir_skip_tip_pge_fail(struct ptu_decoder_fixture *dfix)
577{
578	struct pt_query_decoder *decoder = &dfix->decoder;
579	struct pt_encoder *encoder = &dfix->encoder;
580	uint64_t ip = pt_dfix_bad_ip, addr = ip;
581	const uint8_t *pos;
582	int errcode;
583
584	pos = encoder->pos;
585	pt_encode_tip_pge(encoder, 0, pt_ipc_sext_48);
586	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
587
588	ptu_check(ptu_sync_decoder, decoder);
589
590	errcode = pt_qry_indirect_branch(decoder, &addr);
591	ptu_int_eq(errcode, -pte_bad_query);
592	ptu_ptr_eq(decoder->pos, pos);
593	ptu_uint_eq(addr, ip);
594
595	return ptu_passed();
596}
597
598static struct ptunit_result
599indir_skip_tip_pgd_fail(struct ptu_decoder_fixture *dfix)
600{
601	struct pt_query_decoder *decoder = &dfix->decoder;
602	struct pt_encoder *encoder = &dfix->encoder;
603	uint64_t ip = pt_dfix_bad_ip, addr = ip;
604	const uint8_t *pos;
605	int errcode;
606
607	pos = encoder->pos;
608	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
609	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
610
611	ptu_check(ptu_sync_decoder, decoder);
612
613	errcode = pt_qry_indirect_branch(decoder, &addr);
614	ptu_int_eq(errcode, -pte_bad_query);
615	ptu_ptr_eq(decoder->pos, pos);
616	ptu_uint_eq(addr, ip);
617
618	return ptu_passed();
619}
620
621static struct ptunit_result
622indir_skip_fup_tip_fail(struct ptu_decoder_fixture *dfix)
623{
624	struct pt_query_decoder *decoder = &dfix->decoder;
625	struct pt_encoder *encoder = &dfix->encoder;
626	uint64_t ip = pt_dfix_bad_ip, addr = ip;
627	const uint8_t *pos;
628	int errcode;
629
630	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
631	pos = encoder->pos;
632	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
633	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
634
635	ptu_check(ptu_sync_decoder, decoder);
636
637	errcode = pt_qry_indirect_branch(decoder, &addr);
638	ptu_int_eq(errcode, -pte_bad_query);
639	ptu_ptr_eq(decoder->pos, pos);
640	ptu_uint_eq(addr, ip);
641
642	return ptu_passed();
643}
644
645static struct ptunit_result
646indir_skip_fup_tip_pgd_fail(struct ptu_decoder_fixture *dfix)
647{
648	struct pt_query_decoder *decoder = &dfix->decoder;
649	struct pt_encoder *encoder = &dfix->encoder;
650	uint64_t ip = pt_dfix_bad_ip, addr = ip;
651	const uint8_t *pos;
652	int errcode;
653
654	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
655	pos = encoder->pos;
656	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
657	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
658
659	ptu_check(ptu_sync_decoder, decoder);
660
661	errcode = pt_qry_indirect_branch(decoder, &addr);
662	ptu_int_eq(errcode, -pte_bad_query);
663	ptu_ptr_eq(decoder->pos, pos);
664	ptu_uint_eq(addr, ip);
665
666	return ptu_passed();
667}
668
669static struct ptunit_result cond_null(struct ptu_decoder_fixture *dfix)
670{
671	struct pt_query_decoder *decoder = &dfix->decoder;
672	struct pt_config *config = &decoder->config;
673	int errcode, tnt = 0xbc, taken = tnt;
674
675	errcode = pt_qry_cond_branch(NULL, &taken);
676	ptu_int_eq(errcode, -pte_invalid);
677	ptu_int_eq(taken, tnt);
678
679	errcode = pt_qry_cond_branch(decoder, NULL);
680	ptu_int_eq(errcode, -pte_invalid);
681	ptu_ptr_eq(decoder->pos, config->begin);
682
683	return ptu_passed();
684}
685
686static struct ptunit_result cond_empty(struct ptu_decoder_fixture *dfix)
687{
688	struct pt_query_decoder *decoder = &dfix->decoder;
689	struct pt_config *config = &decoder->config;
690	int errcode, tnt = 0xbc, taken = tnt;
691
692	decoder->pos = config->end;
693
694	errcode = pt_qry_cond_branch(decoder, &taken);
695	ptu_int_eq(errcode, -pte_eos);
696	ptu_int_eq(taken, tnt);
697
698	return ptu_passed();
699}
700
701static struct ptunit_result cond(struct ptu_decoder_fixture *dfix)
702{
703	struct pt_query_decoder *decoder = &dfix->decoder;
704	struct pt_encoder *encoder = &dfix->encoder;
705	int errcode, tnt = 0xbc, taken = tnt;
706
707	pt_encode_tnt_8(encoder, 0x02, 3);
708
709	ptu_check(ptu_sync_decoder, decoder);
710
711	errcode = pt_qry_cond_branch(decoder, &taken);
712	ptu_int_eq(errcode, 0);
713	ptu_int_eq(taken, 0);
714
715	taken = tnt;
716	errcode = pt_qry_cond_branch(decoder, &taken);
717	ptu_int_eq(errcode, 0);
718	ptu_int_eq(taken, 1);
719
720	taken = tnt;
721	errcode = pt_qry_cond_branch(decoder, &taken);
722	ptu_int_eq(errcode, pts_eos);
723	ptu_int_eq(taken, 0);
724
725	taken = tnt;
726	errcode = pt_qry_cond_branch(decoder, &taken);
727	ptu_int_eq(errcode, -pte_eos);
728	ptu_int_eq(taken, tnt);
729
730	return ptu_passed();
731}
732
733static struct ptunit_result cond_skip_tip_fail(struct ptu_decoder_fixture *dfix)
734{
735	struct pt_query_decoder *decoder = &dfix->decoder;
736	struct pt_encoder *encoder = &dfix->encoder;
737	int errcode, tnt = 0xbc, taken = tnt;
738	const uint8_t *pos;
739
740	pos = encoder->pos;
741	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
742	pt_encode_tnt_8(encoder, 0, 1);
743
744	ptu_check(ptu_sync_decoder, decoder);
745
746	errcode = pt_qry_cond_branch(decoder, &taken);
747	ptu_int_eq(errcode, -pte_bad_query);
748	ptu_ptr_eq(decoder->pos, pos);
749	ptu_int_eq(taken, tnt);
750
751	return ptu_passed();
752}
753
754static struct ptunit_result
755cond_skip_tip_pge_fail(struct ptu_decoder_fixture *dfix)
756{
757	struct pt_query_decoder *decoder = &dfix->decoder;
758	struct pt_encoder *encoder = &dfix->encoder;
759	int errcode, tnt = 0xbc, taken = tnt;
760	const uint8_t *pos;
761
762	pos = encoder->pos;
763	pt_encode_tip_pge(encoder, 0, pt_ipc_sext_48);
764	pt_encode_tnt_8(encoder, 0, 1);
765
766	ptu_check(ptu_sync_decoder, decoder);
767
768	errcode = pt_qry_cond_branch(decoder, &taken);
769	ptu_int_eq(errcode, -pte_bad_query);
770	ptu_ptr_eq(decoder->pos, pos);
771	ptu_int_eq(taken, tnt);
772
773	return ptu_passed();
774}
775
776static struct ptunit_result
777cond_skip_tip_pgd_fail(struct ptu_decoder_fixture *dfix)
778{
779	struct pt_query_decoder *decoder = &dfix->decoder;
780	struct pt_encoder *encoder = &dfix->encoder;
781	int errcode, tnt = 0xbc, taken = tnt;
782	const uint8_t *pos;
783
784	pos = encoder->pos;
785	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
786	pt_encode_tnt_8(encoder, 0, 1);
787
788	ptu_check(ptu_sync_decoder, decoder);
789
790	errcode = pt_qry_cond_branch(decoder, &taken);
791	ptu_int_eq(errcode, -pte_bad_query);
792	ptu_ptr_eq(decoder->pos, pos);
793	ptu_int_eq(taken, tnt);
794
795	return ptu_passed();
796}
797
798static struct ptunit_result
799cond_skip_fup_tip_fail(struct ptu_decoder_fixture *dfix)
800{
801	struct pt_query_decoder *decoder = &dfix->decoder;
802	struct pt_encoder *encoder = &dfix->encoder;
803	int errcode, tnt = 0xbc, taken = tnt;
804	const uint8_t *pos;
805
806	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
807	pos = encoder->pos;
808	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
809	pt_encode_tnt_8(encoder, 0, 1);
810
811	ptu_check(ptu_sync_decoder, decoder);
812
813	errcode = pt_qry_cond_branch(decoder, &taken);
814	ptu_int_eq(errcode, -pte_bad_query);
815	ptu_ptr_eq(decoder->pos, pos);
816	ptu_int_eq(taken, tnt);
817
818	return ptu_passed();
819}
820
821static struct ptunit_result
822cond_skip_fup_tip_pgd_fail(struct ptu_decoder_fixture *dfix)
823{
824	struct pt_query_decoder *decoder = &dfix->decoder;
825	struct pt_encoder *encoder = &dfix->encoder;
826	int errcode, tnt = 0xbc, taken = tnt;
827	const uint8_t *pos;
828
829	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
830	pos = encoder->pos;
831	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
832	pt_encode_tnt_8(encoder, 0, 1);
833
834	ptu_check(ptu_sync_decoder, decoder);
835
836	errcode = pt_qry_cond_branch(decoder, &taken);
837	ptu_int_eq(errcode, -pte_bad_query);
838	ptu_ptr_eq(decoder->pos, pos);
839	ptu_int_eq(taken, tnt);
840
841	return ptu_passed();
842}
843
844static struct ptunit_result event_null(struct ptu_decoder_fixture *dfix)
845{
846	struct pt_query_decoder *decoder = &dfix->decoder;
847	struct pt_config *config = &decoder->config;
848	struct pt_event event;
849	int errcode;
850
851	errcode = pt_qry_event(NULL, &event, sizeof(event));
852	ptu_int_eq(errcode, -pte_invalid);
853
854	errcode = pt_qry_event(decoder, NULL, sizeof(event));
855	ptu_int_eq(errcode, -pte_invalid);
856	ptu_ptr_eq(decoder->pos, config->begin);
857
858	return ptu_passed();
859}
860
861static struct ptunit_result event_bad_size(struct ptu_decoder_fixture *dfix)
862{
863	struct pt_query_decoder *decoder = &dfix->decoder;
864	struct pt_event event;
865	int errcode;
866
867	errcode = pt_qry_event(decoder, &event, 4);
868	ptu_int_eq(errcode, -pte_invalid);
869
870	return ptu_passed();
871}
872
873static struct ptunit_result event_small_size(struct ptu_decoder_fixture *dfix)
874{
875	struct pt_query_decoder *decoder = &dfix->decoder;
876	struct pt_encoder *encoder = &dfix->encoder;
877	union {
878		struct pt_event event;
879		uint8_t buffer[41];
880	} variant;
881	int errcode;
882
883	memset(variant.buffer, 0xcd, sizeof(variant.buffer));
884
885	pt_encode_tip_pge(encoder, 0ull, pt_ipc_sext_48);
886
887	ptu_check(ptu_sync_decoder, decoder);
888
889	errcode = pt_qry_event(decoder, &variant.event, 40);
890	ptu_int_eq(errcode, pts_eos);
891	ptu_int_eq(variant.event.type, ptev_enabled);
892	ptu_uint_eq(variant.buffer[40], 0xcd);
893
894	return ptu_passed();
895}
896
897static struct ptunit_result event_big_size(struct ptu_decoder_fixture *dfix)
898{
899	struct pt_query_decoder *decoder = &dfix->decoder;
900	struct pt_encoder *encoder = &dfix->encoder;
901	union {
902		struct pt_event event;
903		uint8_t buffer[1024];
904	} variant;
905	int errcode;
906
907	memset(variant.buffer, 0xcd, sizeof(variant.buffer));
908
909	pt_encode_tip_pge(encoder, 0ull, pt_ipc_sext_48);
910
911	ptu_check(ptu_sync_decoder, decoder);
912
913	errcode = pt_qry_event(decoder, &variant.event, sizeof(variant.buffer));
914	ptu_int_eq(errcode, pts_eos);
915	ptu_int_eq(variant.event.type, ptev_enabled);
916	ptu_uint_eq(variant.buffer[sizeof(variant.event)], 0xcd);
917
918	return ptu_passed();
919}
920
921static struct ptunit_result event_empty(struct ptu_decoder_fixture *dfix)
922{
923	struct pt_query_decoder *decoder = &dfix->decoder;
924	struct pt_config *config = &decoder->config;
925	struct pt_event event;
926	int errcode;
927
928	decoder->pos = config->end;
929
930	errcode = pt_qry_event(decoder, &event, sizeof(event));
931	ptu_int_eq(errcode, -pte_eos);
932
933	return ptu_passed();
934}
935
936static struct ptunit_result event_enabled(struct ptu_decoder_fixture *dfix,
937					  enum pt_ip_compression ipc,
938					  uint64_t tsc)
939{
940	struct pt_query_decoder *decoder = &dfix->decoder;
941	struct pt_encoder *encoder = &dfix->encoder;
942	struct pt_packet_ip packet;
943	struct pt_event event;
944	int errcode;
945
946	packet.ipc = ipc;
947	packet.ip = pt_dfix_max_ip;
948	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
949
950	pt_encode_tip_pge(encoder, packet.ip, packet.ipc);
951
952	ptu_check(ptu_sync_decoder, decoder);
953
954	errcode = pt_qry_event(decoder, &event, sizeof(event));
955	if (ipc == pt_ipc_suppressed)
956		ptu_int_eq(errcode, -pte_bad_packet);
957	else {
958		ptu_int_eq(errcode, pts_eos);
959		ptu_int_eq(event.type, ptev_enabled);
960		ptu_uint_eq(event.variant.enabled.ip, dfix->last_ip.ip);
961
962		if (!tsc)
963			ptu_int_eq(event.has_tsc, 0);
964		else {
965			ptu_int_eq(event.has_tsc, 1);
966			ptu_uint_eq(event.tsc, tsc);
967		}
968	}
969
970	return ptu_passed();
971}
972
973static struct ptunit_result
974event_enabled_cutoff_fail(struct ptu_decoder_fixture *dfix)
975{
976	struct pt_query_decoder *decoder = &dfix->decoder;
977	struct pt_encoder *encoder = &dfix->encoder;
978	struct pt_event event;
979	int errcode;
980
981	pt_encode_tip_pge(encoder, 0, pt_ipc_sext_48);
982
983	ptu_check(cutoff, decoder, encoder);
984	ptu_check(ptu_sync_decoder, decoder);
985
986	errcode = pt_qry_event(decoder, &event, sizeof(event));
987	ptu_int_eq(errcode, -pte_eos);
988
989	return ptu_passed();
990}
991
992static struct ptunit_result event_disabled(struct ptu_decoder_fixture *dfix,
993					   enum pt_ip_compression ipc,
994					   uint64_t tsc)
995{
996	struct pt_query_decoder *decoder = &dfix->decoder;
997	struct pt_encoder *encoder = &dfix->encoder;
998	struct pt_packet_ip packet;
999	struct pt_event event;
1000	int errcode;
1001
1002	packet.ipc = ipc;
1003	packet.ip = pt_dfix_sext_ip;
1004	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
1005
1006	pt_encode_tip_pgd(encoder, packet.ip, packet.ipc);
1007
1008	ptu_check(ptu_sync_decoder, decoder);
1009
1010	errcode = pt_qry_event(decoder, &event, sizeof(event));
1011	ptu_int_eq(errcode, pts_eos);
1012	if (ipc == pt_ipc_suppressed)
1013		ptu_uint_ne(event.ip_suppressed, 0);
1014	else {
1015		ptu_uint_eq(event.ip_suppressed, 0);
1016		ptu_uint_eq(event.variant.disabled.ip, dfix->last_ip.ip);
1017	}
1018	ptu_int_eq(event.type, ptev_disabled);
1019
1020	if (!tsc)
1021		ptu_int_eq(event.has_tsc, 0);
1022	else {
1023		ptu_int_eq(event.has_tsc, 1);
1024		ptu_uint_eq(event.tsc, tsc);
1025	}
1026
1027	return ptu_passed();
1028}
1029
1030static struct ptunit_result
1031event_disabled_cutoff_fail(struct ptu_decoder_fixture *dfix)
1032{
1033	struct pt_query_decoder *decoder = &dfix->decoder;
1034	struct pt_encoder *encoder = &dfix->encoder;
1035	struct pt_event event;
1036	int errcode;
1037
1038	pt_encode_tip_pgd(encoder, 0, pt_ipc_update_32);
1039
1040	ptu_check(cutoff, decoder, encoder);
1041	ptu_check(ptu_sync_decoder, decoder);
1042
1043	errcode = pt_qry_event(decoder, &event, sizeof(event));
1044	ptu_int_eq(errcode, -pte_eos);
1045
1046	return ptu_passed();
1047}
1048
1049static struct ptunit_result
1050event_async_disabled(struct ptu_decoder_fixture *dfix,
1051		     enum pt_ip_compression ipc, uint64_t tsc)
1052{
1053	struct pt_query_decoder *decoder = &dfix->decoder;
1054	struct pt_encoder *encoder = &dfix->encoder;
1055	struct pt_packet_ip fup, tip;
1056	struct pt_event event;
1057	int errcode;
1058
1059	fup.ipc = pt_ipc_sext_48;
1060	fup.ip = pt_dfix_max_ip;
1061	pt_last_ip_update_ip(&dfix->last_ip, &fup, &dfix->config);
1062
1063	tip.ipc = ipc;
1064	tip.ip = pt_dfix_sext_ip;
1065	pt_last_ip_update_ip(&dfix->last_ip, &tip, &dfix->config);
1066
1067	pt_encode_fup(encoder, fup.ip, fup.ipc);
1068	pt_encode_tip_pgd(encoder, tip.ip, tip.ipc);
1069
1070	ptu_check(ptu_sync_decoder, decoder);
1071
1072	errcode = pt_qry_event(decoder, &event, sizeof(event));
1073	ptu_int_eq(errcode, pts_eos);
1074	if (ipc == pt_ipc_suppressed)
1075		ptu_uint_ne(event.ip_suppressed, 0);
1076	else {
1077		ptu_uint_eq(event.ip_suppressed, 0);
1078		ptu_uint_eq(event.variant.async_disabled.ip, dfix->last_ip.ip);
1079	}
1080	ptu_int_eq(event.type, ptev_async_disabled);
1081	ptu_uint_eq(event.variant.async_disabled.at, fup.ip);
1082
1083	if (!tsc)
1084		ptu_int_eq(event.has_tsc, 0);
1085	else {
1086		ptu_int_eq(event.has_tsc, 1);
1087		ptu_uint_eq(event.tsc, tsc);
1088	}
1089
1090	return ptu_passed();
1091}
1092
1093static struct ptunit_result
1094event_async_disabled_suppressed_fail(struct ptu_decoder_fixture *dfix)
1095{
1096	struct pt_query_decoder *decoder = &dfix->decoder;
1097	struct pt_encoder *encoder = &dfix->encoder;
1098	struct pt_event event;
1099	int errcode;
1100
1101	pt_encode_fup(encoder, 0, pt_ipc_suppressed);
1102	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
1103
1104	ptu_check(ptu_sync_decoder, decoder);
1105
1106	errcode = pt_qry_event(decoder, &event, sizeof(event));
1107	ptu_int_eq(errcode, -pte_ip_suppressed);
1108
1109	return ptu_passed();
1110}
1111
1112static struct ptunit_result
1113event_async_disabled_cutoff_fail_a(struct ptu_decoder_fixture *dfix)
1114{
1115	struct pt_query_decoder *decoder = &dfix->decoder;
1116	struct pt_encoder *encoder = &dfix->encoder;
1117	struct pt_event event;
1118	uint64_t at = pt_dfix_sext_ip;
1119	int errcode;
1120
1121	pt_encode_fup(encoder, at, pt_ipc_sext_48);
1122	pt_encode_tip_pgd(encoder, 0, pt_ipc_update_16);
1123
1124	ptu_check(cutoff, decoder, encoder);
1125	ptu_check(ptu_sync_decoder, decoder);
1126
1127	errcode = pt_qry_event(decoder, &event, sizeof(event));
1128	ptu_int_eq(errcode, -pte_eos);
1129
1130	return ptu_passed();
1131}
1132
1133static struct ptunit_result
1134event_async_disabled_cutoff_fail_b(struct ptu_decoder_fixture *dfix)
1135{
1136	struct pt_query_decoder *decoder = &dfix->decoder;
1137	struct pt_encoder *encoder = &dfix->encoder;
1138	struct pt_event event;
1139	int errcode;
1140
1141	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
1142
1143	ptu_check(cutoff, decoder, encoder);
1144	ptu_check(ptu_sync_decoder, decoder);
1145
1146	errcode = pt_qry_event(decoder, &event, sizeof(event));
1147	ptu_int_eq(errcode, -pte_eos);
1148
1149	return ptu_passed();
1150}
1151
1152static struct ptunit_result
1153event_async_branch_suppressed_fail(struct ptu_decoder_fixture *dfix)
1154{
1155	struct pt_query_decoder *decoder = &dfix->decoder;
1156	struct pt_encoder *encoder = &dfix->encoder;
1157	struct pt_event event;
1158	int errcode;
1159
1160	pt_encode_fup(encoder, 0, pt_ipc_suppressed);
1161
1162	ptu_check(ptu_sync_decoder, decoder);
1163
1164	errcode = pt_qry_event(decoder, &event, sizeof(event));
1165	ptu_int_eq(errcode, -pte_ip_suppressed);
1166
1167	return ptu_passed();
1168}
1169
1170static struct ptunit_result event_async_branch(struct ptu_decoder_fixture *dfix,
1171					       enum pt_ip_compression ipc,
1172					       uint64_t tsc)
1173{
1174	struct pt_query_decoder *decoder = &dfix->decoder;
1175	struct pt_encoder *encoder = &dfix->encoder;
1176	struct pt_packet_ip fup, tip;
1177	struct pt_event event;
1178	int errcode;
1179
1180	fup.ipc = pt_ipc_sext_48;
1181	fup.ip = pt_dfix_max_ip;
1182	pt_last_ip_update_ip(&dfix->last_ip, &fup, &dfix->config);
1183
1184	tip.ipc = ipc;
1185	tip.ip = pt_dfix_sext_ip;
1186	pt_last_ip_update_ip(&dfix->last_ip, &tip, &dfix->config);
1187
1188	pt_encode_fup(encoder, fup.ip, fup.ipc);
1189	pt_encode_tip(encoder, tip.ip, tip.ipc);
1190
1191	ptu_check(ptu_sync_decoder, decoder);
1192
1193	errcode = pt_qry_event(decoder, &event, sizeof(event));
1194	ptu_int_eq(errcode, pts_eos);
1195	if (ipc == pt_ipc_suppressed)
1196		ptu_uint_ne(event.ip_suppressed, 0);
1197	else {
1198		ptu_uint_eq(event.ip_suppressed, 0);
1199		ptu_uint_eq(event.variant.async_branch.to, dfix->last_ip.ip);
1200	}
1201	ptu_int_eq(event.type, ptev_async_branch);
1202	ptu_uint_eq(event.variant.async_branch.from, fup.ip);
1203
1204	if (!tsc)
1205		ptu_int_eq(event.has_tsc, 0);
1206	else {
1207		ptu_int_eq(event.has_tsc, 1);
1208		ptu_uint_eq(event.tsc, tsc);
1209	}
1210
1211	return ptu_passed();
1212}
1213
1214static struct ptunit_result
1215event_async_branch_cutoff_fail_a(struct ptu_decoder_fixture *dfix)
1216{
1217	struct pt_query_decoder *decoder = &dfix->decoder;
1218	struct pt_encoder *encoder = &dfix->encoder;
1219	struct pt_event event;
1220	int errcode;
1221
1222	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
1223	pt_encode_tip_pgd(encoder, 0, pt_ipc_update_16);
1224
1225	ptu_check(cutoff, decoder, encoder);
1226	ptu_check(ptu_sync_decoder, decoder);
1227
1228	errcode = pt_qry_event(decoder, &event, sizeof(event));
1229	ptu_int_eq(errcode, -pte_eos);
1230
1231	return ptu_passed();
1232}
1233
1234static struct ptunit_result
1235event_async_branch_cutoff_fail_b(struct ptu_decoder_fixture *dfix)
1236{
1237	struct pt_query_decoder *decoder = &dfix->decoder;
1238	struct pt_encoder *encoder = &dfix->encoder;
1239	struct pt_event event;
1240	int errcode;
1241
1242	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
1243
1244	ptu_check(cutoff, decoder, encoder);
1245	ptu_check(ptu_sync_decoder, decoder);
1246
1247	errcode = pt_qry_event(decoder, &event, sizeof(event));
1248	ptu_int_eq(errcode, -pte_eos);
1249
1250	return ptu_passed();
1251}
1252
1253static struct ptunit_result event_paging(struct ptu_decoder_fixture *dfix,
1254					 uint8_t flags, uint64_t tsc)
1255{
1256	struct pt_query_decoder *decoder = &dfix->decoder;
1257	struct pt_encoder *encoder = &dfix->encoder;
1258	struct pt_event event;
1259	uint64_t cr3 = pt_dfix_max_cr3;
1260	int errcode;
1261
1262	pt_encode_pip(encoder, cr3, flags);
1263
1264	ptu_check(ptu_sync_decoder, decoder);
1265
1266	errcode = pt_qry_event(decoder, &event, sizeof(event));
1267	ptu_int_eq(errcode, pts_eos);
1268	ptu_int_eq(event.type, ptev_paging);
1269	ptu_uint_eq(event.variant.paging.cr3, cr3);
1270	ptu_uint_eq(event.variant.paging.non_root, (flags & pt_pl_pip_nr) != 0);
1271
1272	if (!tsc)
1273		ptu_int_eq(event.has_tsc, 0);
1274	else {
1275		ptu_int_eq(event.has_tsc, 1);
1276		ptu_uint_eq(event.tsc, tsc);
1277	}
1278
1279	return ptu_passed();
1280}
1281
1282static struct ptunit_result
1283event_paging_cutoff_fail(struct ptu_decoder_fixture *dfix)
1284{
1285	struct pt_query_decoder *decoder = &dfix->decoder;
1286	struct pt_encoder *encoder = &dfix->encoder;
1287	struct pt_event event;
1288	int errcode;
1289
1290	pt_encode_pip(encoder, 0, 0);
1291
1292	ptu_check(cutoff, decoder, encoder);
1293	ptu_check(ptu_sync_decoder, decoder);
1294
1295	errcode = pt_qry_event(decoder, &event, sizeof(event));
1296	ptu_int_eq(errcode, -pte_eos);
1297
1298	return ptu_passed();
1299}
1300
1301static struct ptunit_result
1302event_async_paging(struct ptu_decoder_fixture *dfix, uint8_t flags,
1303		   uint64_t tsc)
1304{
1305	struct pt_query_decoder *decoder = &dfix->decoder;
1306	struct pt_encoder *encoder = &dfix->encoder;
1307	struct pt_event event;
1308	uint64_t to = pt_dfix_sext_ip, from = to & ~0xffffull;
1309	uint64_t cr3 = pt_dfix_max_cr3;
1310	int errcode;
1311
1312	pt_encode_fup(encoder, from, pt_ipc_sext_48);
1313	pt_encode_pip(encoder, cr3, flags);
1314	pt_encode_tip(encoder, to, pt_ipc_update_16);
1315
1316	ptu_check(ptu_sync_decoder, decoder);
1317
1318	errcode = pt_qry_event(decoder, &event, sizeof(event));
1319	ptu_int_eq(errcode, pts_event_pending);
1320	ptu_int_eq(event.type, ptev_async_branch);
1321	ptu_uint_eq(event.variant.async_branch.from, from);
1322	ptu_uint_eq(event.variant.async_branch.to, to);
1323
1324	if (!tsc)
1325		ptu_int_eq(event.has_tsc, 0);
1326	else {
1327		ptu_int_eq(event.has_tsc, 1);
1328		ptu_uint_eq(event.tsc, tsc);
1329	}
1330
1331	errcode = pt_qry_event(decoder, &event, sizeof(event));
1332	ptu_int_eq(errcode, pts_eos);
1333	ptu_int_eq(event.type, ptev_async_paging);
1334	ptu_uint_eq(event.variant.async_paging.cr3, cr3);
1335	ptu_uint_eq(event.variant.async_paging.non_root,
1336		    (flags & pt_pl_pip_nr) != 0);
1337	ptu_uint_eq(event.variant.async_paging.ip, to);
1338
1339	if (!tsc)
1340		ptu_int_eq(event.has_tsc, 0);
1341	else {
1342		ptu_int_eq(event.has_tsc, 1);
1343		ptu_uint_eq(event.tsc, tsc);
1344	}
1345
1346	return ptu_passed();
1347}
1348
1349static struct ptunit_result
1350event_async_paging_suppressed(struct ptu_decoder_fixture *dfix, uint8_t flags,
1351			      uint64_t tsc)
1352{
1353	struct pt_query_decoder *decoder = &dfix->decoder;
1354	struct pt_encoder *encoder = &dfix->encoder;
1355	struct pt_event event;
1356	uint64_t from = pt_dfix_sext_ip, cr3 = pt_dfix_max_cr3;
1357	int errcode;
1358
1359	pt_encode_fup(encoder, from, pt_ipc_sext_48);
1360	pt_encode_pip(encoder, cr3, flags);
1361	pt_encode_tip(encoder, 0, pt_ipc_suppressed);
1362
1363	ptu_check(ptu_sync_decoder, decoder);
1364
1365	errcode = pt_qry_event(decoder, &event, sizeof(event));
1366	ptu_int_eq(errcode, pts_event_pending);
1367	ptu_uint_ne(event.ip_suppressed, 0);
1368	ptu_int_eq(event.type, ptev_async_branch);
1369	ptu_uint_eq(event.variant.async_branch.from, from);
1370
1371	if (!tsc)
1372		ptu_int_eq(event.has_tsc, 0);
1373	else {
1374		ptu_int_eq(event.has_tsc, 1);
1375		ptu_uint_eq(event.tsc, tsc);
1376	}
1377
1378	errcode = pt_qry_event(decoder, &event, sizeof(event));
1379	ptu_int_eq(errcode, pts_eos);
1380	ptu_uint_ne(event.ip_suppressed, 0);
1381	ptu_int_eq(event.type, ptev_async_paging);
1382	ptu_uint_eq(event.variant.async_paging.cr3, cr3);
1383	ptu_uint_eq(event.variant.async_paging.non_root,
1384		    (flags & pt_pl_pip_nr) != 0);
1385
1386	if (!tsc)
1387		ptu_int_eq(event.has_tsc, 0);
1388	else {
1389		ptu_int_eq(event.has_tsc, 1);
1390		ptu_uint_eq(event.tsc, tsc);
1391	}
1392
1393	return ptu_passed();
1394}
1395
1396static struct ptunit_result
1397event_async_paging_cutoff_fail(struct ptu_decoder_fixture *dfix)
1398{
1399	struct pt_query_decoder *decoder = &dfix->decoder;
1400	struct pt_encoder *encoder = &dfix->encoder;
1401	struct pt_event event;
1402	int errcode;
1403
1404	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
1405	pt_encode_pip(encoder, 0, 0);
1406
1407	ptu_check(cutoff, decoder, encoder);
1408	ptu_check(ptu_sync_decoder, decoder);
1409
1410	errcode = pt_qry_event(decoder, &event, sizeof(event));
1411	ptu_int_eq(errcode, -pte_eos);
1412
1413	return ptu_passed();
1414}
1415
1416static struct ptunit_result event_overflow_fup(struct ptu_decoder_fixture *dfix,
1417					       enum pt_ip_compression ipc,
1418					       uint64_t tsc)
1419{
1420	struct pt_query_decoder *decoder = &dfix->decoder;
1421	struct pt_encoder *encoder = &dfix->encoder;
1422	struct pt_event event;
1423	struct pt_packet_ip packet;
1424	int errcode;
1425
1426	packet.ipc = ipc;
1427	packet.ip = 0xccull;
1428
1429	pt_last_ip_init(&dfix->last_ip);
1430	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
1431
1432	pt_encode_ovf(encoder);
1433	pt_encode_fup(encoder, packet.ip, packet.ipc);
1434
1435	ptu_check(ptu_sync_decoder, decoder);
1436
1437	errcode = pt_qry_event(decoder, &event, sizeof(event));
1438	switch (ipc) {
1439	case pt_ipc_suppressed:
1440		ptu_int_eq(errcode, -pte_noip);
1441		break;
1442
1443	case pt_ipc_update_16:
1444	case pt_ipc_update_32:
1445	case pt_ipc_update_48:
1446	case pt_ipc_sext_48:
1447	case pt_ipc_full:
1448		ptu_int_eq(errcode, pts_eos);
1449		ptu_int_eq(event.type, ptev_overflow);
1450		ptu_uint_eq(event.variant.overflow.ip, dfix->last_ip.ip);
1451
1452		if (!tsc)
1453			ptu_int_eq(event.has_tsc, 0);
1454		else {
1455			ptu_int_eq(event.has_tsc, 1);
1456			ptu_uint_eq(event.tsc, tsc);
1457		}
1458		break;
1459	}
1460
1461	return ptu_passed();
1462}
1463
1464static struct ptunit_result
1465event_overflow_tip_pge(struct ptu_decoder_fixture *dfix,
1466		       enum pt_ip_compression ipc, uint64_t tsc)
1467{
1468	struct pt_query_decoder *decoder = &dfix->decoder;
1469	struct pt_encoder *encoder = &dfix->encoder;
1470	struct pt_event event;
1471	struct pt_packet_ip packet;
1472	int errcode;
1473
1474	packet.ipc = ipc;
1475	packet.ip = 0xccull;
1476
1477	pt_last_ip_init(&dfix->last_ip);
1478	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
1479
1480	pt_encode_ovf(encoder);
1481	pt_encode_tip_pge(encoder, packet.ip, packet.ipc);
1482
1483	ptu_check(ptu_sync_decoder, decoder);
1484
1485	errcode = pt_qry_event(decoder, &event, sizeof(event));
1486	ptu_int_eq(errcode, pts_event_pending);
1487	ptu_int_eq(event.type, ptev_overflow);
1488	ptu_uint_ne(event.ip_suppressed, 0);
1489
1490	if (!tsc)
1491		ptu_int_eq(event.has_tsc, 0);
1492	else {
1493		ptu_int_eq(event.has_tsc, 1);
1494		ptu_uint_eq(event.tsc, tsc);
1495	}
1496
1497	errcode = pt_qry_event(decoder, &event, sizeof(event));
1498	switch (ipc) {
1499	case pt_ipc_suppressed:
1500		ptu_int_eq(errcode, -pte_bad_packet);
1501		break;
1502
1503	case pt_ipc_update_16:
1504	case pt_ipc_update_32:
1505	case pt_ipc_update_48:
1506	case pt_ipc_sext_48:
1507	case pt_ipc_full:
1508		ptu_int_eq(errcode, pts_eos);
1509		ptu_int_eq(event.type, ptev_enabled);
1510		ptu_uint_eq(event.variant.enabled.ip, dfix->last_ip.ip);
1511
1512		if (!tsc)
1513			ptu_int_eq(event.has_tsc, 0);
1514		else {
1515			ptu_int_eq(event.has_tsc, 1);
1516			ptu_uint_eq(event.tsc, tsc);
1517		}
1518		break;
1519	}
1520
1521	return ptu_passed();
1522}
1523
1524static struct ptunit_result
1525event_overflow_cutoff_fail(struct ptu_decoder_fixture *dfix)
1526{
1527	struct pt_query_decoder *decoder = &dfix->decoder;
1528	struct pt_encoder *encoder = &dfix->encoder;
1529	struct pt_event event;
1530	int errcode;
1531
1532	pt_encode_ovf(encoder);
1533
1534	ptu_check(cutoff, decoder, encoder);
1535	ptu_check(ptu_sync_decoder, decoder);
1536
1537	errcode = pt_qry_event(decoder, &event, sizeof(event));
1538	ptu_int_eq(errcode, -pte_eos);
1539
1540	return ptu_passed();
1541}
1542
1543static struct ptunit_result event_stop(struct ptu_decoder_fixture *dfix,
1544				       uint64_t tsc)
1545{
1546	struct pt_query_decoder *decoder = &dfix->decoder;
1547	struct pt_encoder *encoder = &dfix->encoder;
1548	struct pt_event event;
1549	int errcode;
1550
1551	pt_encode_stop(encoder);
1552
1553	ptu_sync_decoder(decoder);
1554
1555	errcode = pt_qry_event(decoder, &event, sizeof(event));
1556	ptu_int_eq(errcode, pts_eos);
1557	ptu_int_eq(event.type, ptev_stop);
1558
1559	if (!tsc)
1560		ptu_int_eq(event.has_tsc, 0);
1561	else {
1562		ptu_int_eq(event.has_tsc, 1);
1563		ptu_uint_eq(event.tsc, tsc);
1564	}
1565
1566	return ptu_passed();
1567}
1568
1569static struct ptunit_result
1570event_exec_mode_tip(struct ptu_decoder_fixture *dfix,
1571		    enum pt_ip_compression ipc, uint64_t tsc)
1572{
1573	struct pt_query_decoder *decoder = &dfix->decoder;
1574	struct pt_encoder *encoder = &dfix->encoder;
1575	enum pt_exec_mode mode = ptem_16bit;
1576	struct pt_packet_ip packet;
1577	struct pt_event event;
1578	uint64_t addr = 0ull;
1579	int errcode;
1580
1581	packet.ipc = ipc;
1582	packet.ip = pt_dfix_max_ip;
1583	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
1584
1585	pt_encode_mode_exec(encoder, mode);
1586	pt_encode_tip(encoder, packet.ip, packet.ipc);
1587
1588	ptu_check(ptu_sync_decoder, decoder);
1589
1590	errcode = pt_qry_event(decoder, &event, sizeof(event));
1591	ptu_int_eq(errcode, 0);
1592	if (ipc == pt_ipc_suppressed)
1593		ptu_uint_ne(event.ip_suppressed, 0);
1594	else {
1595		ptu_uint_eq(event.ip_suppressed, 0);
1596		ptu_uint_eq(event.variant.exec_mode.ip, dfix->last_ip.ip);
1597	}
1598	ptu_int_eq(event.type, ptev_exec_mode);
1599	ptu_int_eq(event.variant.exec_mode.mode, mode);
1600
1601	if (!tsc)
1602		ptu_int_eq(event.has_tsc, 0);
1603	else {
1604		ptu_int_eq(event.has_tsc, 1);
1605		ptu_uint_eq(event.tsc, tsc);
1606	}
1607
1608	errcode = pt_qry_indirect_branch(decoder, &addr);
1609	if (ipc == pt_ipc_suppressed)
1610		ptu_int_eq(errcode, pts_ip_suppressed | pts_eos);
1611	else {
1612		ptu_int_eq(errcode, pts_eos);
1613		ptu_uint_eq(addr, dfix->last_ip.ip);
1614	}
1615
1616	return ptu_passed();
1617}
1618
1619static struct ptunit_result
1620event_exec_mode_tip_cutoff_fail(struct ptu_decoder_fixture *dfix)
1621{
1622	struct pt_query_decoder *decoder = &dfix->decoder;
1623	struct pt_encoder *encoder = &dfix->encoder;
1624	struct pt_event event;
1625	int errcode;
1626
1627	pt_encode_mode_exec(encoder, ptem_32bit);
1628	pt_encode_tip(encoder, 0, pt_ipc_update_16);
1629
1630	ptu_check(cutoff, decoder, encoder);
1631	ptu_check(ptu_sync_decoder, decoder);
1632
1633	errcode = pt_qry_event(decoder, &event, sizeof(event));
1634	ptu_int_eq(errcode, -pte_eos);
1635
1636	return ptu_passed();
1637}
1638
1639static struct ptunit_result
1640event_exec_mode_tip_pge(struct ptu_decoder_fixture *dfix,
1641			enum pt_ip_compression ipc, uint64_t tsc)
1642{
1643	struct pt_query_decoder *decoder = &dfix->decoder;
1644	struct pt_encoder *encoder = &dfix->encoder;
1645	enum pt_exec_mode mode = ptem_16bit;
1646	struct pt_packet_ip packet;
1647	struct pt_event event;
1648	uint64_t addr = 0ull;
1649	int errcode;
1650
1651	packet.ipc = ipc;
1652	packet.ip = pt_dfix_max_ip;
1653	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
1654
1655	pt_encode_mode_exec(encoder, mode);
1656	pt_encode_tip_pge(encoder, packet.ip, packet.ipc);
1657
1658	ptu_check(ptu_sync_decoder, decoder);
1659	decoder->enabled = 0;
1660
1661	errcode = pt_qry_event(decoder, &event, sizeof(event));
1662	if (ipc == pt_ipc_suppressed) {
1663		ptu_int_eq(errcode, -pte_bad_packet);
1664		ptu_uint_eq(addr, 0ull);
1665	} else {
1666		ptu_int_eq(errcode, pts_event_pending);
1667		ptu_int_eq(event.type, ptev_enabled);
1668		ptu_uint_eq(event.variant.enabled.ip, dfix->last_ip.ip);
1669
1670		if (!tsc)
1671			ptu_int_eq(event.has_tsc, 0);
1672		else {
1673			ptu_int_eq(event.has_tsc, 1);
1674			ptu_uint_eq(event.tsc, tsc);
1675		}
1676
1677		errcode = pt_qry_event(decoder, &event, sizeof(event));
1678		ptu_int_eq(errcode, pts_eos);
1679		ptu_int_eq(event.type, ptev_exec_mode);
1680		ptu_int_eq(event.variant.exec_mode.mode, mode);
1681		ptu_uint_eq(event.variant.exec_mode.ip, dfix->last_ip.ip);
1682
1683		if (!tsc)
1684			ptu_int_eq(event.has_tsc, 0);
1685		else {
1686			ptu_int_eq(event.has_tsc, 1);
1687			ptu_uint_eq(event.tsc, tsc);
1688		}
1689	}
1690
1691	return ptu_passed();
1692}
1693
1694static struct ptunit_result
1695event_exec_mode_tip_pge_cutoff_fail(struct ptu_decoder_fixture *dfix)
1696{
1697	struct pt_query_decoder *decoder = &dfix->decoder;
1698	struct pt_encoder *encoder = &dfix->encoder;
1699	struct pt_event event;
1700	int errcode;
1701
1702	pt_encode_mode_exec(encoder, ptem_16bit);
1703	pt_encode_tip_pge(encoder, 0, pt_ipc_sext_48);
1704
1705	ptu_check(cutoff, decoder, encoder);
1706	ptu_check(ptu_sync_decoder, decoder);
1707
1708	errcode = pt_qry_event(decoder, &event, sizeof(event));
1709	ptu_int_eq(errcode, -pte_eos);
1710
1711	return ptu_passed();
1712}
1713
1714static struct ptunit_result
1715event_exec_mode_cutoff_fail(struct ptu_decoder_fixture *dfix)
1716{
1717	struct pt_query_decoder *decoder = &dfix->decoder;
1718	struct pt_encoder *encoder = &dfix->encoder;
1719	struct pt_event event;
1720	int errcode;
1721
1722	pt_encode_mode_exec(encoder, ptem_64bit);
1723
1724	ptu_check(cutoff, decoder, encoder);
1725	ptu_check(ptu_sync_decoder, decoder);
1726
1727	errcode = pt_qry_event(decoder, &event, sizeof(event));
1728	ptu_int_eq(errcode, -pte_eos);
1729
1730	return ptu_passed();
1731}
1732
1733static struct ptunit_result event_tsx_fup(struct ptu_decoder_fixture *dfix,
1734					  enum pt_ip_compression ipc,
1735					  uint8_t flags, uint64_t tsc)
1736{
1737	struct pt_query_decoder *decoder = &dfix->decoder;
1738	struct pt_encoder *encoder = &dfix->encoder;
1739	struct pt_packet_ip fup, tip;
1740	struct pt_event event;
1741	uint64_t addr = 0;
1742	int errcode;
1743
1744	fup.ipc = ipc;
1745	fup.ip = pt_dfix_max_ip;
1746	pt_last_ip_update_ip(&dfix->last_ip, &fup, &dfix->config);
1747
1748	tip.ipc = pt_ipc_sext_48;
1749	tip.ip = pt_dfix_sext_ip;
1750
1751	pt_encode_mode_tsx(encoder, flags);
1752	pt_encode_fup(encoder, fup.ip, fup.ipc);
1753	pt_encode_tip(encoder, tip.ip, tip.ipc);
1754
1755	ptu_check(ptu_sync_decoder, decoder);
1756
1757	errcode = pt_qry_event(decoder, &event, sizeof(event));
1758	ptu_int_eq(errcode, 0);
1759	if (ipc == pt_ipc_suppressed)
1760		ptu_uint_ne(event.ip_suppressed, 0);
1761	else {
1762		ptu_uint_eq(event.ip_suppressed, 0);
1763		ptu_uint_eq(event.variant.tsx.ip, dfix->last_ip.ip);
1764	}
1765	ptu_int_eq(event.type, ptev_tsx);
1766	ptu_int_eq(event.variant.tsx.speculative,
1767		   (flags & pt_mob_tsx_intx) != 0);
1768	ptu_int_eq(event.variant.tsx.aborted,
1769		   (flags & pt_mob_tsx_abrt) != 0);
1770
1771	if (!tsc)
1772		ptu_int_eq(event.has_tsc, 0);
1773	else {
1774		ptu_int_eq(event.has_tsc, 1);
1775		ptu_uint_eq(event.tsc, tsc);
1776	}
1777
1778	errcode = pt_qry_indirect_branch(decoder, &addr);
1779	ptu_int_eq(errcode, pts_eos);
1780	ptu_uint_eq(addr, tip.ip);
1781
1782	return ptu_passed();
1783}
1784
1785static struct ptunit_result
1786event_tsx_fup_cutoff_fail(struct ptu_decoder_fixture *dfix)
1787{
1788	struct pt_query_decoder *decoder = &dfix->decoder;
1789	struct pt_encoder *encoder = &dfix->encoder;
1790	struct pt_event event;
1791	int errcode;
1792
1793	pt_encode_mode_tsx(encoder, 0);
1794	pt_encode_fup(encoder, 0, pt_ipc_update_16);
1795
1796	ptu_check(cutoff, decoder, encoder);
1797	ptu_check(ptu_sync_decoder, decoder);
1798
1799	errcode = pt_qry_event(decoder, &event, sizeof(event));
1800	ptu_int_eq(errcode, -pte_eos);
1801
1802	return ptu_passed();
1803}
1804
1805static struct ptunit_result
1806event_tsx_cutoff_fail(struct ptu_decoder_fixture *dfix)
1807{
1808	struct pt_query_decoder *decoder = &dfix->decoder;
1809	struct pt_encoder *encoder = &dfix->encoder;
1810	struct pt_event event;
1811	int errcode;
1812
1813	pt_encode_mode_tsx(encoder, 0);
1814
1815	ptu_check(cutoff, decoder, encoder);
1816	ptu_check(ptu_sync_decoder, decoder);
1817
1818	errcode = pt_qry_event(decoder, &event, sizeof(event));
1819	ptu_int_eq(errcode, -pte_eos);
1820
1821	return ptu_passed();
1822}
1823
1824static struct ptunit_result
1825event_skip_tip_fail(struct ptu_decoder_fixture *dfix)
1826{
1827	struct pt_query_decoder *decoder = &dfix->decoder;
1828	struct pt_encoder *encoder = &dfix->encoder;
1829	struct pt_event event;
1830	const uint8_t *pos;
1831	int errcode;
1832
1833	pos = encoder->pos;
1834	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
1835	/* We omit the actual event - we don't get that far, anyway. */
1836
1837	ptu_check(ptu_sync_decoder, decoder);
1838
1839	errcode = pt_qry_event(decoder, &event, sizeof(event));
1840	ptu_int_eq(errcode, -pte_bad_query);
1841	ptu_ptr_eq(decoder->pos, pos);
1842
1843	return ptu_passed();
1844}
1845
1846static struct ptunit_result
1847event_skip_tnt_8_fail(struct ptu_decoder_fixture *dfix)
1848{
1849	struct pt_query_decoder *decoder = &dfix->decoder;
1850	struct pt_encoder *encoder = &dfix->encoder;
1851	struct pt_event event;
1852	int errcode;
1853
1854	pt_encode_tnt_8(encoder, 0, 1);
1855	pt_encode_tnt_8(encoder, 0, 1);
1856	/* We omit the actual event - we don't get that far, anyway. */
1857
1858	ptu_check(ptu_sync_decoder, decoder);
1859
1860	errcode = pt_qry_event(decoder, &event, sizeof(event));
1861	ptu_int_eq(errcode, -pte_bad_query);
1862	/* The fail position depends on the fixture's header. */
1863
1864	return ptu_passed();
1865}
1866
1867static struct ptunit_result
1868event_skip_tnt_64_fail(struct ptu_decoder_fixture *dfix)
1869{
1870	struct pt_query_decoder *decoder = &dfix->decoder;
1871	struct pt_encoder *encoder = &dfix->encoder;
1872	struct pt_event event;
1873	int errcode;
1874
1875	pt_encode_tnt_64(encoder, 0, 1);
1876	pt_encode_tnt_64(encoder, 0, 1);
1877	/* We omit the actual event - we don't get that far, anyway. */
1878
1879	ptu_check(ptu_sync_decoder, decoder);
1880
1881	errcode = pt_qry_event(decoder, &event, sizeof(event));
1882	ptu_int_eq(errcode, -pte_bad_query);
1883	/* The fail position depends on the fixture's header. */
1884
1885	return ptu_passed();
1886}
1887
1888static struct ptunit_result sync_event(struct ptu_decoder_fixture *dfix,
1889				       enum pt_ip_compression ipc)
1890{
1891	struct pt_query_decoder *decoder = &dfix->decoder;
1892	struct pt_encoder *encoder = &dfix->encoder;
1893	struct pt_packet_ip packet;
1894	struct pt_event event;
1895	uint64_t addr = 0ull;
1896	int errcode;
1897
1898	packet.ipc = ipc;
1899	packet.ip = 0xccull;
1900
1901	pt_last_ip_init(&dfix->last_ip);
1902	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
1903
1904	pt_encode_psb(encoder);
1905	pt_encode_mode_tsx(encoder, pt_mob_tsx_intx);
1906	pt_encode_fup(encoder, packet.ip, packet.ipc);
1907	pt_encode_psbend(encoder);
1908
1909	errcode = pt_qry_sync_forward(decoder, &addr);
1910	switch (ipc) {
1911	case pt_ipc_suppressed:
1912		ptu_int_eq(errcode, (pts_event_pending | pts_ip_suppressed));
1913		break;
1914
1915	case pt_ipc_update_16:
1916	case pt_ipc_update_32:
1917	case pt_ipc_update_48:
1918	case pt_ipc_sext_48:
1919	case pt_ipc_full:
1920		ptu_int_eq(errcode, pts_event_pending);
1921		ptu_uint_eq(addr, dfix->last_ip.ip);
1922		break;
1923	}
1924
1925	errcode = pt_qry_event(decoder, &event, sizeof(event));
1926	ptu_int_eq(errcode, pts_eos);
1927	ptu_uint_ne(event.status_update, 0);
1928	if (ipc == pt_ipc_suppressed)
1929		ptu_uint_ne(event.ip_suppressed, 0);
1930	else {
1931		ptu_uint_eq(event.ip_suppressed, 0);
1932		ptu_uint_eq(event.variant.tsx.ip, dfix->last_ip.ip);
1933	}
1934	ptu_int_eq(event.type, ptev_tsx);
1935	ptu_int_eq(event.variant.tsx.speculative, 1);
1936	ptu_int_eq(event.variant.tsx.aborted, 0);
1937	ptu_int_eq(event.has_tsc, 0);
1938
1939	return ptu_passed();
1940}
1941
1942static struct ptunit_result
1943sync_event_cutoff_fail(struct ptu_decoder_fixture *dfix)
1944{
1945	struct pt_query_decoder *decoder = &dfix->decoder;
1946	struct pt_encoder *encoder = &dfix->encoder;
1947	uint64_t addr;
1948	int errcode;
1949
1950	pt_encode_psb(encoder);
1951	pt_encode_psbend(encoder);
1952
1953	ptu_check(cutoff, decoder, encoder);
1954
1955	errcode = pt_qry_sync_forward(decoder, &addr);
1956	ptu_int_eq(errcode, -pte_eos);
1957
1958	return ptu_passed();
1959}
1960
1961static struct ptunit_result
1962sync_event_incomplete_fail(struct ptu_decoder_fixture *dfix)
1963{
1964	struct pt_query_decoder *decoder = &dfix->decoder;
1965	struct pt_encoder *encoder = &dfix->encoder;
1966	uint64_t addr;
1967	int errcode;
1968
1969	pt_encode_psb(encoder);
1970
1971	errcode = pt_qry_sync_forward(decoder, &addr);
1972	ptu_int_eq(errcode, -pte_eos);
1973
1974	return ptu_passed();
1975}
1976
1977static struct ptunit_result sync_ovf_event(struct ptu_decoder_fixture *dfix,
1978					   enum pt_ip_compression ipc)
1979{
1980	struct pt_query_decoder *decoder = &dfix->decoder;
1981	struct pt_encoder *encoder = &dfix->encoder;
1982	struct pt_packet_ip fup, ovf;
1983	struct pt_event event;
1984	uint64_t addr = 0;
1985	int errcode;
1986
1987	fup.ipc = pt_ipc_sext_48;
1988	fup.ip = pt_dfix_max_ip;
1989
1990	ovf.ipc = ipc;
1991	ovf.ip = 0xccull;
1992
1993	pt_last_ip_init(&dfix->last_ip);
1994	pt_last_ip_update_ip(&dfix->last_ip, &ovf, &dfix->config);
1995
1996	pt_encode_psb(encoder);
1997	pt_encode_fup(encoder, fup.ip, fup.ipc);
1998	pt_encode_mode_tsx(encoder, 0);
1999	pt_encode_tsc(encoder, 0x1000);
2000	pt_encode_ovf(encoder);
2001	pt_encode_fup(encoder, ovf.ip, ovf.ipc);
2002
2003	errcode = pt_qry_sync_forward(decoder, &addr);
2004	ptu_int_eq(errcode, pts_event_pending);
2005	ptu_uint_eq(addr, fup.ip);
2006
2007	errcode = pt_qry_event(decoder, &event, sizeof(event));
2008	ptu_int_eq(errcode, pts_event_pending);
2009	ptu_uint_ne(event.status_update, 0);
2010	ptu_int_eq(event.type, ptev_tsx);
2011	ptu_int_eq(event.variant.tsx.speculative, 0);
2012	ptu_int_eq(event.variant.tsx.aborted, 0);
2013	ptu_uint_eq(event.variant.tsx.ip, fup.ip);
2014	ptu_int_eq(event.has_tsc, 1);
2015	ptu_uint_eq(event.tsc, 0x1000);
2016
2017	errcode = pt_qry_event(decoder, &event, sizeof(event));
2018	switch (ipc) {
2019	case pt_ipc_suppressed:
2020		ptu_int_eq(errcode, -pte_noip);
2021		return ptu_passed();
2022
2023	case pt_ipc_update_16:
2024	case pt_ipc_update_32:
2025	case pt_ipc_update_48:
2026	case pt_ipc_sext_48:
2027	case pt_ipc_full:
2028		ptu_int_eq(errcode, pts_eos);
2029		ptu_int_eq(event.type, ptev_overflow);
2030		ptu_uint_eq(event.variant.overflow.ip, dfix->last_ip.ip);
2031		ptu_int_eq(event.has_tsc, 1);
2032		ptu_uint_eq(event.tsc, 0x1000);
2033		break;
2034	}
2035
2036	return ptu_passed();
2037}
2038
2039static struct ptunit_result
2040sync_ovf_event_cutoff_fail(struct ptu_decoder_fixture *dfix)
2041{
2042	struct pt_query_decoder *decoder = &dfix->decoder;
2043	struct pt_encoder *encoder = &dfix->encoder;
2044	uint64_t addr;
2045	int errcode;
2046
2047	pt_encode_psb(encoder);
2048	pt_encode_ovf(encoder);
2049
2050	ptu_check(cutoff, decoder, encoder);
2051
2052	errcode = pt_qry_sync_forward(decoder, &addr);
2053	ptu_int_eq(errcode, -pte_eos);
2054
2055	return ptu_passed();
2056}
2057
2058static struct ptunit_result time_null_fail(struct ptu_decoder_fixture *dfix)
2059{
2060	struct pt_query_decoder *decoder = &dfix->decoder;
2061	uint64_t tsc;
2062	int errcode;
2063
2064	errcode = pt_qry_time(NULL, NULL, NULL, NULL);
2065	ptu_int_eq(errcode, -pte_invalid);
2066
2067	errcode = pt_qry_time(decoder, NULL, NULL, NULL);
2068	ptu_int_eq(errcode, -pte_invalid);
2069
2070	errcode = pt_qry_time(NULL, &tsc, NULL, NULL);
2071	ptu_int_eq(errcode, -pte_invalid);
2072
2073	return ptu_passed();
2074}
2075
2076static struct ptunit_result time_initial(struct ptu_decoder_fixture *dfix)
2077{
2078	struct pt_query_decoder *decoder = &dfix->decoder;
2079	uint64_t tsc;
2080	int errcode;
2081
2082	errcode = pt_qry_time(decoder, &tsc, NULL, NULL);
2083	ptu_int_eq(errcode, -pte_no_time);
2084
2085	return ptu_passed();
2086}
2087
2088static struct ptunit_result time(struct ptu_decoder_fixture *dfix)
2089{
2090	struct pt_query_decoder *decoder = &dfix->decoder;
2091	uint64_t tsc, exp;
2092	int errcode;
2093
2094	exp = 0x11223344556677ull;
2095
2096	decoder->last_time.have_tsc = 1;
2097	decoder->last_time.tsc = exp;
2098
2099	errcode = pt_qry_time(decoder, &tsc, NULL, NULL);
2100	ptu_int_eq(errcode, 0);
2101	ptu_uint_eq(tsc, exp);
2102
2103	return ptu_passed();
2104}
2105
2106static struct ptunit_result cbr_null(struct ptu_decoder_fixture *dfix)
2107{
2108	struct pt_query_decoder *decoder = &dfix->decoder;
2109	uint32_t cbr;
2110	int errcode;
2111
2112	errcode = pt_qry_core_bus_ratio(NULL, NULL);
2113	ptu_int_eq(errcode, -pte_invalid);
2114
2115	errcode = pt_qry_core_bus_ratio(decoder, NULL);
2116	ptu_int_eq(errcode, -pte_invalid);
2117
2118	errcode = pt_qry_core_bus_ratio(NULL, &cbr);
2119	ptu_int_eq(errcode, -pte_invalid);
2120
2121	return ptu_passed();
2122}
2123
2124static struct ptunit_result cbr_initial(struct ptu_decoder_fixture *dfix)
2125{
2126	struct pt_query_decoder *decoder = &dfix->decoder;
2127	uint32_t cbr;
2128	int errcode;
2129
2130	errcode = pt_qry_core_bus_ratio(decoder, &cbr);
2131	ptu_int_eq(errcode, -pte_no_cbr);
2132
2133	return ptu_passed();
2134}
2135
2136static struct ptunit_result cbr(struct ptu_decoder_fixture *dfix)
2137{
2138	struct pt_query_decoder *decoder = &dfix->decoder;
2139	uint32_t cbr;
2140	int errcode;
2141
2142	decoder->last_time.have_cbr = 1;
2143	decoder->last_time.cbr = 42;
2144
2145	errcode = pt_qry_core_bus_ratio(decoder, &cbr);
2146	ptu_int_eq(errcode, 0);
2147	ptu_uint_eq(cbr, 42);
2148
2149	return ptu_passed();
2150}
2151
2152/* Test that end-of-stream is indicated correctly when the stream ends with a
2153 * partial non-query-relevant packet.
2154 */
2155static struct ptunit_result indir_cyc_cutoff(struct ptu_decoder_fixture *dfix)
2156{
2157	struct pt_query_decoder *decoder = &dfix->decoder;
2158	struct pt_encoder *encoder = &dfix->encoder;
2159	uint64_t ip;
2160	int errcode;
2161
2162	pt_encode_tip(encoder, 0xa000ull, pt_ipc_full);
2163	pt_encode_cyc(encoder, 0xfff);
2164
2165	ptu_check(cutoff, decoder, encoder);
2166	ptu_check(ptu_sync_decoder, decoder);
2167
2168	errcode = pt_qry_indirect_branch(decoder, &ip);
2169	ptu_int_eq(errcode, pts_eos);
2170
2171	return ptu_passed();
2172}
2173
2174/* Test that end-of-stream is indicated correctly when the stream ends with a
2175 * partial non-query-relevant packet.
2176 */
2177static struct ptunit_result cond_cyc_cutoff(struct ptu_decoder_fixture *dfix)
2178{
2179	struct pt_query_decoder *decoder = &dfix->decoder;
2180	struct pt_encoder *encoder = &dfix->encoder;
2181	int errcode, taken;
2182
2183	pt_encode_tnt_8(encoder, 0, 1);
2184	pt_encode_cyc(encoder, 0xfff);
2185
2186	ptu_check(cutoff, decoder, encoder);
2187	ptu_check(ptu_sync_decoder, decoder);
2188
2189	errcode = pt_qry_cond_branch(decoder, &taken);
2190	ptu_int_eq(errcode, pts_eos);
2191
2192	return ptu_passed();
2193}
2194
2195/* Test that end-of-stream is indicated correctly when the stream ends with a
2196 * partial non-query-relevant packet.
2197 */
2198static struct ptunit_result event_cyc_cutoff(struct ptu_decoder_fixture *dfix)
2199{
2200	struct pt_query_decoder *decoder = &dfix->decoder;
2201	struct pt_encoder *encoder = &dfix->encoder;
2202	struct pt_event event;
2203	int errcode;
2204
2205	pt_encode_tip_pgd(encoder, 0ull, pt_ipc_full);
2206	pt_encode_cyc(encoder, 0xffff);
2207
2208	ptu_check(cutoff, decoder, encoder);
2209	ptu_check(ptu_sync_decoder, decoder);
2210
2211	errcode = pt_qry_event(decoder, &event, sizeof(event));
2212	ptu_int_eq(errcode, pts_eos);
2213
2214	return ptu_passed();
2215}
2216
2217static struct ptunit_result ptu_dfix_init(struct ptu_decoder_fixture *dfix)
2218{
2219	struct pt_config *config = &dfix->config;
2220	int errcode;
2221
2222	(void) memset(dfix->buffer, 0, sizeof(dfix->buffer));
2223
2224	pt_config_init(config);
2225
2226	config->begin = dfix->buffer;
2227	config->end = dfix->buffer + sizeof(dfix->buffer);
2228
2229	errcode = pt_encoder_init(&dfix->encoder, config);
2230	ptu_int_eq(errcode, 0);
2231
2232	errcode = pt_qry_decoder_init(&dfix->decoder, config);
2233	ptu_int_eq(errcode, 0);
2234
2235	dfix->decoder.ip.ip = pt_dfix_bad_ip;
2236	dfix->decoder.ip.have_ip = 1;
2237	dfix->decoder.ip.suppressed = 0;
2238
2239	dfix->last_ip = dfix->decoder.ip;
2240
2241	if (dfix->header)
2242		dfix->header(dfix);
2243
2244	return ptu_passed();
2245}
2246
2247static struct ptunit_result ptu_dfix_fini(struct ptu_decoder_fixture *dfix)
2248{
2249	pt_qry_decoder_fini(&dfix->decoder);
2250	pt_encoder_fini(&dfix->encoder);
2251
2252	return ptu_passed();
2253}
2254
2255/* Synchronize the decoder at the beginnig of an empty buffer. */
2256static struct ptunit_result
2257ptu_dfix_header_sync(struct ptu_decoder_fixture *dfix)
2258{
2259	struct pt_query_decoder *decoder = &dfix->decoder;
2260
2261	/* Synchronize the decoder at the beginning of the buffer. */
2262	decoder->pos = decoder->config.begin;
2263
2264	return ptu_passed();
2265}
2266
2267/* Synchronize the decoder at the beginnig of a buffer containing packets that
2268 * should be skipped for unconditional indirect branch queries.
2269 */
2270static struct ptunit_result
2271ptu_dfix_header_indir(struct ptu_decoder_fixture *dfix)
2272{
2273	struct pt_query_decoder *decoder = &dfix->decoder;
2274	struct pt_encoder *encoder = &dfix->encoder;
2275
2276	pt_encode_pad(encoder);
2277	pt_encode_mtc(encoder, 1);
2278	pt_encode_pad(encoder);
2279	pt_encode_tsc(encoder, 0);
2280
2281	/* Synchronize the decoder at the beginning of the buffer. */
2282	decoder->pos = decoder->config.begin;
2283
2284	return ptu_passed();
2285}
2286
2287/* Synchronize the decoder at the beginnig of a buffer containing packets that
2288 * should be skipped for unconditional indirect branch queries including a PSB.
2289 */
2290static struct ptunit_result
2291ptu_dfix_header_indir_psb(struct ptu_decoder_fixture *dfix)
2292{
2293	struct pt_query_decoder *decoder = &dfix->decoder;
2294	struct pt_encoder *encoder = &dfix->encoder;
2295
2296	/* The psb must be empty since the tests won't skip status events.
2297	 * On the other hand, we do need to provide an address since tests
2298	 * may want to update last-ip, which requires a last-ip, of course.
2299	 */
2300	pt_encode_pad(encoder);
2301	pt_encode_tsc(encoder, 0);
2302	pt_encode_psb(encoder);
2303	pt_encode_mtc(encoder, 1);
2304	pt_encode_pad(encoder);
2305	pt_encode_tsc(encoder, 0);
2306	pt_encode_fup(encoder, pt_dfix_sext_ip, pt_ipc_sext_48);
2307	pt_encode_psbend(encoder);
2308	pt_encode_mtc(encoder, 1);
2309	pt_encode_pad(encoder);
2310
2311	/* Synchronize the decoder at the beginning of the buffer. */
2312	decoder->pos = decoder->config.begin;
2313
2314	return ptu_passed();
2315}
2316
2317/* Synchronize the decoder at the beginnig of a buffer containing packets that
2318 * should be skipped for conditional branch queries.
2319 */
2320static struct ptunit_result
2321ptu_dfix_header_cond(struct ptu_decoder_fixture *dfix)
2322{
2323	struct pt_query_decoder *decoder = &dfix->decoder;
2324	struct pt_encoder *encoder = &dfix->encoder;
2325
2326	/* The psb must be empty since the tests won't skip status events.
2327	 * On the other hand, we do need to provide an address since tests
2328	 * may want to update last-ip, which requires a last-ip, of course.
2329	 */
2330	pt_encode_pad(encoder);
2331	pt_encode_mtc(encoder, 1);
2332	pt_encode_psb(encoder);
2333	pt_encode_tsc(encoder, 0);
2334	pt_encode_pad(encoder);
2335	pt_encode_fup(encoder, pt_dfix_sext_ip, pt_ipc_sext_48);
2336	pt_encode_psbend(encoder);
2337	pt_encode_pad(encoder);
2338	pt_encode_tsc(encoder, 0);
2339	pt_encode_pad(encoder);
2340
2341	/* Synchronize the decoder at the beginning of the buffer. */
2342	decoder->pos = decoder->config.begin;
2343
2344	return ptu_passed();
2345}
2346
2347/* Synchronize the decoder at the beginnig of a buffer containing packets that
2348 * should be skipped for event queries.
2349 */
2350static struct ptunit_result
2351ptu_dfix_header_event(struct ptu_decoder_fixture *dfix)
2352{
2353	struct pt_query_decoder *decoder = &dfix->decoder;
2354	struct pt_encoder *encoder = &dfix->encoder;
2355
2356	pt_encode_pad(encoder);
2357	pt_encode_mtc(encoder, 1);
2358	pt_encode_pad(encoder);
2359	pt_encode_tsc(encoder, 0x1000);
2360
2361	/* Synchronize the decoder at the beginning of the buffer. */
2362	decoder->pos = decoder->config.begin;
2363
2364	return ptu_passed();
2365}
2366
2367/* Synchronize the decoder at the beginnig of a buffer containing packets that
2368 * should be skipped for event queries including a PSB.
2369 */
2370static struct ptunit_result
2371ptu_dfix_header_event_psb(struct ptu_decoder_fixture *dfix)
2372{
2373	struct pt_query_decoder *decoder = &dfix->decoder;
2374	struct pt_encoder *encoder = &dfix->encoder;
2375
2376	/* The psb must be empty since the tests won't skip status events.
2377	 * On the other hand, we do need to provide an address since tests
2378	 * may want to update last-ip, which requires a last-ip, of course.
2379	 */
2380	pt_encode_pad(encoder);
2381	pt_encode_tsc(encoder, 0);
2382	pt_encode_psb(encoder);
2383	pt_encode_mtc(encoder, 1);
2384	pt_encode_pad(encoder);
2385	pt_encode_tsc(encoder, 0x1000);
2386	pt_encode_fup(encoder, pt_dfix_sext_ip, pt_ipc_sext_48);
2387	pt_encode_psbend(encoder);
2388	pt_encode_mtc(encoder, 1);
2389	pt_encode_pad(encoder);
2390
2391	/* Synchronize the decoder at the beginning of the buffer. */
2392	decoder->pos = decoder->config.begin;
2393
2394	return ptu_passed();
2395}
2396
2397static struct ptu_decoder_fixture dfix_raw;
2398static struct ptu_decoder_fixture dfix_empty;
2399static struct ptu_decoder_fixture dfix_indir;
2400static struct ptu_decoder_fixture dfix_indir_psb;
2401static struct ptu_decoder_fixture dfix_cond;
2402static struct ptu_decoder_fixture dfix_event;
2403static struct ptu_decoder_fixture dfix_event_psb;
2404
2405static void init_fixtures(void)
2406{
2407	dfix_raw.init = ptu_dfix_init;
2408	dfix_raw.fini = ptu_dfix_fini;
2409
2410	dfix_empty = dfix_raw;
2411	dfix_empty.header = ptu_dfix_header_sync;
2412
2413	dfix_indir = dfix_raw;
2414	dfix_indir.header = ptu_dfix_header_indir;
2415
2416	dfix_indir_psb = dfix_raw;
2417	dfix_indir_psb.header = ptu_dfix_header_indir_psb;
2418
2419	dfix_cond = dfix_raw;
2420	dfix_cond.header = ptu_dfix_header_cond;
2421
2422	dfix_event = dfix_raw;
2423	dfix_event.header = ptu_dfix_header_event;
2424
2425	dfix_event_psb = dfix_raw;
2426	dfix_event_psb.header = ptu_dfix_header_event_psb;
2427}
2428
2429int main(int argc, char **argv)
2430{
2431	struct ptunit_suite suite;
2432
2433	init_fixtures();
2434
2435	suite = ptunit_mk_suite(argc, argv);
2436
2437	ptu_run_f(suite, indir_not_synced, dfix_raw);
2438	ptu_run_f(suite, cond_not_synced, dfix_raw);
2439	ptu_run_f(suite, event_not_synced, dfix_raw);
2440
2441	ptu_run_f(suite, sync_backward, dfix_raw);
2442	ptu_run_f(suite, sync_backward_empty_end, dfix_raw);
2443	ptu_run_f(suite, sync_backward_empty_mid, dfix_raw);
2444	ptu_run_f(suite, sync_backward_empty_begin, dfix_raw);
2445	ptu_run_f(suite, decode_sync_backward, dfix_raw);
2446
2447	ptu_run_f(suite, indir_null, dfix_empty);
2448	ptu_run_f(suite, indir_empty, dfix_empty);
2449	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_suppressed);
2450	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_update_16);
2451	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_update_32);
2452	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_update_48);
2453	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_sext_48);
2454	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_full);
2455	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_suppressed);
2456	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_update_16);
2457	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_update_32);
2458	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_update_48);
2459	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_sext_48);
2460	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_full);
2461	ptu_run_f(suite, indir_cutoff_fail, dfix_empty);
2462	ptu_run_f(suite, indir_skip_tnt_fail, dfix_empty);
2463	ptu_run_f(suite, indir_skip_tip_pge_fail, dfix_empty);
2464	ptu_run_f(suite, indir_skip_tip_pgd_fail, dfix_empty);
2465	ptu_run_f(suite, indir_skip_fup_tip_fail, dfix_empty);
2466	ptu_run_f(suite, indir_skip_fup_tip_pgd_fail, dfix_empty);
2467
2468	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_suppressed);
2469	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_update_16);
2470	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_update_32);
2471	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_update_48);
2472	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_sext_48);
2473	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_full);
2474	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_suppressed);
2475	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_update_16);
2476	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_update_32);
2477	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_update_48);
2478	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_sext_48);
2479	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_full);
2480	ptu_run_f(suite, indir_cutoff_fail, dfix_indir);
2481	ptu_run_f(suite, indir_skip_tnt_fail, dfix_indir);
2482	ptu_run_f(suite, indir_skip_tip_pge_fail, dfix_indir);
2483	ptu_run_f(suite, indir_skip_tip_pgd_fail, dfix_indir);
2484	ptu_run_f(suite, indir_skip_fup_tip_fail, dfix_indir);
2485	ptu_run_f(suite, indir_skip_fup_tip_pgd_fail, dfix_indir);
2486
2487	ptu_run_fp(suite, indir, dfix_indir_psb, pt_ipc_suppressed);
2488	ptu_run_fp(suite, indir, dfix_indir_psb, pt_ipc_sext_48);
2489	ptu_run_fp(suite, indir, dfix_indir_psb, pt_ipc_full);
2490	ptu_run_fp(suite, indir_tnt, dfix_indir_psb, pt_ipc_suppressed);
2491	ptu_run_fp(suite, indir_tnt, dfix_indir_psb, pt_ipc_sext_48);
2492	ptu_run_fp(suite, indir_tnt, dfix_indir_psb, pt_ipc_full);
2493	ptu_run_f(suite, indir_cutoff_fail, dfix_indir_psb);
2494	ptu_run_f(suite, indir_skip_tnt_fail, dfix_indir_psb);
2495	ptu_run_f(suite, indir_skip_tip_pge_fail, dfix_indir_psb);
2496	ptu_run_f(suite, indir_skip_tip_pgd_fail, dfix_indir_psb);
2497	ptu_run_f(suite, indir_skip_fup_tip_fail, dfix_indir_psb);
2498	ptu_run_f(suite, indir_skip_fup_tip_pgd_fail, dfix_indir_psb);
2499
2500	ptu_run_f(suite, cond_null, dfix_empty);
2501	ptu_run_f(suite, cond_empty, dfix_empty);
2502	ptu_run_f(suite, cond, dfix_empty);
2503	ptu_run_f(suite, cond_skip_tip_fail, dfix_empty);
2504	ptu_run_f(suite, cond_skip_tip_pge_fail, dfix_empty);
2505	ptu_run_f(suite, cond_skip_tip_pgd_fail, dfix_empty);
2506	ptu_run_f(suite, cond_skip_fup_tip_fail, dfix_empty);
2507	ptu_run_f(suite, cond_skip_fup_tip_pgd_fail, dfix_empty);
2508
2509	ptu_run_f(suite, cond, dfix_cond);
2510	ptu_run_f(suite, cond_skip_tip_fail, dfix_cond);
2511	ptu_run_f(suite, cond_skip_tip_pge_fail, dfix_cond);
2512	ptu_run_f(suite, cond_skip_tip_pgd_fail, dfix_cond);
2513	ptu_run_f(suite, cond_skip_fup_tip_fail, dfix_cond);
2514	ptu_run_f(suite, cond_skip_fup_tip_pgd_fail, dfix_cond);
2515
2516	ptu_run_f(suite, event_null, dfix_empty);
2517	ptu_run_f(suite, event_bad_size, dfix_empty);
2518	ptu_run_f(suite, event_small_size, dfix_empty);
2519	ptu_run_f(suite, event_big_size, dfix_empty);
2520	ptu_run_f(suite, event_empty, dfix_empty);
2521	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_suppressed, 0);
2522	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_update_16, 0);
2523	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_update_32, 0);
2524	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_update_48, 0);
2525	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_sext_48, 0);
2526	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_full, 0);
2527	ptu_run_f(suite, event_enabled_cutoff_fail, dfix_empty);
2528	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_suppressed, 0);
2529	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_update_16, 0);
2530	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_update_32, 0);
2531	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_update_48, 0);
2532	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_sext_48, 0);
2533	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_full, 0);
2534	ptu_run_f(suite, event_disabled_cutoff_fail, dfix_empty);
2535	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_suppressed,
2536		   0);
2537	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_update_16,
2538		   0);
2539	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_update_32,
2540		   0);
2541	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_update_48,
2542		   0);
2543	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_sext_48, 0);
2544	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_full, 0);
2545	ptu_run_f(suite, event_async_disabled_suppressed_fail, dfix_empty);
2546	ptu_run_f(suite, event_async_disabled_cutoff_fail_a, dfix_empty);
2547	ptu_run_f(suite, event_async_disabled_cutoff_fail_b, dfix_empty);
2548	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_suppressed, 0);
2549	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_update_16, 0);
2550	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_update_32, 0);
2551	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_update_48, 0);
2552	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_sext_48, 0);
2553	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_full, 0);
2554	ptu_run_f(suite, event_async_branch_suppressed_fail, dfix_empty);
2555	ptu_run_f(suite, event_async_branch_cutoff_fail_a, dfix_empty);
2556	ptu_run_f(suite, event_async_branch_cutoff_fail_b, dfix_empty);
2557	ptu_run_fp(suite, event_paging, dfix_empty, 0, 0);
2558	ptu_run_fp(suite, event_paging, dfix_empty, pt_pl_pip_nr, 0);
2559	ptu_run_f(suite, event_paging_cutoff_fail, dfix_empty);
2560	ptu_run_fp(suite, event_async_paging, dfix_empty, 0, 0);
2561	ptu_run_fp(suite, event_async_paging, dfix_empty, pt_pl_pip_nr, 0);
2562	ptu_run_fp(suite, event_async_paging_suppressed, dfix_empty, 0, 0);
2563	ptu_run_fp(suite, event_async_paging_suppressed, dfix_empty,
2564		   pt_pl_pip_nr, 0);
2565	ptu_run_f(suite, event_async_paging_cutoff_fail, dfix_empty);
2566	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_suppressed, 0);
2567	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_update_16, 0);
2568	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_update_32, 0);
2569	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_update_48, 0);
2570	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_sext_48, 0);
2571	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_full, 0);
2572	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty,
2573		   pt_ipc_suppressed, 0);
2574	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_update_16,
2575		   0);
2576	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_update_32,
2577		   0);
2578	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_update_48,
2579		   0);
2580	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_sext_48,
2581		   0);
2582	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_full,
2583		   0);
2584	ptu_run_f(suite, event_overflow_cutoff_fail, dfix_empty);
2585	ptu_run_fp(suite, event_stop, dfix_empty, 0);
2586	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_suppressed,
2587		   0);
2588	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_update_16, 0);
2589	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_update_32, 0);
2590	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_update_48, 0);
2591	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_sext_48, 0);
2592	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_full, 0);
2593	ptu_run_f(suite, event_exec_mode_tip_cutoff_fail, dfix_empty);
2594	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty,
2595		   pt_ipc_suppressed, 0);
2596	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty,
2597		   pt_ipc_update_16, 0);
2598	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty,
2599		   pt_ipc_update_32, 0);
2600	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty,
2601		   pt_ipc_update_48, 0);
2602	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty, pt_ipc_sext_48,
2603		   0);
2604	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty, pt_ipc_full,
2605		   0);
2606	ptu_run_f(suite, event_exec_mode_tip_pge_cutoff_fail, dfix_empty);
2607	ptu_run_f(suite, event_exec_mode_cutoff_fail, dfix_empty);
2608	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_suppressed,
2609		   pt_mob_tsx_intx, 0);
2610	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_update_16, 0, 0);
2611	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_update_32,
2612		   pt_mob_tsx_intx, 0);
2613	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_update_48,
2614		   pt_mob_tsx_intx, 0);
2615	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_sext_48, 0, 0);
2616	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_full, 0, 0);
2617	ptu_run_f(suite, event_tsx_fup_cutoff_fail, dfix_empty);
2618	ptu_run_f(suite, event_tsx_cutoff_fail, dfix_empty);
2619	ptu_run_f(suite, event_skip_tip_fail, dfix_empty);
2620	ptu_run_f(suite, event_skip_tnt_8_fail, dfix_empty);
2621	ptu_run_f(suite, event_skip_tnt_64_fail, dfix_empty);
2622	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_suppressed);
2623	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_update_16);
2624	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_update_32);
2625	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_update_48);
2626	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_sext_48);
2627	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_full);
2628	ptu_run_f(suite, sync_event_cutoff_fail, dfix_empty);
2629	ptu_run_f(suite, sync_event_incomplete_fail, dfix_empty);
2630	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_suppressed);
2631	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_update_16);
2632	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_update_32);
2633	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_update_48);
2634	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_sext_48);
2635	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_full);
2636	ptu_run_f(suite, sync_ovf_event_cutoff_fail, dfix_empty);
2637
2638	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_suppressed, 0x1000);
2639	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_update_16, 0x1000);
2640	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_update_32, 0x1000);
2641	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_update_48, 0x1000);
2642	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_sext_48, 0x1000);
2643	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_full, 0x1000);
2644	ptu_run_f(suite, event_enabled_cutoff_fail, dfix_event);
2645	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_suppressed,
2646		   0x1000);
2647	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_update_16, 0x1000);
2648	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_update_32, 0x1000);
2649	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_update_48, 0x1000);
2650	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_sext_48, 0x1000);
2651	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_full, 0x1000);
2652	ptu_run_f(suite, event_disabled_cutoff_fail, dfix_event);
2653	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_suppressed,
2654		   0x1000);
2655	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_update_16,
2656		   0x1000);
2657	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_update_32,
2658		   0x1000);
2659	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_update_48,
2660		   0x1000);
2661	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_sext_48,
2662		   0x1000);
2663	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_full,
2664		   0x1000);
2665	ptu_run_f(suite, event_async_disabled_suppressed_fail, dfix_event);
2666	ptu_run_f(suite, event_async_disabled_cutoff_fail_a, dfix_event);
2667	ptu_run_f(suite, event_async_disabled_cutoff_fail_b, dfix_event);
2668	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_suppressed,
2669		   0x1000);
2670	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_update_16,
2671		   0x1000);
2672	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_update_32,
2673		   0x1000);
2674	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_update_48,
2675		   0x1000);
2676	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_sext_48,
2677		   0x1000);
2678	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_full,
2679		   0x1000);
2680	ptu_run_f(suite, event_async_branch_suppressed_fail, dfix_event);
2681	ptu_run_f(suite, event_async_branch_cutoff_fail_a, dfix_event);
2682	ptu_run_f(suite, event_async_branch_cutoff_fail_b, dfix_event);
2683	ptu_run_fp(suite, event_paging, dfix_event, 0, 0x1000);
2684	ptu_run_fp(suite, event_paging, dfix_event, pt_pl_pip_nr, 0x1000);
2685	ptu_run_f(suite, event_paging_cutoff_fail, dfix_event);
2686	ptu_run_fp(suite, event_async_paging, dfix_event, 0, 0x1000);
2687	ptu_run_fp(suite, event_async_paging, dfix_event, pt_pl_pip_nr, 0x1000);
2688	ptu_run_fp(suite, event_async_paging_suppressed, dfix_event, 0, 0x1000);
2689	ptu_run_fp(suite, event_async_paging_suppressed, dfix_event,
2690		   pt_pl_pip_nr, 0x1000);
2691	ptu_run_f(suite, event_async_paging_cutoff_fail, dfix_event);
2692	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_suppressed,
2693		   0x1000);
2694	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_update_16,
2695		   0x1000);
2696	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_update_32,
2697		   0x1000);
2698	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_update_48,
2699		   0x1000);
2700	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_sext_48,
2701		   0x1000);
2702	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_full,
2703		   0x1000);
2704	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event,
2705		   pt_ipc_suppressed, 0x1000);
2706	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_update_16,
2707		   0x1000);
2708	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_update_32,
2709		   0x1000);
2710	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_update_48,
2711		   0x1000);
2712	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_sext_48,
2713		   0x1000);
2714	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_full,
2715		   0x1000);
2716	ptu_run_f(suite, event_overflow_cutoff_fail, dfix_event);
2717	ptu_run_fp(suite, event_stop, dfix_event, 0x1000);
2718	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_suppressed,
2719		   0x1000);
2720	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_update_16,
2721		   0x1000);
2722	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_update_32,
2723		   0x1000);
2724	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_update_48,
2725		   0x1000);
2726	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_sext_48,
2727		   0x1000);
2728	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_full,
2729		   0x1000);
2730	ptu_run_f(suite, event_exec_mode_tip_cutoff_fail, dfix_event);
2731	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event,
2732		   pt_ipc_suppressed, 0x1000);
2733	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event,
2734		   pt_ipc_update_16, 0x1000);
2735	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event,
2736		   pt_ipc_update_32, 0x1000);
2737	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event,
2738		   pt_ipc_update_48, 0x1000);
2739	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event, pt_ipc_sext_48,
2740		   0x1000);
2741	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event, pt_ipc_full,
2742		   0x1000);
2743	ptu_run_f(suite, event_exec_mode_tip_pge_cutoff_fail, dfix_event);
2744	ptu_run_f(suite, event_exec_mode_cutoff_fail, dfix_event);
2745	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_suppressed, 0,
2746		   0x1000);
2747	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_update_16,
2748		   pt_mob_tsx_intx, 0x1000);
2749	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_update_32, 0,
2750		   0x1000);
2751	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_update_48, 0,
2752		   0x1000);
2753	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_sext_48,
2754		   pt_mob_tsx_intx, 0x1000);
2755	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_full,
2756		   pt_mob_tsx_intx, 0x1000);
2757	ptu_run_f(suite, event_tsx_fup_cutoff_fail, dfix_event);
2758	ptu_run_f(suite, event_tsx_cutoff_fail, dfix_event);
2759	ptu_run_f(suite, event_skip_tip_fail, dfix_event);
2760	ptu_run_f(suite, event_skip_tnt_8_fail, dfix_event);
2761	ptu_run_f(suite, event_skip_tnt_64_fail, dfix_event);
2762	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_suppressed);
2763	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_update_16);
2764	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_update_32);
2765	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_update_48);
2766	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_sext_48);
2767	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_full);
2768	ptu_run_f(suite, sync_event_cutoff_fail, dfix_event);
2769	ptu_run_f(suite, sync_event_incomplete_fail, dfix_event);
2770	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_suppressed);
2771	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_update_16);
2772	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_update_32);
2773	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_update_48);
2774	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_sext_48);
2775	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_full);
2776	ptu_run_f(suite, sync_ovf_event_cutoff_fail, dfix_event);
2777
2778	ptu_run_fp(suite, event_enabled, dfix_event_psb, pt_ipc_suppressed,
2779		   0x1000);
2780	ptu_run_fp(suite, event_enabled, dfix_event_psb, pt_ipc_sext_48,
2781		   0x1000);
2782	ptu_run_fp(suite, event_enabled, dfix_event_psb, pt_ipc_full,
2783		   0x1000);
2784	ptu_run_f(suite, event_enabled_cutoff_fail, dfix_event_psb);
2785	ptu_run_fp(suite, event_disabled, dfix_event_psb, pt_ipc_suppressed,
2786		   0x1000);
2787	ptu_run_fp(suite, event_disabled, dfix_event_psb, pt_ipc_sext_48,
2788		   0x1000);
2789	ptu_run_fp(suite, event_disabled, dfix_event_psb, pt_ipc_full,
2790		   0x1000);
2791	ptu_run_f(suite, event_disabled_cutoff_fail, dfix_event_psb);
2792	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
2793		   pt_ipc_suppressed, 0x1000);
2794	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
2795		   pt_ipc_update_16, 0x1000);
2796	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
2797		   pt_ipc_update_32, 0x1000);
2798	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
2799		   pt_ipc_update_48, 0x1000);
2800	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
2801		   pt_ipc_sext_48, 0x1000);
2802	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
2803		   pt_ipc_full, 0x1000);
2804	ptu_run_f(suite, event_async_disabled_suppressed_fail, dfix_event_psb);
2805	ptu_run_f(suite, event_async_disabled_cutoff_fail_a, dfix_event_psb);
2806	ptu_run_f(suite, event_async_disabled_cutoff_fail_b, dfix_event_psb);
2807	ptu_run_fp(suite, event_async_branch, dfix_event_psb,
2808		   pt_ipc_suppressed, 0x1000);
2809	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_update_16,
2810		   0x1000);
2811	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_update_32,
2812		   0x1000);
2813	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_update_48,
2814		   0x1000);
2815	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_sext_48,
2816		   0x1000);
2817	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_full,
2818		   0x1000);
2819	ptu_run_f(suite, event_async_branch_suppressed_fail, dfix_event_psb);
2820	ptu_run_f(suite, event_async_branch_cutoff_fail_a, dfix_event_psb);
2821	ptu_run_f(suite, event_async_branch_cutoff_fail_b, dfix_event_psb);
2822	ptu_run_fp(suite, event_paging, dfix_event_psb, 0, 0x1000);
2823	ptu_run_fp(suite, event_paging, dfix_event_psb, pt_pl_pip_nr, 0x1000);
2824	ptu_run_f(suite, event_paging_cutoff_fail, dfix_event_psb);
2825	ptu_run_fp(suite, event_async_paging, dfix_event_psb, 0, 0x1000);
2826	ptu_run_fp(suite, event_async_paging, dfix_event_psb, pt_pl_pip_nr,
2827		   0x1000);
2828	ptu_run_fp(suite, event_async_paging_suppressed, dfix_event_psb, 0,
2829		   0x1000);
2830	ptu_run_fp(suite, event_async_paging_suppressed, dfix_event_psb,
2831		  pt_pl_pip_nr, 0x1000);
2832	ptu_run_f(suite, event_async_paging_cutoff_fail, dfix_event_psb);
2833	ptu_run_f(suite, event_overflow_cutoff_fail, dfix_event_psb);
2834	ptu_run_fp(suite, event_stop, dfix_event_psb, 0x1000);
2835	ptu_run_fp(suite, event_exec_mode_tip, dfix_event_psb,
2836		   pt_ipc_suppressed, 0x1000);
2837	ptu_run_fp(suite, event_exec_mode_tip, dfix_event_psb, pt_ipc_sext_48,
2838		   0x1000);
2839	ptu_run_fp(suite, event_exec_mode_tip, dfix_event_psb, pt_ipc_full,
2840		   0x1000);
2841	ptu_run_f(suite, event_exec_mode_tip_cutoff_fail, dfix_event_psb);
2842	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event_psb,
2843		   pt_ipc_sext_48, 0x1000);
2844	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event_psb,
2845		   pt_ipc_full, 0x1000);
2846	ptu_run_f(suite, event_exec_mode_tip_pge_cutoff_fail, dfix_event_psb);
2847	ptu_run_f(suite, event_exec_mode_cutoff_fail, dfix_event_psb);
2848	ptu_run_fp(suite, event_tsx_fup, dfix_event_psb, pt_ipc_suppressed, 0,
2849		   0x1000);
2850	ptu_run_fp(suite, event_tsx_fup, dfix_event_psb, pt_ipc_sext_48,
2851		   pt_mob_tsx_intx, 0x1000);
2852	ptu_run_fp(suite, event_tsx_fup, dfix_event_psb, pt_ipc_full,
2853		   pt_mob_tsx_intx, 0x1000);
2854	ptu_run_f(suite, event_tsx_fup_cutoff_fail, dfix_event_psb);
2855	ptu_run_f(suite, event_tsx_cutoff_fail, dfix_event_psb);
2856	ptu_run_f(suite, event_skip_tip_fail, dfix_event_psb);
2857	ptu_run_f(suite, event_skip_tnt_8_fail, dfix_event_psb);
2858	ptu_run_f(suite, event_skip_tnt_64_fail, dfix_event_psb);
2859
2860	ptu_run_f(suite, time_null_fail, dfix_empty);
2861	ptu_run_f(suite, time_initial, dfix_empty);
2862	ptu_run_f(suite, time, dfix_empty);
2863
2864	ptu_run_f(suite, cbr_null, dfix_empty);
2865	ptu_run_f(suite, cbr_initial, dfix_empty);
2866	ptu_run_f(suite, cbr, dfix_empty);
2867
2868	ptu_run_f(suite, indir_cyc_cutoff, dfix_empty);
2869	ptu_run_f(suite, cond_cyc_cutoff, dfix_empty);
2870	ptu_run_f(suite, event_cyc_cutoff, dfix_empty);
2871
2872	return ptunit_report(&suite);
2873}
2874