xref: /freebsd/contrib/processor-trace/libipt/test/src/ptunit-query.c (revision 85f87cf491bec6f90948a85b10f5523ea24db9e3)
174fe6c29SRuslan Bukin /*
2*85f87cf4SRuslan Bukin  * Copyright (c) 2013-2019, Intel Corporation
374fe6c29SRuslan Bukin  *
474fe6c29SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
574fe6c29SRuslan Bukin  * modification, are permitted provided that the following conditions are met:
674fe6c29SRuslan Bukin  *
774fe6c29SRuslan Bukin  *  * Redistributions of source code must retain the above copyright notice,
874fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer.
974fe6c29SRuslan Bukin  *  * Redistributions in binary form must reproduce the above copyright notice,
1074fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer in the documentation
1174fe6c29SRuslan Bukin  *    and/or other materials provided with the distribution.
1274fe6c29SRuslan Bukin  *  * Neither the name of Intel Corporation nor the names of its contributors
1374fe6c29SRuslan Bukin  *    may be used to endorse or promote products derived from this software
1474fe6c29SRuslan Bukin  *    without specific prior written permission.
1574fe6c29SRuslan Bukin  *
1674fe6c29SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1774fe6c29SRuslan Bukin  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1874fe6c29SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1974fe6c29SRuslan Bukin  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2074fe6c29SRuslan Bukin  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2174fe6c29SRuslan Bukin  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2274fe6c29SRuslan Bukin  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2374fe6c29SRuslan Bukin  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2474fe6c29SRuslan Bukin  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2574fe6c29SRuslan Bukin  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2674fe6c29SRuslan Bukin  * POSSIBILITY OF SUCH DAMAGE.
2774fe6c29SRuslan Bukin  */
2874fe6c29SRuslan Bukin 
2974fe6c29SRuslan Bukin #include "ptunit.h"
3074fe6c29SRuslan Bukin 
3174fe6c29SRuslan Bukin #include "pt_last_ip.h"
3274fe6c29SRuslan Bukin #include "pt_decoder_function.h"
3374fe6c29SRuslan Bukin #include "pt_query_decoder.h"
3474fe6c29SRuslan Bukin #include "pt_encoder.h"
3574fe6c29SRuslan Bukin #include "pt_opcodes.h"
3674fe6c29SRuslan Bukin 
3774fe6c29SRuslan Bukin 
3874fe6c29SRuslan Bukin /* A query testing fixture. */
3974fe6c29SRuslan Bukin 
4074fe6c29SRuslan Bukin struct ptu_decoder_fixture {
4174fe6c29SRuslan Bukin 	/* The test fixture initialization and finalization functions. */
4274fe6c29SRuslan Bukin 	struct ptunit_result (*init)(struct ptu_decoder_fixture *);
4374fe6c29SRuslan Bukin 	struct ptunit_result (*fini)(struct ptu_decoder_fixture *);
4474fe6c29SRuslan Bukin 
4574fe6c29SRuslan Bukin 	/* Encode an optional header for the test to read over. */
4674fe6c29SRuslan Bukin 	struct ptunit_result (*header)(struct ptu_decoder_fixture *);
4774fe6c29SRuslan Bukin 
4874fe6c29SRuslan Bukin 	/* The trace buffer. */
4974fe6c29SRuslan Bukin 	uint8_t buffer[1024];
5074fe6c29SRuslan Bukin 
5174fe6c29SRuslan Bukin 	/* The configuration under test. */
5274fe6c29SRuslan Bukin 	struct pt_config config;
5374fe6c29SRuslan Bukin 
5474fe6c29SRuslan Bukin 	/* A encoder and query decoder for the above configuration. */
5574fe6c29SRuslan Bukin 	struct pt_encoder encoder;
5674fe6c29SRuslan Bukin 	struct pt_query_decoder decoder;
5774fe6c29SRuslan Bukin 
5874fe6c29SRuslan Bukin 	/* For tracking last-ip in tests. */
5974fe6c29SRuslan Bukin 	struct pt_last_ip last_ip;
6074fe6c29SRuslan Bukin };
6174fe6c29SRuslan Bukin 
6274fe6c29SRuslan Bukin /* An invalid address. */
63*85f87cf4SRuslan Bukin static const uint64_t pt_dfix_bad_ip = (1ull << 62) - 1ull;
6474fe6c29SRuslan Bukin 
6574fe6c29SRuslan Bukin /* A sign-extended address. */
6674fe6c29SRuslan Bukin static const uint64_t pt_dfix_sext_ip = 0xffffff00ff00ff00ull;
6774fe6c29SRuslan Bukin 
6874fe6c29SRuslan Bukin /* The highest possible address. */
69*85f87cf4SRuslan Bukin static const uint64_t pt_dfix_max_ip = (1ull << 47) - 1ull;
7074fe6c29SRuslan Bukin 
7174fe6c29SRuslan Bukin /* The highest possible cr3 value. */
72*85f87cf4SRuslan Bukin static const uint64_t pt_dfix_max_cr3 = ((1ull << 47) - 1ull) & ~0x1full;
7374fe6c29SRuslan Bukin 
7474fe6c29SRuslan Bukin /* Synchronize the decoder at the beginning of the trace stream, avoiding the
7574fe6c29SRuslan Bukin  * initial PSB header.
7674fe6c29SRuslan Bukin  */
ptu_sync_decoder(struct pt_query_decoder * decoder)7774fe6c29SRuslan Bukin static struct ptunit_result ptu_sync_decoder(struct pt_query_decoder *decoder)
7874fe6c29SRuslan Bukin {
7974fe6c29SRuslan Bukin 	ptu_ptr(decoder);
8074fe6c29SRuslan Bukin 	decoder->enabled = 1;
8174fe6c29SRuslan Bukin 
8274fe6c29SRuslan Bukin 	(void) pt_df_fetch(&decoder->next, decoder->pos, &decoder->config);
8374fe6c29SRuslan Bukin 	return ptu_passed();
8474fe6c29SRuslan Bukin }
8574fe6c29SRuslan Bukin 
8674fe6c29SRuslan Bukin /* Cut off the last encoded packet. */
cutoff(struct pt_query_decoder * decoder,const struct pt_encoder * encoder)8774fe6c29SRuslan Bukin static struct ptunit_result cutoff(struct pt_query_decoder *decoder,
8874fe6c29SRuslan Bukin 				   const struct pt_encoder *encoder)
8974fe6c29SRuslan Bukin {
9074fe6c29SRuslan Bukin 	uint8_t *pos;
9174fe6c29SRuslan Bukin 
9274fe6c29SRuslan Bukin 	ptu_ptr(decoder);
9374fe6c29SRuslan Bukin 	ptu_ptr(encoder);
9474fe6c29SRuslan Bukin 
9574fe6c29SRuslan Bukin 	pos = encoder->pos;
9674fe6c29SRuslan Bukin 	ptu_ptr(pos);
9774fe6c29SRuslan Bukin 
9874fe6c29SRuslan Bukin 	pos -= 1;
9974fe6c29SRuslan Bukin 	ptu_ptr_le(decoder->config.begin, pos);
10074fe6c29SRuslan Bukin 
10174fe6c29SRuslan Bukin 	decoder->config.end = pos;
10274fe6c29SRuslan Bukin 	return ptu_passed();
10374fe6c29SRuslan Bukin }
10474fe6c29SRuslan Bukin 
indir_not_synced(struct ptu_decoder_fixture * dfix)10574fe6c29SRuslan Bukin static struct ptunit_result indir_not_synced(struct ptu_decoder_fixture *dfix)
10674fe6c29SRuslan Bukin {
10774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
10874fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
10974fe6c29SRuslan Bukin 	int errcode;
11074fe6c29SRuslan Bukin 
11174fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
11274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_nosync);
11374fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
11474fe6c29SRuslan Bukin 
11574fe6c29SRuslan Bukin 	return ptu_passed();
11674fe6c29SRuslan Bukin }
11774fe6c29SRuslan Bukin 
cond_not_synced(struct ptu_decoder_fixture * dfix)11874fe6c29SRuslan Bukin static struct ptunit_result cond_not_synced(struct ptu_decoder_fixture *dfix)
11974fe6c29SRuslan Bukin {
12074fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
12174fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
12274fe6c29SRuslan Bukin 
12374fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
12474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_nosync);
12574fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
12674fe6c29SRuslan Bukin 
12774fe6c29SRuslan Bukin 	return ptu_passed();
12874fe6c29SRuslan Bukin }
12974fe6c29SRuslan Bukin 
event_not_synced(struct ptu_decoder_fixture * dfix)13074fe6c29SRuslan Bukin static struct ptunit_result event_not_synced(struct ptu_decoder_fixture *dfix)
13174fe6c29SRuslan Bukin {
13274fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
13374fe6c29SRuslan Bukin 	struct pt_event event;
13474fe6c29SRuslan Bukin 	int errcode;
13574fe6c29SRuslan Bukin 
13674fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
13774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_nosync);
13874fe6c29SRuslan Bukin 
13974fe6c29SRuslan Bukin 	return ptu_passed();
14074fe6c29SRuslan Bukin }
14174fe6c29SRuslan Bukin 
sync_backward(struct ptu_decoder_fixture * dfix)14274fe6c29SRuslan Bukin static struct ptunit_result sync_backward(struct ptu_decoder_fixture *dfix)
14374fe6c29SRuslan Bukin {
14474fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
14574fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
14674fe6c29SRuslan Bukin 	uint64_t sync[3], offset, ip;
14774fe6c29SRuslan Bukin 	int errcode;
14874fe6c29SRuslan Bukin 
14974fe6c29SRuslan Bukin 	/* Check that we can use repeated pt_qry_sync_backward() to iterate over
15074fe6c29SRuslan Bukin 	 * synchronization points in backwards order.
15174fe6c29SRuslan Bukin 	 */
15274fe6c29SRuslan Bukin 
15374fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[0]);
15474fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
15574fe6c29SRuslan Bukin 
15674fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
15774fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
15874fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
15974fe6c29SRuslan Bukin 
16074fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[1]);
16174fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
16274fe6c29SRuslan Bukin 
16374fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
16474fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
16574fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
16674fe6c29SRuslan Bukin 
16774fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[2]);
16874fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
16974fe6c29SRuslan Bukin 
17074fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
17174fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
17274fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
17374fe6c29SRuslan Bukin 
17474fe6c29SRuslan Bukin 	/* Synchronize repeatedly and check that we reach each PSB in the
17574fe6c29SRuslan Bukin 	 * correct order.
17674fe6c29SRuslan Bukin 	 */
17774fe6c29SRuslan Bukin 
17874fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
17974fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
18074fe6c29SRuslan Bukin 
18174fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
18274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
18374fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[2]);
18474fe6c29SRuslan Bukin 
18574fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
18674fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
18774fe6c29SRuslan Bukin 
18874fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
18974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
19074fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[1]);
19174fe6c29SRuslan Bukin 
19274fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
19374fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
19474fe6c29SRuslan Bukin 
19574fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
19674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
19774fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[0]);
19874fe6c29SRuslan Bukin 
19974fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
20074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
20174fe6c29SRuslan Bukin 
20274fe6c29SRuslan Bukin 	return ptu_passed();
20374fe6c29SRuslan Bukin }
20474fe6c29SRuslan Bukin 
20574fe6c29SRuslan Bukin static struct ptunit_result
sync_backward_empty_end(struct ptu_decoder_fixture * dfix)20674fe6c29SRuslan Bukin sync_backward_empty_end(struct ptu_decoder_fixture *dfix)
20774fe6c29SRuslan Bukin {
20874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
20974fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
21074fe6c29SRuslan Bukin 	uint64_t sync[3], offset, ip;
21174fe6c29SRuslan Bukin 	int errcode;
21274fe6c29SRuslan Bukin 
21374fe6c29SRuslan Bukin 	/* Check that we can use repeated pt_qry_sync_backward() to iterate over
21474fe6c29SRuslan Bukin 	 * synchronization points in backwards order.
21574fe6c29SRuslan Bukin 	 *
21674fe6c29SRuslan Bukin 	 * There's an empty PSB+ at the end.  We skip it.
21774fe6c29SRuslan Bukin 	 */
21874fe6c29SRuslan Bukin 
21974fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[0]);
22074fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
22174fe6c29SRuslan Bukin 
22274fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
22374fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
22474fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
22574fe6c29SRuslan Bukin 
22674fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[1]);
22774fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
22874fe6c29SRuslan Bukin 
22974fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
23074fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
23174fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
23274fe6c29SRuslan Bukin 
23374fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[2]);
23474fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
23574fe6c29SRuslan Bukin 
23674fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
23774fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
23874fe6c29SRuslan Bukin 
23974fe6c29SRuslan Bukin 	/* Synchronize repeatedly and check that we reach each PSB in the
24074fe6c29SRuslan Bukin 	 * correct order.
24174fe6c29SRuslan Bukin 	 */
24274fe6c29SRuslan Bukin 
24374fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
24474fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
24574fe6c29SRuslan Bukin 
24674fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
24774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
24874fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[1]);
24974fe6c29SRuslan Bukin 
25074fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
25174fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
25274fe6c29SRuslan Bukin 
25374fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
25474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
25574fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[0]);
25674fe6c29SRuslan Bukin 
25774fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
25874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
25974fe6c29SRuslan Bukin 
26074fe6c29SRuslan Bukin 	return ptu_passed();
26174fe6c29SRuslan Bukin }
26274fe6c29SRuslan Bukin 
26374fe6c29SRuslan Bukin static struct ptunit_result
sync_backward_empty_mid(struct ptu_decoder_fixture * dfix)26474fe6c29SRuslan Bukin sync_backward_empty_mid(struct ptu_decoder_fixture *dfix)
26574fe6c29SRuslan Bukin {
26674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
26774fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
26874fe6c29SRuslan Bukin 	uint64_t sync[3], offset, ip;
26974fe6c29SRuslan Bukin 	int errcode;
27074fe6c29SRuslan Bukin 
27174fe6c29SRuslan Bukin 	/* Check that we can use repeated pt_qry_sync_backward() to iterate over
27274fe6c29SRuslan Bukin 	 * synchronization points in backwards order.
27374fe6c29SRuslan Bukin 	 *
27474fe6c29SRuslan Bukin 	 * There's an empty PSB+ in the middle.  We skip it.
27574fe6c29SRuslan Bukin 	 */
27674fe6c29SRuslan Bukin 
27774fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[0]);
27874fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
27974fe6c29SRuslan Bukin 
28074fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
28174fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
28274fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
28374fe6c29SRuslan Bukin 
28474fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[1]);
28574fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
28674fe6c29SRuslan Bukin 
28774fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
28874fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
28974fe6c29SRuslan Bukin 
29074fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[2]);
29174fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
29274fe6c29SRuslan Bukin 
29374fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
29474fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
29574fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
29674fe6c29SRuslan Bukin 
29774fe6c29SRuslan Bukin 	/* Synchronize repeatedly and check that we reach each PSB in the
29874fe6c29SRuslan Bukin 	 * correct order.
29974fe6c29SRuslan Bukin 	 */
30074fe6c29SRuslan Bukin 
30174fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
30274fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
30374fe6c29SRuslan Bukin 
30474fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
30574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
30674fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[2]);
30774fe6c29SRuslan Bukin 
30874fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
30974fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
31074fe6c29SRuslan Bukin 
31174fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
31274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
31374fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[0]);
31474fe6c29SRuslan Bukin 
31574fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
31674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
31774fe6c29SRuslan Bukin 
31874fe6c29SRuslan Bukin 	return ptu_passed();
31974fe6c29SRuslan Bukin }
32074fe6c29SRuslan Bukin 
32174fe6c29SRuslan Bukin static struct ptunit_result
sync_backward_empty_begin(struct ptu_decoder_fixture * dfix)32274fe6c29SRuslan Bukin sync_backward_empty_begin(struct ptu_decoder_fixture *dfix)
32374fe6c29SRuslan Bukin {
32474fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
32574fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
32674fe6c29SRuslan Bukin 	uint64_t sync[3], offset, ip;
32774fe6c29SRuslan Bukin 	int errcode;
32874fe6c29SRuslan Bukin 
32974fe6c29SRuslan Bukin 	/* Check that we can use repeated pt_qry_sync_backward() to iterate over
33074fe6c29SRuslan Bukin 	 * synchronization points in backwards order.
33174fe6c29SRuslan Bukin 	 *
33274fe6c29SRuslan Bukin 	 * There's an empty PSB+ at the beginning.  We skip it.
33374fe6c29SRuslan Bukin 	 */
33474fe6c29SRuslan Bukin 
33574fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[0]);
33674fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
33774fe6c29SRuslan Bukin 
33874fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
33974fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
34074fe6c29SRuslan Bukin 
34174fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[1]);
34274fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
34374fe6c29SRuslan Bukin 
34474fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
34574fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
34674fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
34774fe6c29SRuslan Bukin 
34874fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[2]);
34974fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
35074fe6c29SRuslan Bukin 
35174fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
35274fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
35374fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
35474fe6c29SRuslan Bukin 
35574fe6c29SRuslan Bukin 	/* Synchronize repeatedly and check that we reach each PSB in the
35674fe6c29SRuslan Bukin 	 * correct order.
35774fe6c29SRuslan Bukin 	 */
35874fe6c29SRuslan Bukin 
35974fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
36074fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
36174fe6c29SRuslan Bukin 
36274fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
36374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
36474fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[2]);
36574fe6c29SRuslan Bukin 
36674fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
36774fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
36874fe6c29SRuslan Bukin 
36974fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
37074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
37174fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[1]);
37274fe6c29SRuslan Bukin 
37374fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
37474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
37574fe6c29SRuslan Bukin 
37674fe6c29SRuslan Bukin 	return ptu_passed();
37774fe6c29SRuslan Bukin }
37874fe6c29SRuslan Bukin 
37974fe6c29SRuslan Bukin static struct ptunit_result
decode_sync_backward(struct ptu_decoder_fixture * dfix)38074fe6c29SRuslan Bukin decode_sync_backward(struct ptu_decoder_fixture *dfix)
38174fe6c29SRuslan Bukin {
38274fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
38374fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
38474fe6c29SRuslan Bukin 	struct pt_event event;
38574fe6c29SRuslan Bukin 	uint64_t sync[2], offset, ip;
38674fe6c29SRuslan Bukin 	int errcode;
38774fe6c29SRuslan Bukin 
38874fe6c29SRuslan Bukin 	/* Check that we can use sync_backward to re-sync at the current trace
38974fe6c29SRuslan Bukin 	 * segment as well as to find the previous trace segment.
39074fe6c29SRuslan Bukin 	 */
39174fe6c29SRuslan Bukin 
39274fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[0]);
39374fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
39474fe6c29SRuslan Bukin 
39574fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
39674fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
39774fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
39874fe6c29SRuslan Bukin 
39974fe6c29SRuslan Bukin 	errcode = pt_enc_get_offset(encoder, &sync[1]);
40074fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
40174fe6c29SRuslan Bukin 
40274fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
40374fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
40474fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
40574fe6c29SRuslan Bukin 
40674fe6c29SRuslan Bukin 
40774fe6c29SRuslan Bukin 	errcode = pt_qry_sync_forward(decoder, &ip);
40874fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
40974fe6c29SRuslan Bukin 
41074fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
41174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
41274fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[0]);
41374fe6c29SRuslan Bukin 
41474fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
41574fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
41674fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_exec_mode);
41774fe6c29SRuslan Bukin 
41874fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
41974fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
42074fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_exec_mode);
42174fe6c29SRuslan Bukin 
42274fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
42374fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
42474fe6c29SRuslan Bukin 
42574fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
42674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
42774fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[1]);
42874fe6c29SRuslan Bukin 
42974fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
43074fe6c29SRuslan Bukin 	ptu_int_ge(errcode, 0);
43174fe6c29SRuslan Bukin 
43274fe6c29SRuslan Bukin 	errcode = pt_qry_get_sync_offset(decoder, &offset);
43374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
43474fe6c29SRuslan Bukin 	ptu_uint_eq(offset, sync[0]);
43574fe6c29SRuslan Bukin 
43674fe6c29SRuslan Bukin 	errcode = pt_qry_sync_backward(decoder, &ip);
43774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
43874fe6c29SRuslan Bukin 
43974fe6c29SRuslan Bukin 	return ptu_passed();
44074fe6c29SRuslan Bukin }
44174fe6c29SRuslan Bukin 
indir_null(struct ptu_decoder_fixture * dfix)44274fe6c29SRuslan Bukin static struct ptunit_result indir_null(struct ptu_decoder_fixture *dfix)
44374fe6c29SRuslan Bukin {
44474fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
44574fe6c29SRuslan Bukin 	struct pt_config *config = &decoder->config;
44674fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
44774fe6c29SRuslan Bukin 	int errcode;
44874fe6c29SRuslan Bukin 
44974fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(NULL, &addr);
45074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
45174fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
45274fe6c29SRuslan Bukin 
45374fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, NULL);
45474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
45574fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, config->begin);
45674fe6c29SRuslan Bukin 
45774fe6c29SRuslan Bukin 	return ptu_passed();
45874fe6c29SRuslan Bukin }
45974fe6c29SRuslan Bukin 
indir_empty(struct ptu_decoder_fixture * dfix)46074fe6c29SRuslan Bukin static struct ptunit_result indir_empty(struct ptu_decoder_fixture *dfix)
46174fe6c29SRuslan Bukin {
46274fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
46374fe6c29SRuslan Bukin 	struct pt_config *config = &decoder->config;
46474fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
46574fe6c29SRuslan Bukin 	int errcode;
46674fe6c29SRuslan Bukin 
46774fe6c29SRuslan Bukin 	decoder->pos = config->end;
46874fe6c29SRuslan Bukin 
46974fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
47074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
47174fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
47274fe6c29SRuslan Bukin 
47374fe6c29SRuslan Bukin 	return ptu_passed();
47474fe6c29SRuslan Bukin }
47574fe6c29SRuslan Bukin 
indir(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc)47674fe6c29SRuslan Bukin static struct ptunit_result indir(struct ptu_decoder_fixture *dfix,
47774fe6c29SRuslan Bukin 				  enum pt_ip_compression ipc)
47874fe6c29SRuslan Bukin {
47974fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
48074fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
48174fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
48274fe6c29SRuslan Bukin 	uint64_t addr = pt_dfix_bad_ip;
48374fe6c29SRuslan Bukin 	int errcode;
48474fe6c29SRuslan Bukin 
48574fe6c29SRuslan Bukin 	packet.ipc = ipc;
48674fe6c29SRuslan Bukin 	packet.ip = pt_dfix_sext_ip;
48774fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
48874fe6c29SRuslan Bukin 
48974fe6c29SRuslan Bukin 	pt_encode_tip(encoder, packet.ip, packet.ipc);
49074fe6c29SRuslan Bukin 
49174fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
49274fe6c29SRuslan Bukin 
49374fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
49474fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed) {
49574fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_ip_suppressed | pts_eos);
49674fe6c29SRuslan Bukin 		ptu_uint_eq(addr, pt_dfix_bad_ip);
49774fe6c29SRuslan Bukin 	} else {
49874fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_eos);
49974fe6c29SRuslan Bukin 		ptu_uint_eq(addr, dfix->last_ip.ip);
50074fe6c29SRuslan Bukin 	}
50174fe6c29SRuslan Bukin 
50274fe6c29SRuslan Bukin 	return ptu_passed();
50374fe6c29SRuslan Bukin }
50474fe6c29SRuslan Bukin 
indir_tnt(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc)50574fe6c29SRuslan Bukin static struct ptunit_result indir_tnt(struct ptu_decoder_fixture *dfix,
50674fe6c29SRuslan Bukin 				      enum pt_ip_compression ipc)
50774fe6c29SRuslan Bukin {
50874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
50974fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
51074fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
51174fe6c29SRuslan Bukin 	uint64_t addr = pt_dfix_bad_ip;
51274fe6c29SRuslan Bukin 	int errcode;
51374fe6c29SRuslan Bukin 
51474fe6c29SRuslan Bukin 	packet.ipc = ipc;
51574fe6c29SRuslan Bukin 	packet.ip = pt_dfix_sext_ip;
51674fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
51774fe6c29SRuslan Bukin 
51874fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0ull, 1);
51974fe6c29SRuslan Bukin 	pt_encode_tip(encoder, packet.ip, packet.ipc);
52074fe6c29SRuslan Bukin 
52174fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
52274fe6c29SRuslan Bukin 
52374fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
52474fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed) {
52574fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_ip_suppressed);
52674fe6c29SRuslan Bukin 		ptu_uint_eq(addr, pt_dfix_bad_ip);
52774fe6c29SRuslan Bukin 	} else {
52874fe6c29SRuslan Bukin 		ptu_int_eq(errcode, 0);
52974fe6c29SRuslan Bukin 		ptu_uint_eq(addr, dfix->last_ip.ip);
53074fe6c29SRuslan Bukin 	}
53174fe6c29SRuslan Bukin 
53274fe6c29SRuslan Bukin 	return ptu_passed();
53374fe6c29SRuslan Bukin }
53474fe6c29SRuslan Bukin 
indir_cutoff_fail(struct ptu_decoder_fixture * dfix)53574fe6c29SRuslan Bukin static struct ptunit_result indir_cutoff_fail(struct ptu_decoder_fixture *dfix)
53674fe6c29SRuslan Bukin {
53774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
53874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
53974fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
54074fe6c29SRuslan Bukin 	int errcode;
54174fe6c29SRuslan Bukin 
54274fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
54374fe6c29SRuslan Bukin 
54474fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
54574fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
54674fe6c29SRuslan Bukin 
54774fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
54874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
54974fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
55074fe6c29SRuslan Bukin 
55174fe6c29SRuslan Bukin 	return ptu_passed();
55274fe6c29SRuslan Bukin }
55374fe6c29SRuslan Bukin 
55474fe6c29SRuslan Bukin static struct ptunit_result
indir_skip_tnt_fail(struct ptu_decoder_fixture * dfix)55574fe6c29SRuslan Bukin indir_skip_tnt_fail(struct ptu_decoder_fixture *dfix)
55674fe6c29SRuslan Bukin {
55774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
55874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
55974fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
56074fe6c29SRuslan Bukin 	int errcode;
56174fe6c29SRuslan Bukin 
56274fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
56374fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
56474fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
56574fe6c29SRuslan Bukin 
56674fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
56774fe6c29SRuslan Bukin 
56874fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
56974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
57074fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
57174fe6c29SRuslan Bukin 
57274fe6c29SRuslan Bukin 	return ptu_passed();
57374fe6c29SRuslan Bukin }
57474fe6c29SRuslan Bukin 
57574fe6c29SRuslan Bukin static struct ptunit_result
indir_skip_tip_pge_fail(struct ptu_decoder_fixture * dfix)57674fe6c29SRuslan Bukin indir_skip_tip_pge_fail(struct ptu_decoder_fixture *dfix)
57774fe6c29SRuslan Bukin {
57874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
57974fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
58074fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
58174fe6c29SRuslan Bukin 	const uint8_t *pos;
58274fe6c29SRuslan Bukin 	int errcode;
58374fe6c29SRuslan Bukin 
58474fe6c29SRuslan Bukin 	pos = encoder->pos;
58574fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, 0, pt_ipc_sext_48);
58674fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
58774fe6c29SRuslan Bukin 
58874fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
58974fe6c29SRuslan Bukin 
59074fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
59174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
59274fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
59374fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
59474fe6c29SRuslan Bukin 
59574fe6c29SRuslan Bukin 	return ptu_passed();
59674fe6c29SRuslan Bukin }
59774fe6c29SRuslan Bukin 
59874fe6c29SRuslan Bukin static struct ptunit_result
indir_skip_tip_pgd_fail(struct ptu_decoder_fixture * dfix)59974fe6c29SRuslan Bukin indir_skip_tip_pgd_fail(struct ptu_decoder_fixture *dfix)
60074fe6c29SRuslan Bukin {
60174fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
60274fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
60374fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
60474fe6c29SRuslan Bukin 	const uint8_t *pos;
60574fe6c29SRuslan Bukin 	int errcode;
60674fe6c29SRuslan Bukin 
60774fe6c29SRuslan Bukin 	pos = encoder->pos;
60874fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
60974fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
61074fe6c29SRuslan Bukin 
61174fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
61274fe6c29SRuslan Bukin 
61374fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
61474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
61574fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
61674fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
61774fe6c29SRuslan Bukin 
61874fe6c29SRuslan Bukin 	return ptu_passed();
61974fe6c29SRuslan Bukin }
62074fe6c29SRuslan Bukin 
62174fe6c29SRuslan Bukin static struct ptunit_result
indir_skip_fup_tip_fail(struct ptu_decoder_fixture * dfix)62274fe6c29SRuslan Bukin indir_skip_fup_tip_fail(struct ptu_decoder_fixture *dfix)
62374fe6c29SRuslan Bukin {
62474fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
62574fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
62674fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
62774fe6c29SRuslan Bukin 	const uint8_t *pos;
62874fe6c29SRuslan Bukin 	int errcode;
62974fe6c29SRuslan Bukin 
63074fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
63174fe6c29SRuslan Bukin 	pos = encoder->pos;
63274fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
63374fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
63474fe6c29SRuslan Bukin 
63574fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
63674fe6c29SRuslan Bukin 
63774fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
63874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
63974fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
64074fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
64174fe6c29SRuslan Bukin 
64274fe6c29SRuslan Bukin 	return ptu_passed();
64374fe6c29SRuslan Bukin }
64474fe6c29SRuslan Bukin 
64574fe6c29SRuslan Bukin static struct ptunit_result
indir_skip_fup_tip_pgd_fail(struct ptu_decoder_fixture * dfix)64674fe6c29SRuslan Bukin indir_skip_fup_tip_pgd_fail(struct ptu_decoder_fixture *dfix)
64774fe6c29SRuslan Bukin {
64874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
64974fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
65074fe6c29SRuslan Bukin 	uint64_t ip = pt_dfix_bad_ip, addr = ip;
65174fe6c29SRuslan Bukin 	const uint8_t *pos;
65274fe6c29SRuslan Bukin 	int errcode;
65374fe6c29SRuslan Bukin 
65474fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
65574fe6c29SRuslan Bukin 	pos = encoder->pos;
65674fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
65774fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
65874fe6c29SRuslan Bukin 
65974fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
66074fe6c29SRuslan Bukin 
66174fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
66274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
66374fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
66474fe6c29SRuslan Bukin 	ptu_uint_eq(addr, ip);
66574fe6c29SRuslan Bukin 
66674fe6c29SRuslan Bukin 	return ptu_passed();
66774fe6c29SRuslan Bukin }
66874fe6c29SRuslan Bukin 
cond_null(struct ptu_decoder_fixture * dfix)66974fe6c29SRuslan Bukin static struct ptunit_result cond_null(struct ptu_decoder_fixture *dfix)
67074fe6c29SRuslan Bukin {
67174fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
67274fe6c29SRuslan Bukin 	struct pt_config *config = &decoder->config;
67374fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
67474fe6c29SRuslan Bukin 
67574fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(NULL, &taken);
67674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
67774fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
67874fe6c29SRuslan Bukin 
67974fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, NULL);
68074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
68174fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, config->begin);
68274fe6c29SRuslan Bukin 
68374fe6c29SRuslan Bukin 	return ptu_passed();
68474fe6c29SRuslan Bukin }
68574fe6c29SRuslan Bukin 
cond_empty(struct ptu_decoder_fixture * dfix)68674fe6c29SRuslan Bukin static struct ptunit_result cond_empty(struct ptu_decoder_fixture *dfix)
68774fe6c29SRuslan Bukin {
68874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
68974fe6c29SRuslan Bukin 	struct pt_config *config = &decoder->config;
69074fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
69174fe6c29SRuslan Bukin 
69274fe6c29SRuslan Bukin 	decoder->pos = config->end;
69374fe6c29SRuslan Bukin 
69474fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
69574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
69674fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
69774fe6c29SRuslan Bukin 
69874fe6c29SRuslan Bukin 	return ptu_passed();
69974fe6c29SRuslan Bukin }
70074fe6c29SRuslan Bukin 
cond(struct ptu_decoder_fixture * dfix)70174fe6c29SRuslan Bukin static struct ptunit_result cond(struct ptu_decoder_fixture *dfix)
70274fe6c29SRuslan Bukin {
70374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
70474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
70574fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
70674fe6c29SRuslan Bukin 
70774fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0x02, 3);
70874fe6c29SRuslan Bukin 
70974fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
71074fe6c29SRuslan Bukin 
71174fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
71274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
71374fe6c29SRuslan Bukin 	ptu_int_eq(taken, 0);
71474fe6c29SRuslan Bukin 
71574fe6c29SRuslan Bukin 	taken = tnt;
71674fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
71774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
71874fe6c29SRuslan Bukin 	ptu_int_eq(taken, 1);
71974fe6c29SRuslan Bukin 
72074fe6c29SRuslan Bukin 	taken = tnt;
72174fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
72274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
72374fe6c29SRuslan Bukin 	ptu_int_eq(taken, 0);
72474fe6c29SRuslan Bukin 
72574fe6c29SRuslan Bukin 	taken = tnt;
72674fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
72774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
72874fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
72974fe6c29SRuslan Bukin 
73074fe6c29SRuslan Bukin 	return ptu_passed();
73174fe6c29SRuslan Bukin }
73274fe6c29SRuslan Bukin 
cond_skip_tip_fail(struct ptu_decoder_fixture * dfix)73374fe6c29SRuslan Bukin static struct ptunit_result cond_skip_tip_fail(struct ptu_decoder_fixture *dfix)
73474fe6c29SRuslan Bukin {
73574fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
73674fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
73774fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
73874fe6c29SRuslan Bukin 	const uint8_t *pos;
73974fe6c29SRuslan Bukin 
74074fe6c29SRuslan Bukin 	pos = encoder->pos;
74174fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
74274fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
74374fe6c29SRuslan Bukin 
74474fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
74574fe6c29SRuslan Bukin 
74674fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
74774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
74874fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
74974fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
75074fe6c29SRuslan Bukin 
75174fe6c29SRuslan Bukin 	return ptu_passed();
75274fe6c29SRuslan Bukin }
75374fe6c29SRuslan Bukin 
75474fe6c29SRuslan Bukin static struct ptunit_result
cond_skip_tip_pge_fail(struct ptu_decoder_fixture * dfix)75574fe6c29SRuslan Bukin cond_skip_tip_pge_fail(struct ptu_decoder_fixture *dfix)
75674fe6c29SRuslan Bukin {
75774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
75874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
75974fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
76074fe6c29SRuslan Bukin 	const uint8_t *pos;
76174fe6c29SRuslan Bukin 
76274fe6c29SRuslan Bukin 	pos = encoder->pos;
76374fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, 0, pt_ipc_sext_48);
76474fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
76574fe6c29SRuslan Bukin 
76674fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
76774fe6c29SRuslan Bukin 
76874fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
76974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
77074fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
77174fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
77274fe6c29SRuslan Bukin 
77374fe6c29SRuslan Bukin 	return ptu_passed();
77474fe6c29SRuslan Bukin }
77574fe6c29SRuslan Bukin 
77674fe6c29SRuslan Bukin static struct ptunit_result
cond_skip_tip_pgd_fail(struct ptu_decoder_fixture * dfix)77774fe6c29SRuslan Bukin cond_skip_tip_pgd_fail(struct ptu_decoder_fixture *dfix)
77874fe6c29SRuslan Bukin {
77974fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
78074fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
78174fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
78274fe6c29SRuslan Bukin 	const uint8_t *pos;
78374fe6c29SRuslan Bukin 
78474fe6c29SRuslan Bukin 	pos = encoder->pos;
78574fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
78674fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
78774fe6c29SRuslan Bukin 
78874fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
78974fe6c29SRuslan Bukin 
79074fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
79174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
79274fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
79374fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
79474fe6c29SRuslan Bukin 
79574fe6c29SRuslan Bukin 	return ptu_passed();
79674fe6c29SRuslan Bukin }
79774fe6c29SRuslan Bukin 
79874fe6c29SRuslan Bukin static struct ptunit_result
cond_skip_fup_tip_fail(struct ptu_decoder_fixture * dfix)79974fe6c29SRuslan Bukin cond_skip_fup_tip_fail(struct ptu_decoder_fixture *dfix)
80074fe6c29SRuslan Bukin {
80174fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
80274fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
80374fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
80474fe6c29SRuslan Bukin 	const uint8_t *pos;
80574fe6c29SRuslan Bukin 
80674fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
80774fe6c29SRuslan Bukin 	pos = encoder->pos;
80874fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
80974fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
81074fe6c29SRuslan Bukin 
81174fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
81274fe6c29SRuslan Bukin 
81374fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
81474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
81574fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
81674fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
81774fe6c29SRuslan Bukin 
81874fe6c29SRuslan Bukin 	return ptu_passed();
81974fe6c29SRuslan Bukin }
82074fe6c29SRuslan Bukin 
82174fe6c29SRuslan Bukin static struct ptunit_result
cond_skip_fup_tip_pgd_fail(struct ptu_decoder_fixture * dfix)82274fe6c29SRuslan Bukin cond_skip_fup_tip_pgd_fail(struct ptu_decoder_fixture *dfix)
82374fe6c29SRuslan Bukin {
82474fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
82574fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
82674fe6c29SRuslan Bukin 	int errcode, tnt = 0xbc, taken = tnt;
82774fe6c29SRuslan Bukin 	const uint8_t *pos;
82874fe6c29SRuslan Bukin 
82974fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
83074fe6c29SRuslan Bukin 	pos = encoder->pos;
83174fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
83274fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
83374fe6c29SRuslan Bukin 
83474fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
83574fe6c29SRuslan Bukin 
83674fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
83774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
83874fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
83974fe6c29SRuslan Bukin 	ptu_int_eq(taken, tnt);
84074fe6c29SRuslan Bukin 
84174fe6c29SRuslan Bukin 	return ptu_passed();
84274fe6c29SRuslan Bukin }
84374fe6c29SRuslan Bukin 
event_null(struct ptu_decoder_fixture * dfix)84474fe6c29SRuslan Bukin static struct ptunit_result event_null(struct ptu_decoder_fixture *dfix)
84574fe6c29SRuslan Bukin {
84674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
84774fe6c29SRuslan Bukin 	struct pt_config *config = &decoder->config;
84874fe6c29SRuslan Bukin 	struct pt_event event;
84974fe6c29SRuslan Bukin 	int errcode;
85074fe6c29SRuslan Bukin 
85174fe6c29SRuslan Bukin 	errcode = pt_qry_event(NULL, &event, sizeof(event));
85274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
85374fe6c29SRuslan Bukin 
85474fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, NULL, sizeof(event));
85574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
85674fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, config->begin);
85774fe6c29SRuslan Bukin 
85874fe6c29SRuslan Bukin 	return ptu_passed();
85974fe6c29SRuslan Bukin }
86074fe6c29SRuslan Bukin 
event_bad_size(struct ptu_decoder_fixture * dfix)86174fe6c29SRuslan Bukin static struct ptunit_result event_bad_size(struct ptu_decoder_fixture *dfix)
86274fe6c29SRuslan Bukin {
86374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
86474fe6c29SRuslan Bukin 	struct pt_event event;
86574fe6c29SRuslan Bukin 	int errcode;
86674fe6c29SRuslan Bukin 
86774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, 4);
86874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
86974fe6c29SRuslan Bukin 
87074fe6c29SRuslan Bukin 	return ptu_passed();
87174fe6c29SRuslan Bukin }
87274fe6c29SRuslan Bukin 
event_small_size(struct ptu_decoder_fixture * dfix)87374fe6c29SRuslan Bukin static struct ptunit_result event_small_size(struct ptu_decoder_fixture *dfix)
87474fe6c29SRuslan Bukin {
87574fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
87674fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
87774fe6c29SRuslan Bukin 	union {
87874fe6c29SRuslan Bukin 		struct pt_event event;
87974fe6c29SRuslan Bukin 		uint8_t buffer[41];
88074fe6c29SRuslan Bukin 	} variant;
88174fe6c29SRuslan Bukin 	int errcode;
88274fe6c29SRuslan Bukin 
88374fe6c29SRuslan Bukin 	memset(variant.buffer, 0xcd, sizeof(variant.buffer));
88474fe6c29SRuslan Bukin 
88574fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, 0ull, pt_ipc_sext_48);
88674fe6c29SRuslan Bukin 
88774fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
88874fe6c29SRuslan Bukin 
88974fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &variant.event, 40);
89074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
89174fe6c29SRuslan Bukin 	ptu_int_eq(variant.event.type, ptev_enabled);
89274fe6c29SRuslan Bukin 	ptu_uint_eq(variant.buffer[40], 0xcd);
89374fe6c29SRuslan Bukin 
89474fe6c29SRuslan Bukin 	return ptu_passed();
89574fe6c29SRuslan Bukin }
89674fe6c29SRuslan Bukin 
event_big_size(struct ptu_decoder_fixture * dfix)89774fe6c29SRuslan Bukin static struct ptunit_result event_big_size(struct ptu_decoder_fixture *dfix)
89874fe6c29SRuslan Bukin {
89974fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
90074fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
90174fe6c29SRuslan Bukin 	union {
90274fe6c29SRuslan Bukin 		struct pt_event event;
90374fe6c29SRuslan Bukin 		uint8_t buffer[1024];
90474fe6c29SRuslan Bukin 	} variant;
90574fe6c29SRuslan Bukin 	int errcode;
90674fe6c29SRuslan Bukin 
90774fe6c29SRuslan Bukin 	memset(variant.buffer, 0xcd, sizeof(variant.buffer));
90874fe6c29SRuslan Bukin 
90974fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, 0ull, pt_ipc_sext_48);
91074fe6c29SRuslan Bukin 
91174fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
91274fe6c29SRuslan Bukin 
91374fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &variant.event, sizeof(variant.buffer));
91474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
91574fe6c29SRuslan Bukin 	ptu_int_eq(variant.event.type, ptev_enabled);
91674fe6c29SRuslan Bukin 	ptu_uint_eq(variant.buffer[sizeof(variant.event)], 0xcd);
91774fe6c29SRuslan Bukin 
91874fe6c29SRuslan Bukin 	return ptu_passed();
91974fe6c29SRuslan Bukin }
92074fe6c29SRuslan Bukin 
event_empty(struct ptu_decoder_fixture * dfix)92174fe6c29SRuslan Bukin static struct ptunit_result event_empty(struct ptu_decoder_fixture *dfix)
92274fe6c29SRuslan Bukin {
92374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
92474fe6c29SRuslan Bukin 	struct pt_config *config = &decoder->config;
92574fe6c29SRuslan Bukin 	struct pt_event event;
92674fe6c29SRuslan Bukin 	int errcode;
92774fe6c29SRuslan Bukin 
92874fe6c29SRuslan Bukin 	decoder->pos = config->end;
92974fe6c29SRuslan Bukin 
93074fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
93174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
93274fe6c29SRuslan Bukin 
93374fe6c29SRuslan Bukin 	return ptu_passed();
93474fe6c29SRuslan Bukin }
93574fe6c29SRuslan Bukin 
event_enabled(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint64_t tsc)93674fe6c29SRuslan Bukin static struct ptunit_result event_enabled(struct ptu_decoder_fixture *dfix,
93774fe6c29SRuslan Bukin 					  enum pt_ip_compression ipc,
93874fe6c29SRuslan Bukin 					  uint64_t tsc)
93974fe6c29SRuslan Bukin {
94074fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
94174fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
94274fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
94374fe6c29SRuslan Bukin 	struct pt_event event;
94474fe6c29SRuslan Bukin 	int errcode;
94574fe6c29SRuslan Bukin 
94674fe6c29SRuslan Bukin 	packet.ipc = ipc;
94774fe6c29SRuslan Bukin 	packet.ip = pt_dfix_max_ip;
94874fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
94974fe6c29SRuslan Bukin 
95074fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, packet.ip, packet.ipc);
95174fe6c29SRuslan Bukin 
95274fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
95374fe6c29SRuslan Bukin 
95474fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
95574fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed)
95674fe6c29SRuslan Bukin 		ptu_int_eq(errcode, -pte_bad_packet);
95774fe6c29SRuslan Bukin 	else {
95874fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_eos);
95974fe6c29SRuslan Bukin 		ptu_int_eq(event.type, ptev_enabled);
96074fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.enabled.ip, dfix->last_ip.ip);
96174fe6c29SRuslan Bukin 
96274fe6c29SRuslan Bukin 		if (!tsc)
96374fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 0);
96474fe6c29SRuslan Bukin 		else {
96574fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 1);
96674fe6c29SRuslan Bukin 			ptu_uint_eq(event.tsc, tsc);
96774fe6c29SRuslan Bukin 		}
96874fe6c29SRuslan Bukin 	}
96974fe6c29SRuslan Bukin 
97074fe6c29SRuslan Bukin 	return ptu_passed();
97174fe6c29SRuslan Bukin }
97274fe6c29SRuslan Bukin 
97374fe6c29SRuslan Bukin static struct ptunit_result
event_enabled_cutoff_fail(struct ptu_decoder_fixture * dfix)97474fe6c29SRuslan Bukin event_enabled_cutoff_fail(struct ptu_decoder_fixture *dfix)
97574fe6c29SRuslan Bukin {
97674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
97774fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
97874fe6c29SRuslan Bukin 	struct pt_event event;
97974fe6c29SRuslan Bukin 	int errcode;
98074fe6c29SRuslan Bukin 
98174fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, 0, pt_ipc_sext_48);
98274fe6c29SRuslan Bukin 
98374fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
98474fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
98574fe6c29SRuslan Bukin 
98674fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
98774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
98874fe6c29SRuslan Bukin 
98974fe6c29SRuslan Bukin 	return ptu_passed();
99074fe6c29SRuslan Bukin }
99174fe6c29SRuslan Bukin 
event_disabled(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint64_t tsc)99274fe6c29SRuslan Bukin static struct ptunit_result event_disabled(struct ptu_decoder_fixture *dfix,
99374fe6c29SRuslan Bukin 					   enum pt_ip_compression ipc,
99474fe6c29SRuslan Bukin 					   uint64_t tsc)
99574fe6c29SRuslan Bukin {
99674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
99774fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
99874fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
99974fe6c29SRuslan Bukin 	struct pt_event event;
100074fe6c29SRuslan Bukin 	int errcode;
100174fe6c29SRuslan Bukin 
100274fe6c29SRuslan Bukin 	packet.ipc = ipc;
100374fe6c29SRuslan Bukin 	packet.ip = pt_dfix_sext_ip;
100474fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
100574fe6c29SRuslan Bukin 
100674fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, packet.ip, packet.ipc);
100774fe6c29SRuslan Bukin 
100874fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
100974fe6c29SRuslan Bukin 
101074fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
101174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
101274fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed)
101374fe6c29SRuslan Bukin 		ptu_uint_ne(event.ip_suppressed, 0);
101474fe6c29SRuslan Bukin 	else {
101574fe6c29SRuslan Bukin 		ptu_uint_eq(event.ip_suppressed, 0);
101674fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.disabled.ip, dfix->last_ip.ip);
101774fe6c29SRuslan Bukin 	}
101874fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_disabled);
101974fe6c29SRuslan Bukin 
102074fe6c29SRuslan Bukin 	if (!tsc)
102174fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
102274fe6c29SRuslan Bukin 	else {
102374fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
102474fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
102574fe6c29SRuslan Bukin 	}
102674fe6c29SRuslan Bukin 
102774fe6c29SRuslan Bukin 	return ptu_passed();
102874fe6c29SRuslan Bukin }
102974fe6c29SRuslan Bukin 
103074fe6c29SRuslan Bukin static struct ptunit_result
event_disabled_cutoff_fail(struct ptu_decoder_fixture * dfix)103174fe6c29SRuslan Bukin event_disabled_cutoff_fail(struct ptu_decoder_fixture *dfix)
103274fe6c29SRuslan Bukin {
103374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
103474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
103574fe6c29SRuslan Bukin 	struct pt_event event;
103674fe6c29SRuslan Bukin 	int errcode;
103774fe6c29SRuslan Bukin 
103874fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0, pt_ipc_update_32);
103974fe6c29SRuslan Bukin 
104074fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
104174fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
104274fe6c29SRuslan Bukin 
104374fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
104474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
104574fe6c29SRuslan Bukin 
104674fe6c29SRuslan Bukin 	return ptu_passed();
104774fe6c29SRuslan Bukin }
104874fe6c29SRuslan Bukin 
104974fe6c29SRuslan Bukin static struct ptunit_result
event_async_disabled(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint64_t tsc)105074fe6c29SRuslan Bukin event_async_disabled(struct ptu_decoder_fixture *dfix,
105174fe6c29SRuslan Bukin 		     enum pt_ip_compression ipc, uint64_t tsc)
105274fe6c29SRuslan Bukin {
105374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
105474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
105574fe6c29SRuslan Bukin 	struct pt_packet_ip fup, tip;
105674fe6c29SRuslan Bukin 	struct pt_event event;
105774fe6c29SRuslan Bukin 	int errcode;
105874fe6c29SRuslan Bukin 
105974fe6c29SRuslan Bukin 	fup.ipc = pt_ipc_sext_48;
106074fe6c29SRuslan Bukin 	fup.ip = pt_dfix_max_ip;
106174fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &fup, &dfix->config);
106274fe6c29SRuslan Bukin 
106374fe6c29SRuslan Bukin 	tip.ipc = ipc;
106474fe6c29SRuslan Bukin 	tip.ip = pt_dfix_sext_ip;
106574fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &tip, &dfix->config);
106674fe6c29SRuslan Bukin 
106774fe6c29SRuslan Bukin 	pt_encode_fup(encoder, fup.ip, fup.ipc);
106874fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, tip.ip, tip.ipc);
106974fe6c29SRuslan Bukin 
107074fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
107174fe6c29SRuslan Bukin 
107274fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
107374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
107474fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed)
107574fe6c29SRuslan Bukin 		ptu_uint_ne(event.ip_suppressed, 0);
107674fe6c29SRuslan Bukin 	else {
107774fe6c29SRuslan Bukin 		ptu_uint_eq(event.ip_suppressed, 0);
107874fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.async_disabled.ip, dfix->last_ip.ip);
107974fe6c29SRuslan Bukin 	}
108074fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_async_disabled);
108174fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_disabled.at, fup.ip);
108274fe6c29SRuslan Bukin 
108374fe6c29SRuslan Bukin 	if (!tsc)
108474fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
108574fe6c29SRuslan Bukin 	else {
108674fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
108774fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
108874fe6c29SRuslan Bukin 	}
108974fe6c29SRuslan Bukin 
109074fe6c29SRuslan Bukin 	return ptu_passed();
109174fe6c29SRuslan Bukin }
109274fe6c29SRuslan Bukin 
109374fe6c29SRuslan Bukin static struct ptunit_result
event_async_disabled_suppressed_fail(struct ptu_decoder_fixture * dfix)109474fe6c29SRuslan Bukin event_async_disabled_suppressed_fail(struct ptu_decoder_fixture *dfix)
109574fe6c29SRuslan Bukin {
109674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
109774fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
109874fe6c29SRuslan Bukin 	struct pt_event event;
109974fe6c29SRuslan Bukin 	int errcode;
110074fe6c29SRuslan Bukin 
110174fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_suppressed);
110274fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0, pt_ipc_sext_48);
110374fe6c29SRuslan Bukin 
110474fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
110574fe6c29SRuslan Bukin 
110674fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
110774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_ip_suppressed);
110874fe6c29SRuslan Bukin 
110974fe6c29SRuslan Bukin 	return ptu_passed();
111074fe6c29SRuslan Bukin }
111174fe6c29SRuslan Bukin 
111274fe6c29SRuslan Bukin static struct ptunit_result
event_async_disabled_cutoff_fail_a(struct ptu_decoder_fixture * dfix)111374fe6c29SRuslan Bukin event_async_disabled_cutoff_fail_a(struct ptu_decoder_fixture *dfix)
111474fe6c29SRuslan Bukin {
111574fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
111674fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
111774fe6c29SRuslan Bukin 	struct pt_event event;
111874fe6c29SRuslan Bukin 	uint64_t at = pt_dfix_sext_ip;
111974fe6c29SRuslan Bukin 	int errcode;
112074fe6c29SRuslan Bukin 
112174fe6c29SRuslan Bukin 	pt_encode_fup(encoder, at, pt_ipc_sext_48);
112274fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0, pt_ipc_update_16);
112374fe6c29SRuslan Bukin 
112474fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
112574fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
112674fe6c29SRuslan Bukin 
112774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
112874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
112974fe6c29SRuslan Bukin 
113074fe6c29SRuslan Bukin 	return ptu_passed();
113174fe6c29SRuslan Bukin }
113274fe6c29SRuslan Bukin 
113374fe6c29SRuslan Bukin static struct ptunit_result
event_async_disabled_cutoff_fail_b(struct ptu_decoder_fixture * dfix)113474fe6c29SRuslan Bukin event_async_disabled_cutoff_fail_b(struct ptu_decoder_fixture *dfix)
113574fe6c29SRuslan Bukin {
113674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
113774fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
113874fe6c29SRuslan Bukin 	struct pt_event event;
113974fe6c29SRuslan Bukin 	int errcode;
114074fe6c29SRuslan Bukin 
114174fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
114274fe6c29SRuslan Bukin 
114374fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
114474fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
114574fe6c29SRuslan Bukin 
114674fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
114774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
114874fe6c29SRuslan Bukin 
114974fe6c29SRuslan Bukin 	return ptu_passed();
115074fe6c29SRuslan Bukin }
115174fe6c29SRuslan Bukin 
115274fe6c29SRuslan Bukin static struct ptunit_result
event_async_branch_suppressed_fail(struct ptu_decoder_fixture * dfix)115374fe6c29SRuslan Bukin event_async_branch_suppressed_fail(struct ptu_decoder_fixture *dfix)
115474fe6c29SRuslan Bukin {
115574fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
115674fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
115774fe6c29SRuslan Bukin 	struct pt_event event;
115874fe6c29SRuslan Bukin 	int errcode;
115974fe6c29SRuslan Bukin 
116074fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_suppressed);
116174fe6c29SRuslan Bukin 
116274fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
116374fe6c29SRuslan Bukin 
116474fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
116574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_ip_suppressed);
116674fe6c29SRuslan Bukin 
116774fe6c29SRuslan Bukin 	return ptu_passed();
116874fe6c29SRuslan Bukin }
116974fe6c29SRuslan Bukin 
event_async_branch(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint64_t tsc)117074fe6c29SRuslan Bukin static struct ptunit_result event_async_branch(struct ptu_decoder_fixture *dfix,
117174fe6c29SRuslan Bukin 					       enum pt_ip_compression ipc,
117274fe6c29SRuslan Bukin 					       uint64_t tsc)
117374fe6c29SRuslan Bukin {
117474fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
117574fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
117674fe6c29SRuslan Bukin 	struct pt_packet_ip fup, tip;
117774fe6c29SRuslan Bukin 	struct pt_event event;
117874fe6c29SRuslan Bukin 	int errcode;
117974fe6c29SRuslan Bukin 
118074fe6c29SRuslan Bukin 	fup.ipc = pt_ipc_sext_48;
118174fe6c29SRuslan Bukin 	fup.ip = pt_dfix_max_ip;
118274fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &fup, &dfix->config);
118374fe6c29SRuslan Bukin 
118474fe6c29SRuslan Bukin 	tip.ipc = ipc;
118574fe6c29SRuslan Bukin 	tip.ip = pt_dfix_sext_ip;
118674fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &tip, &dfix->config);
118774fe6c29SRuslan Bukin 
118874fe6c29SRuslan Bukin 	pt_encode_fup(encoder, fup.ip, fup.ipc);
118974fe6c29SRuslan Bukin 	pt_encode_tip(encoder, tip.ip, tip.ipc);
119074fe6c29SRuslan Bukin 
119174fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
119274fe6c29SRuslan Bukin 
119374fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
119474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
119574fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed)
119674fe6c29SRuslan Bukin 		ptu_uint_ne(event.ip_suppressed, 0);
119774fe6c29SRuslan Bukin 	else {
119874fe6c29SRuslan Bukin 		ptu_uint_eq(event.ip_suppressed, 0);
119974fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.async_branch.to, dfix->last_ip.ip);
120074fe6c29SRuslan Bukin 	}
120174fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_async_branch);
120274fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_branch.from, fup.ip);
120374fe6c29SRuslan Bukin 
120474fe6c29SRuslan Bukin 	if (!tsc)
120574fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
120674fe6c29SRuslan Bukin 	else {
120774fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
120874fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
120974fe6c29SRuslan Bukin 	}
121074fe6c29SRuslan Bukin 
121174fe6c29SRuslan Bukin 	return ptu_passed();
121274fe6c29SRuslan Bukin }
121374fe6c29SRuslan Bukin 
121474fe6c29SRuslan Bukin static struct ptunit_result
event_async_branch_cutoff_fail_a(struct ptu_decoder_fixture * dfix)121574fe6c29SRuslan Bukin event_async_branch_cutoff_fail_a(struct ptu_decoder_fixture *dfix)
121674fe6c29SRuslan Bukin {
121774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
121874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
121974fe6c29SRuslan Bukin 	struct pt_event event;
122074fe6c29SRuslan Bukin 	int errcode;
122174fe6c29SRuslan Bukin 
122274fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
122374fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0, pt_ipc_update_16);
122474fe6c29SRuslan Bukin 
122574fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
122674fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
122774fe6c29SRuslan Bukin 
122874fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
122974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
123074fe6c29SRuslan Bukin 
123174fe6c29SRuslan Bukin 	return ptu_passed();
123274fe6c29SRuslan Bukin }
123374fe6c29SRuslan Bukin 
123474fe6c29SRuslan Bukin static struct ptunit_result
event_async_branch_cutoff_fail_b(struct ptu_decoder_fixture * dfix)123574fe6c29SRuslan Bukin event_async_branch_cutoff_fail_b(struct ptu_decoder_fixture *dfix)
123674fe6c29SRuslan Bukin {
123774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
123874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
123974fe6c29SRuslan Bukin 	struct pt_event event;
124074fe6c29SRuslan Bukin 	int errcode;
124174fe6c29SRuslan Bukin 
124274fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
124374fe6c29SRuslan Bukin 
124474fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
124574fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
124674fe6c29SRuslan Bukin 
124774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
124874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
124974fe6c29SRuslan Bukin 
125074fe6c29SRuslan Bukin 	return ptu_passed();
125174fe6c29SRuslan Bukin }
125274fe6c29SRuslan Bukin 
event_paging(struct ptu_decoder_fixture * dfix,uint8_t flags,uint64_t tsc)125374fe6c29SRuslan Bukin static struct ptunit_result event_paging(struct ptu_decoder_fixture *dfix,
125474fe6c29SRuslan Bukin 					 uint8_t flags, uint64_t tsc)
125574fe6c29SRuslan Bukin {
125674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
125774fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
125874fe6c29SRuslan Bukin 	struct pt_event event;
125974fe6c29SRuslan Bukin 	uint64_t cr3 = pt_dfix_max_cr3;
126074fe6c29SRuslan Bukin 	int errcode;
126174fe6c29SRuslan Bukin 
126274fe6c29SRuslan Bukin 	pt_encode_pip(encoder, cr3, flags);
126374fe6c29SRuslan Bukin 
126474fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
126574fe6c29SRuslan Bukin 
126674fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
126774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
126874fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_paging);
126974fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.paging.cr3, cr3);
127074fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.paging.non_root, (flags & pt_pl_pip_nr) != 0);
127174fe6c29SRuslan Bukin 
127274fe6c29SRuslan Bukin 	if (!tsc)
127374fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
127474fe6c29SRuslan Bukin 	else {
127574fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
127674fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
127774fe6c29SRuslan Bukin 	}
127874fe6c29SRuslan Bukin 
127974fe6c29SRuslan Bukin 	return ptu_passed();
128074fe6c29SRuslan Bukin }
128174fe6c29SRuslan Bukin 
128274fe6c29SRuslan Bukin static struct ptunit_result
event_paging_cutoff_fail(struct ptu_decoder_fixture * dfix)128374fe6c29SRuslan Bukin event_paging_cutoff_fail(struct ptu_decoder_fixture *dfix)
128474fe6c29SRuslan Bukin {
128574fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
128674fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
128774fe6c29SRuslan Bukin 	struct pt_event event;
128874fe6c29SRuslan Bukin 	int errcode;
128974fe6c29SRuslan Bukin 
129074fe6c29SRuslan Bukin 	pt_encode_pip(encoder, 0, 0);
129174fe6c29SRuslan Bukin 
129274fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
129374fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
129474fe6c29SRuslan Bukin 
129574fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
129674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
129774fe6c29SRuslan Bukin 
129874fe6c29SRuslan Bukin 	return ptu_passed();
129974fe6c29SRuslan Bukin }
130074fe6c29SRuslan Bukin 
130174fe6c29SRuslan Bukin static struct ptunit_result
event_async_paging(struct ptu_decoder_fixture * dfix,uint8_t flags,uint64_t tsc)130274fe6c29SRuslan Bukin event_async_paging(struct ptu_decoder_fixture *dfix, uint8_t flags,
130374fe6c29SRuslan Bukin 		   uint64_t tsc)
130474fe6c29SRuslan Bukin {
130574fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
130674fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
130774fe6c29SRuslan Bukin 	struct pt_event event;
130874fe6c29SRuslan Bukin 	uint64_t to = pt_dfix_sext_ip, from = to & ~0xffffull;
130974fe6c29SRuslan Bukin 	uint64_t cr3 = pt_dfix_max_cr3;
131074fe6c29SRuslan Bukin 	int errcode;
131174fe6c29SRuslan Bukin 
131274fe6c29SRuslan Bukin 	pt_encode_fup(encoder, from, pt_ipc_sext_48);
131374fe6c29SRuslan Bukin 	pt_encode_pip(encoder, cr3, flags);
131474fe6c29SRuslan Bukin 	pt_encode_tip(encoder, to, pt_ipc_update_16);
131574fe6c29SRuslan Bukin 
131674fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
131774fe6c29SRuslan Bukin 
131874fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
131974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_event_pending);
132074fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_async_branch);
132174fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_branch.from, from);
132274fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_branch.to, to);
132374fe6c29SRuslan Bukin 
132474fe6c29SRuslan Bukin 	if (!tsc)
132574fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
132674fe6c29SRuslan Bukin 	else {
132774fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
132874fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
132974fe6c29SRuslan Bukin 	}
133074fe6c29SRuslan Bukin 
133174fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
133274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
133374fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_async_paging);
133474fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_paging.cr3, cr3);
133574fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_paging.non_root,
133674fe6c29SRuslan Bukin 		    (flags & pt_pl_pip_nr) != 0);
133774fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_paging.ip, to);
133874fe6c29SRuslan Bukin 
133974fe6c29SRuslan Bukin 	if (!tsc)
134074fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
134174fe6c29SRuslan Bukin 	else {
134274fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
134374fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
134474fe6c29SRuslan Bukin 	}
134574fe6c29SRuslan Bukin 
134674fe6c29SRuslan Bukin 	return ptu_passed();
134774fe6c29SRuslan Bukin }
134874fe6c29SRuslan Bukin 
134974fe6c29SRuslan Bukin static struct ptunit_result
event_async_paging_suppressed(struct ptu_decoder_fixture * dfix,uint8_t flags,uint64_t tsc)135074fe6c29SRuslan Bukin event_async_paging_suppressed(struct ptu_decoder_fixture *dfix, uint8_t flags,
135174fe6c29SRuslan Bukin 			      uint64_t tsc)
135274fe6c29SRuslan Bukin {
135374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
135474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
135574fe6c29SRuslan Bukin 	struct pt_event event;
135674fe6c29SRuslan Bukin 	uint64_t from = pt_dfix_sext_ip, cr3 = pt_dfix_max_cr3;
135774fe6c29SRuslan Bukin 	int errcode;
135874fe6c29SRuslan Bukin 
135974fe6c29SRuslan Bukin 	pt_encode_fup(encoder, from, pt_ipc_sext_48);
136074fe6c29SRuslan Bukin 	pt_encode_pip(encoder, cr3, flags);
136174fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_suppressed);
136274fe6c29SRuslan Bukin 
136374fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
136474fe6c29SRuslan Bukin 
136574fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
136674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_event_pending);
136774fe6c29SRuslan Bukin 	ptu_uint_ne(event.ip_suppressed, 0);
136874fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_async_branch);
136974fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_branch.from, from);
137074fe6c29SRuslan Bukin 
137174fe6c29SRuslan Bukin 	if (!tsc)
137274fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
137374fe6c29SRuslan Bukin 	else {
137474fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
137574fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
137674fe6c29SRuslan Bukin 	}
137774fe6c29SRuslan Bukin 
137874fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
137974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
138074fe6c29SRuslan Bukin 	ptu_uint_ne(event.ip_suppressed, 0);
138174fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_async_paging);
138274fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_paging.cr3, cr3);
138374fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.async_paging.non_root,
138474fe6c29SRuslan Bukin 		    (flags & pt_pl_pip_nr) != 0);
138574fe6c29SRuslan Bukin 
138674fe6c29SRuslan Bukin 	if (!tsc)
138774fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
138874fe6c29SRuslan Bukin 	else {
138974fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
139074fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
139174fe6c29SRuslan Bukin 	}
139274fe6c29SRuslan Bukin 
139374fe6c29SRuslan Bukin 	return ptu_passed();
139474fe6c29SRuslan Bukin }
139574fe6c29SRuslan Bukin 
139674fe6c29SRuslan Bukin static struct ptunit_result
event_async_paging_cutoff_fail(struct ptu_decoder_fixture * dfix)139774fe6c29SRuslan Bukin event_async_paging_cutoff_fail(struct ptu_decoder_fixture *dfix)
139874fe6c29SRuslan Bukin {
139974fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
140074fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
140174fe6c29SRuslan Bukin 	struct pt_event event;
140274fe6c29SRuslan Bukin 	int errcode;
140374fe6c29SRuslan Bukin 
140474fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_sext_48);
140574fe6c29SRuslan Bukin 	pt_encode_pip(encoder, 0, 0);
140674fe6c29SRuslan Bukin 
140774fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
140874fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
140974fe6c29SRuslan Bukin 
141074fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
141174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
141274fe6c29SRuslan Bukin 
141374fe6c29SRuslan Bukin 	return ptu_passed();
141474fe6c29SRuslan Bukin }
141574fe6c29SRuslan Bukin 
event_overflow_fup(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint64_t tsc)141674fe6c29SRuslan Bukin static struct ptunit_result event_overflow_fup(struct ptu_decoder_fixture *dfix,
141774fe6c29SRuslan Bukin 					       enum pt_ip_compression ipc,
141874fe6c29SRuslan Bukin 					       uint64_t tsc)
141974fe6c29SRuslan Bukin {
142074fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
142174fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
142274fe6c29SRuslan Bukin 	struct pt_event event;
142374fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
142474fe6c29SRuslan Bukin 	int errcode;
142574fe6c29SRuslan Bukin 
142674fe6c29SRuslan Bukin 	packet.ipc = ipc;
142774fe6c29SRuslan Bukin 	packet.ip = 0xccull;
142874fe6c29SRuslan Bukin 
142974fe6c29SRuslan Bukin 	pt_last_ip_init(&dfix->last_ip);
143074fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
143174fe6c29SRuslan Bukin 
143274fe6c29SRuslan Bukin 	pt_encode_ovf(encoder);
143374fe6c29SRuslan Bukin 	pt_encode_fup(encoder, packet.ip, packet.ipc);
143474fe6c29SRuslan Bukin 
143574fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
143674fe6c29SRuslan Bukin 
143774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
143874fe6c29SRuslan Bukin 	switch (ipc) {
143974fe6c29SRuslan Bukin 	case pt_ipc_suppressed:
144074fe6c29SRuslan Bukin 		ptu_int_eq(errcode, -pte_noip);
144174fe6c29SRuslan Bukin 		break;
144274fe6c29SRuslan Bukin 
144374fe6c29SRuslan Bukin 	case pt_ipc_update_16:
144474fe6c29SRuslan Bukin 	case pt_ipc_update_32:
144574fe6c29SRuslan Bukin 	case pt_ipc_update_48:
144674fe6c29SRuslan Bukin 	case pt_ipc_sext_48:
144774fe6c29SRuslan Bukin 	case pt_ipc_full:
144874fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_eos);
144974fe6c29SRuslan Bukin 		ptu_int_eq(event.type, ptev_overflow);
145074fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.overflow.ip, dfix->last_ip.ip);
145174fe6c29SRuslan Bukin 
145274fe6c29SRuslan Bukin 		if (!tsc)
145374fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 0);
145474fe6c29SRuslan Bukin 		else {
145574fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 1);
145674fe6c29SRuslan Bukin 			ptu_uint_eq(event.tsc, tsc);
145774fe6c29SRuslan Bukin 		}
145874fe6c29SRuslan Bukin 		break;
145974fe6c29SRuslan Bukin 	}
146074fe6c29SRuslan Bukin 
146174fe6c29SRuslan Bukin 	return ptu_passed();
146274fe6c29SRuslan Bukin }
146374fe6c29SRuslan Bukin 
146474fe6c29SRuslan Bukin static struct ptunit_result
event_overflow_tip_pge(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint64_t tsc)146574fe6c29SRuslan Bukin event_overflow_tip_pge(struct ptu_decoder_fixture *dfix,
146674fe6c29SRuslan Bukin 		       enum pt_ip_compression ipc, uint64_t tsc)
146774fe6c29SRuslan Bukin {
146874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
146974fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
147074fe6c29SRuslan Bukin 	struct pt_event event;
147174fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
147274fe6c29SRuslan Bukin 	int errcode;
147374fe6c29SRuslan Bukin 
147474fe6c29SRuslan Bukin 	packet.ipc = ipc;
147574fe6c29SRuslan Bukin 	packet.ip = 0xccull;
147674fe6c29SRuslan Bukin 
147774fe6c29SRuslan Bukin 	pt_last_ip_init(&dfix->last_ip);
147874fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
147974fe6c29SRuslan Bukin 
148074fe6c29SRuslan Bukin 	pt_encode_ovf(encoder);
148174fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, packet.ip, packet.ipc);
148274fe6c29SRuslan Bukin 
148374fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
148474fe6c29SRuslan Bukin 
148574fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
148674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_event_pending);
148774fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_overflow);
148874fe6c29SRuslan Bukin 	ptu_uint_ne(event.ip_suppressed, 0);
148974fe6c29SRuslan Bukin 
149074fe6c29SRuslan Bukin 	if (!tsc)
149174fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
149274fe6c29SRuslan Bukin 	else {
149374fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
149474fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
149574fe6c29SRuslan Bukin 	}
149674fe6c29SRuslan Bukin 
149774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
149874fe6c29SRuslan Bukin 	switch (ipc) {
149974fe6c29SRuslan Bukin 	case pt_ipc_suppressed:
150074fe6c29SRuslan Bukin 		ptu_int_eq(errcode, -pte_bad_packet);
150174fe6c29SRuslan Bukin 		break;
150274fe6c29SRuslan Bukin 
150374fe6c29SRuslan Bukin 	case pt_ipc_update_16:
150474fe6c29SRuslan Bukin 	case pt_ipc_update_32:
150574fe6c29SRuslan Bukin 	case pt_ipc_update_48:
150674fe6c29SRuslan Bukin 	case pt_ipc_sext_48:
150774fe6c29SRuslan Bukin 	case pt_ipc_full:
150874fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_eos);
150974fe6c29SRuslan Bukin 		ptu_int_eq(event.type, ptev_enabled);
151074fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.enabled.ip, dfix->last_ip.ip);
151174fe6c29SRuslan Bukin 
151274fe6c29SRuslan Bukin 		if (!tsc)
151374fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 0);
151474fe6c29SRuslan Bukin 		else {
151574fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 1);
151674fe6c29SRuslan Bukin 			ptu_uint_eq(event.tsc, tsc);
151774fe6c29SRuslan Bukin 		}
151874fe6c29SRuslan Bukin 		break;
151974fe6c29SRuslan Bukin 	}
152074fe6c29SRuslan Bukin 
152174fe6c29SRuslan Bukin 	return ptu_passed();
152274fe6c29SRuslan Bukin }
152374fe6c29SRuslan Bukin 
152474fe6c29SRuslan Bukin static struct ptunit_result
event_overflow_cutoff_fail(struct ptu_decoder_fixture * dfix)152574fe6c29SRuslan Bukin event_overflow_cutoff_fail(struct ptu_decoder_fixture *dfix)
152674fe6c29SRuslan Bukin {
152774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
152874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
152974fe6c29SRuslan Bukin 	struct pt_event event;
153074fe6c29SRuslan Bukin 	int errcode;
153174fe6c29SRuslan Bukin 
153274fe6c29SRuslan Bukin 	pt_encode_ovf(encoder);
153374fe6c29SRuslan Bukin 
153474fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
153574fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
153674fe6c29SRuslan Bukin 
153774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
153874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
153974fe6c29SRuslan Bukin 
154074fe6c29SRuslan Bukin 	return ptu_passed();
154174fe6c29SRuslan Bukin }
154274fe6c29SRuslan Bukin 
event_stop(struct ptu_decoder_fixture * dfix,uint64_t tsc)154374fe6c29SRuslan Bukin static struct ptunit_result event_stop(struct ptu_decoder_fixture *dfix,
154474fe6c29SRuslan Bukin 				       uint64_t tsc)
154574fe6c29SRuslan Bukin {
154674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
154774fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
154874fe6c29SRuslan Bukin 	struct pt_event event;
154974fe6c29SRuslan Bukin 	int errcode;
155074fe6c29SRuslan Bukin 
155174fe6c29SRuslan Bukin 	pt_encode_stop(encoder);
155274fe6c29SRuslan Bukin 
155374fe6c29SRuslan Bukin 	ptu_sync_decoder(decoder);
155474fe6c29SRuslan Bukin 
155574fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
155674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
155774fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_stop);
155874fe6c29SRuslan Bukin 
155974fe6c29SRuslan Bukin 	if (!tsc)
156074fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
156174fe6c29SRuslan Bukin 	else {
156274fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
156374fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
156474fe6c29SRuslan Bukin 	}
156574fe6c29SRuslan Bukin 
156674fe6c29SRuslan Bukin 	return ptu_passed();
156774fe6c29SRuslan Bukin }
156874fe6c29SRuslan Bukin 
156974fe6c29SRuslan Bukin static struct ptunit_result
event_exec_mode_tip(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint64_t tsc)157074fe6c29SRuslan Bukin event_exec_mode_tip(struct ptu_decoder_fixture *dfix,
157174fe6c29SRuslan Bukin 		    enum pt_ip_compression ipc, uint64_t tsc)
157274fe6c29SRuslan Bukin {
157374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
157474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
157574fe6c29SRuslan Bukin 	enum pt_exec_mode mode = ptem_16bit;
157674fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
157774fe6c29SRuslan Bukin 	struct pt_event event;
157874fe6c29SRuslan Bukin 	uint64_t addr = 0ull;
157974fe6c29SRuslan Bukin 	int errcode;
158074fe6c29SRuslan Bukin 
158174fe6c29SRuslan Bukin 	packet.ipc = ipc;
158274fe6c29SRuslan Bukin 	packet.ip = pt_dfix_max_ip;
158374fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
158474fe6c29SRuslan Bukin 
158574fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, mode);
158674fe6c29SRuslan Bukin 	pt_encode_tip(encoder, packet.ip, packet.ipc);
158774fe6c29SRuslan Bukin 
158874fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
158974fe6c29SRuslan Bukin 
159074fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
159174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
159274fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed)
159374fe6c29SRuslan Bukin 		ptu_uint_ne(event.ip_suppressed, 0);
159474fe6c29SRuslan Bukin 	else {
159574fe6c29SRuslan Bukin 		ptu_uint_eq(event.ip_suppressed, 0);
159674fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.exec_mode.ip, dfix->last_ip.ip);
159774fe6c29SRuslan Bukin 	}
159874fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_exec_mode);
159974fe6c29SRuslan Bukin 	ptu_int_eq(event.variant.exec_mode.mode, mode);
160074fe6c29SRuslan Bukin 
160174fe6c29SRuslan Bukin 	if (!tsc)
160274fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
160374fe6c29SRuslan Bukin 	else {
160474fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
160574fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
160674fe6c29SRuslan Bukin 	}
160774fe6c29SRuslan Bukin 
160874fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
160974fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed)
161074fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_ip_suppressed | pts_eos);
161174fe6c29SRuslan Bukin 	else {
161274fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_eos);
161374fe6c29SRuslan Bukin 		ptu_uint_eq(addr, dfix->last_ip.ip);
161474fe6c29SRuslan Bukin 	}
161574fe6c29SRuslan Bukin 
161674fe6c29SRuslan Bukin 	return ptu_passed();
161774fe6c29SRuslan Bukin }
161874fe6c29SRuslan Bukin 
161974fe6c29SRuslan Bukin static struct ptunit_result
event_exec_mode_tip_cutoff_fail(struct ptu_decoder_fixture * dfix)162074fe6c29SRuslan Bukin event_exec_mode_tip_cutoff_fail(struct ptu_decoder_fixture *dfix)
162174fe6c29SRuslan Bukin {
162274fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
162374fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
162474fe6c29SRuslan Bukin 	struct pt_event event;
162574fe6c29SRuslan Bukin 	int errcode;
162674fe6c29SRuslan Bukin 
162774fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_32bit);
162874fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_update_16);
162974fe6c29SRuslan Bukin 
163074fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
163174fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
163274fe6c29SRuslan Bukin 
163374fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
163474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
163574fe6c29SRuslan Bukin 
163674fe6c29SRuslan Bukin 	return ptu_passed();
163774fe6c29SRuslan Bukin }
163874fe6c29SRuslan Bukin 
163974fe6c29SRuslan Bukin static struct ptunit_result
event_exec_mode_tip_pge(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint64_t tsc)164074fe6c29SRuslan Bukin event_exec_mode_tip_pge(struct ptu_decoder_fixture *dfix,
164174fe6c29SRuslan Bukin 			enum pt_ip_compression ipc, uint64_t tsc)
164274fe6c29SRuslan Bukin {
164374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
164474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
164574fe6c29SRuslan Bukin 	enum pt_exec_mode mode = ptem_16bit;
164674fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
164774fe6c29SRuslan Bukin 	struct pt_event event;
164874fe6c29SRuslan Bukin 	uint64_t addr = 0ull;
164974fe6c29SRuslan Bukin 	int errcode;
165074fe6c29SRuslan Bukin 
165174fe6c29SRuslan Bukin 	packet.ipc = ipc;
165274fe6c29SRuslan Bukin 	packet.ip = pt_dfix_max_ip;
165374fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
165474fe6c29SRuslan Bukin 
165574fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, mode);
165674fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, packet.ip, packet.ipc);
165774fe6c29SRuslan Bukin 
165874fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
165974fe6c29SRuslan Bukin 	decoder->enabled = 0;
166074fe6c29SRuslan Bukin 
166174fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
166274fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed) {
166374fe6c29SRuslan Bukin 		ptu_int_eq(errcode, -pte_bad_packet);
166474fe6c29SRuslan Bukin 		ptu_uint_eq(addr, 0ull);
166574fe6c29SRuslan Bukin 	} else {
166674fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_event_pending);
166774fe6c29SRuslan Bukin 		ptu_int_eq(event.type, ptev_enabled);
166874fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.enabled.ip, dfix->last_ip.ip);
166974fe6c29SRuslan Bukin 
167074fe6c29SRuslan Bukin 		if (!tsc)
167174fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 0);
167274fe6c29SRuslan Bukin 		else {
167374fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 1);
167474fe6c29SRuslan Bukin 			ptu_uint_eq(event.tsc, tsc);
167574fe6c29SRuslan Bukin 		}
167674fe6c29SRuslan Bukin 
167774fe6c29SRuslan Bukin 		errcode = pt_qry_event(decoder, &event, sizeof(event));
167874fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_eos);
167974fe6c29SRuslan Bukin 		ptu_int_eq(event.type, ptev_exec_mode);
168074fe6c29SRuslan Bukin 		ptu_int_eq(event.variant.exec_mode.mode, mode);
168174fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.exec_mode.ip, dfix->last_ip.ip);
168274fe6c29SRuslan Bukin 
168374fe6c29SRuslan Bukin 		if (!tsc)
168474fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 0);
168574fe6c29SRuslan Bukin 		else {
168674fe6c29SRuslan Bukin 			ptu_int_eq(event.has_tsc, 1);
168774fe6c29SRuslan Bukin 			ptu_uint_eq(event.tsc, tsc);
168874fe6c29SRuslan Bukin 		}
168974fe6c29SRuslan Bukin 	}
169074fe6c29SRuslan Bukin 
169174fe6c29SRuslan Bukin 	return ptu_passed();
169274fe6c29SRuslan Bukin }
169374fe6c29SRuslan Bukin 
169474fe6c29SRuslan Bukin static struct ptunit_result
event_exec_mode_tip_pge_cutoff_fail(struct ptu_decoder_fixture * dfix)169574fe6c29SRuslan Bukin event_exec_mode_tip_pge_cutoff_fail(struct ptu_decoder_fixture *dfix)
169674fe6c29SRuslan Bukin {
169774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
169874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
169974fe6c29SRuslan Bukin 	struct pt_event event;
170074fe6c29SRuslan Bukin 	int errcode;
170174fe6c29SRuslan Bukin 
170274fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_16bit);
170374fe6c29SRuslan Bukin 	pt_encode_tip_pge(encoder, 0, pt_ipc_sext_48);
170474fe6c29SRuslan Bukin 
170574fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
170674fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
170774fe6c29SRuslan Bukin 
170874fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
170974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
171074fe6c29SRuslan Bukin 
171174fe6c29SRuslan Bukin 	return ptu_passed();
171274fe6c29SRuslan Bukin }
171374fe6c29SRuslan Bukin 
171474fe6c29SRuslan Bukin static struct ptunit_result
event_exec_mode_cutoff_fail(struct ptu_decoder_fixture * dfix)171574fe6c29SRuslan Bukin event_exec_mode_cutoff_fail(struct ptu_decoder_fixture *dfix)
171674fe6c29SRuslan Bukin {
171774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
171874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
171974fe6c29SRuslan Bukin 	struct pt_event event;
172074fe6c29SRuslan Bukin 	int errcode;
172174fe6c29SRuslan Bukin 
172274fe6c29SRuslan Bukin 	pt_encode_mode_exec(encoder, ptem_64bit);
172374fe6c29SRuslan Bukin 
172474fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
172574fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
172674fe6c29SRuslan Bukin 
172774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
172874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
172974fe6c29SRuslan Bukin 
173074fe6c29SRuslan Bukin 	return ptu_passed();
173174fe6c29SRuslan Bukin }
173274fe6c29SRuslan Bukin 
event_tsx_fup(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc,uint8_t flags,uint64_t tsc)173374fe6c29SRuslan Bukin static struct ptunit_result event_tsx_fup(struct ptu_decoder_fixture *dfix,
173474fe6c29SRuslan Bukin 					  enum pt_ip_compression ipc,
173574fe6c29SRuslan Bukin 					  uint8_t flags, uint64_t tsc)
173674fe6c29SRuslan Bukin {
173774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
173874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
173974fe6c29SRuslan Bukin 	struct pt_packet_ip fup, tip;
174074fe6c29SRuslan Bukin 	struct pt_event event;
174174fe6c29SRuslan Bukin 	uint64_t addr = 0;
174274fe6c29SRuslan Bukin 	int errcode;
174374fe6c29SRuslan Bukin 
174474fe6c29SRuslan Bukin 	fup.ipc = ipc;
174574fe6c29SRuslan Bukin 	fup.ip = pt_dfix_max_ip;
174674fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &fup, &dfix->config);
174774fe6c29SRuslan Bukin 
174874fe6c29SRuslan Bukin 	tip.ipc = pt_ipc_sext_48;
174974fe6c29SRuslan Bukin 	tip.ip = pt_dfix_sext_ip;
175074fe6c29SRuslan Bukin 
175174fe6c29SRuslan Bukin 	pt_encode_mode_tsx(encoder, flags);
175274fe6c29SRuslan Bukin 	pt_encode_fup(encoder, fup.ip, fup.ipc);
175374fe6c29SRuslan Bukin 	pt_encode_tip(encoder, tip.ip, tip.ipc);
175474fe6c29SRuslan Bukin 
175574fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
175674fe6c29SRuslan Bukin 
175774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
175874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
175974fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed)
176074fe6c29SRuslan Bukin 		ptu_uint_ne(event.ip_suppressed, 0);
176174fe6c29SRuslan Bukin 	else {
176274fe6c29SRuslan Bukin 		ptu_uint_eq(event.ip_suppressed, 0);
176374fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.tsx.ip, dfix->last_ip.ip);
176474fe6c29SRuslan Bukin 	}
176574fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_tsx);
176674fe6c29SRuslan Bukin 	ptu_int_eq(event.variant.tsx.speculative,
176774fe6c29SRuslan Bukin 		   (flags & pt_mob_tsx_intx) != 0);
176874fe6c29SRuslan Bukin 	ptu_int_eq(event.variant.tsx.aborted,
176974fe6c29SRuslan Bukin 		   (flags & pt_mob_tsx_abrt) != 0);
177074fe6c29SRuslan Bukin 
177174fe6c29SRuslan Bukin 	if (!tsc)
177274fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 0);
177374fe6c29SRuslan Bukin 	else {
177474fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
177574fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, tsc);
177674fe6c29SRuslan Bukin 	}
177774fe6c29SRuslan Bukin 
177874fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &addr);
177974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
178074fe6c29SRuslan Bukin 	ptu_uint_eq(addr, tip.ip);
178174fe6c29SRuslan Bukin 
178274fe6c29SRuslan Bukin 	return ptu_passed();
178374fe6c29SRuslan Bukin }
178474fe6c29SRuslan Bukin 
178574fe6c29SRuslan Bukin static struct ptunit_result
event_tsx_fup_cutoff_fail(struct ptu_decoder_fixture * dfix)178674fe6c29SRuslan Bukin event_tsx_fup_cutoff_fail(struct ptu_decoder_fixture *dfix)
178774fe6c29SRuslan Bukin {
178874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
178974fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
179074fe6c29SRuslan Bukin 	struct pt_event event;
179174fe6c29SRuslan Bukin 	int errcode;
179274fe6c29SRuslan Bukin 
179374fe6c29SRuslan Bukin 	pt_encode_mode_tsx(encoder, 0);
179474fe6c29SRuslan Bukin 	pt_encode_fup(encoder, 0, pt_ipc_update_16);
179574fe6c29SRuslan Bukin 
179674fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
179774fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
179874fe6c29SRuslan Bukin 
179974fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
180074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
180174fe6c29SRuslan Bukin 
180274fe6c29SRuslan Bukin 	return ptu_passed();
180374fe6c29SRuslan Bukin }
180474fe6c29SRuslan Bukin 
180574fe6c29SRuslan Bukin static struct ptunit_result
event_tsx_cutoff_fail(struct ptu_decoder_fixture * dfix)180674fe6c29SRuslan Bukin event_tsx_cutoff_fail(struct ptu_decoder_fixture *dfix)
180774fe6c29SRuslan Bukin {
180874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
180974fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
181074fe6c29SRuslan Bukin 	struct pt_event event;
181174fe6c29SRuslan Bukin 	int errcode;
181274fe6c29SRuslan Bukin 
181374fe6c29SRuslan Bukin 	pt_encode_mode_tsx(encoder, 0);
181474fe6c29SRuslan Bukin 
181574fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
181674fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
181774fe6c29SRuslan Bukin 
181874fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
181974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
182074fe6c29SRuslan Bukin 
182174fe6c29SRuslan Bukin 	return ptu_passed();
182274fe6c29SRuslan Bukin }
182374fe6c29SRuslan Bukin 
182474fe6c29SRuslan Bukin static struct ptunit_result
event_skip_tip_fail(struct ptu_decoder_fixture * dfix)182574fe6c29SRuslan Bukin event_skip_tip_fail(struct ptu_decoder_fixture *dfix)
182674fe6c29SRuslan Bukin {
182774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
182874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
182974fe6c29SRuslan Bukin 	struct pt_event event;
183074fe6c29SRuslan Bukin 	const uint8_t *pos;
183174fe6c29SRuslan Bukin 	int errcode;
183274fe6c29SRuslan Bukin 
183374fe6c29SRuslan Bukin 	pos = encoder->pos;
183474fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0, pt_ipc_sext_48);
183574fe6c29SRuslan Bukin 	/* We omit the actual event - we don't get that far, anyway. */
183674fe6c29SRuslan Bukin 
183774fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
183874fe6c29SRuslan Bukin 
183974fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
184074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
184174fe6c29SRuslan Bukin 	ptu_ptr_eq(decoder->pos, pos);
184274fe6c29SRuslan Bukin 
184374fe6c29SRuslan Bukin 	return ptu_passed();
184474fe6c29SRuslan Bukin }
184574fe6c29SRuslan Bukin 
184674fe6c29SRuslan Bukin static struct ptunit_result
event_skip_tnt_8_fail(struct ptu_decoder_fixture * dfix)184774fe6c29SRuslan Bukin event_skip_tnt_8_fail(struct ptu_decoder_fixture *dfix)
184874fe6c29SRuslan Bukin {
184974fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
185074fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
185174fe6c29SRuslan Bukin 	struct pt_event event;
185274fe6c29SRuslan Bukin 	int errcode;
185374fe6c29SRuslan Bukin 
185474fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
185574fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
185674fe6c29SRuslan Bukin 	/* We omit the actual event - we don't get that far, anyway. */
185774fe6c29SRuslan Bukin 
185874fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
185974fe6c29SRuslan Bukin 
186074fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
186174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
186274fe6c29SRuslan Bukin 	/* The fail position depends on the fixture's header. */
186374fe6c29SRuslan Bukin 
186474fe6c29SRuslan Bukin 	return ptu_passed();
186574fe6c29SRuslan Bukin }
186674fe6c29SRuslan Bukin 
186774fe6c29SRuslan Bukin static struct ptunit_result
event_skip_tnt_64_fail(struct ptu_decoder_fixture * dfix)186874fe6c29SRuslan Bukin event_skip_tnt_64_fail(struct ptu_decoder_fixture *dfix)
186974fe6c29SRuslan Bukin {
187074fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
187174fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
187274fe6c29SRuslan Bukin 	struct pt_event event;
187374fe6c29SRuslan Bukin 	int errcode;
187474fe6c29SRuslan Bukin 
187574fe6c29SRuslan Bukin 	pt_encode_tnt_64(encoder, 0, 1);
187674fe6c29SRuslan Bukin 	pt_encode_tnt_64(encoder, 0, 1);
187774fe6c29SRuslan Bukin 	/* We omit the actual event - we don't get that far, anyway. */
187874fe6c29SRuslan Bukin 
187974fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
188074fe6c29SRuslan Bukin 
188174fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
188274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_query);
188374fe6c29SRuslan Bukin 	/* The fail position depends on the fixture's header. */
188474fe6c29SRuslan Bukin 
188574fe6c29SRuslan Bukin 	return ptu_passed();
188674fe6c29SRuslan Bukin }
188774fe6c29SRuslan Bukin 
sync_event(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc)188874fe6c29SRuslan Bukin static struct ptunit_result sync_event(struct ptu_decoder_fixture *dfix,
188974fe6c29SRuslan Bukin 				       enum pt_ip_compression ipc)
189074fe6c29SRuslan Bukin {
189174fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
189274fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
189374fe6c29SRuslan Bukin 	struct pt_packet_ip packet;
189474fe6c29SRuslan Bukin 	struct pt_event event;
189574fe6c29SRuslan Bukin 	uint64_t addr = 0ull;
189674fe6c29SRuslan Bukin 	int errcode;
189774fe6c29SRuslan Bukin 
189874fe6c29SRuslan Bukin 	packet.ipc = ipc;
189974fe6c29SRuslan Bukin 	packet.ip = 0xccull;
190074fe6c29SRuslan Bukin 
190174fe6c29SRuslan Bukin 	pt_last_ip_init(&dfix->last_ip);
190274fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &packet, &dfix->config);
190374fe6c29SRuslan Bukin 
190474fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
190574fe6c29SRuslan Bukin 	pt_encode_mode_tsx(encoder, pt_mob_tsx_intx);
190674fe6c29SRuslan Bukin 	pt_encode_fup(encoder, packet.ip, packet.ipc);
190774fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
190874fe6c29SRuslan Bukin 
190974fe6c29SRuslan Bukin 	errcode = pt_qry_sync_forward(decoder, &addr);
191074fe6c29SRuslan Bukin 	switch (ipc) {
191174fe6c29SRuslan Bukin 	case pt_ipc_suppressed:
191274fe6c29SRuslan Bukin 		ptu_int_eq(errcode, (pts_event_pending | pts_ip_suppressed));
191374fe6c29SRuslan Bukin 		break;
191474fe6c29SRuslan Bukin 
191574fe6c29SRuslan Bukin 	case pt_ipc_update_16:
191674fe6c29SRuslan Bukin 	case pt_ipc_update_32:
191774fe6c29SRuslan Bukin 	case pt_ipc_update_48:
191874fe6c29SRuslan Bukin 	case pt_ipc_sext_48:
191974fe6c29SRuslan Bukin 	case pt_ipc_full:
192074fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_event_pending);
192174fe6c29SRuslan Bukin 		ptu_uint_eq(addr, dfix->last_ip.ip);
192274fe6c29SRuslan Bukin 		break;
192374fe6c29SRuslan Bukin 	}
192474fe6c29SRuslan Bukin 
192574fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
192674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
192774fe6c29SRuslan Bukin 	ptu_uint_ne(event.status_update, 0);
192874fe6c29SRuslan Bukin 	if (ipc == pt_ipc_suppressed)
192974fe6c29SRuslan Bukin 		ptu_uint_ne(event.ip_suppressed, 0);
193074fe6c29SRuslan Bukin 	else {
193174fe6c29SRuslan Bukin 		ptu_uint_eq(event.ip_suppressed, 0);
193274fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.tsx.ip, dfix->last_ip.ip);
193374fe6c29SRuslan Bukin 	}
193474fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_tsx);
193574fe6c29SRuslan Bukin 	ptu_int_eq(event.variant.tsx.speculative, 1);
193674fe6c29SRuslan Bukin 	ptu_int_eq(event.variant.tsx.aborted, 0);
193774fe6c29SRuslan Bukin 	ptu_int_eq(event.has_tsc, 0);
193874fe6c29SRuslan Bukin 
193974fe6c29SRuslan Bukin 	return ptu_passed();
194074fe6c29SRuslan Bukin }
194174fe6c29SRuslan Bukin 
194274fe6c29SRuslan Bukin static struct ptunit_result
sync_event_cutoff_fail(struct ptu_decoder_fixture * dfix)194374fe6c29SRuslan Bukin sync_event_cutoff_fail(struct ptu_decoder_fixture *dfix)
194474fe6c29SRuslan Bukin {
194574fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
194674fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
194774fe6c29SRuslan Bukin 	uint64_t addr;
194874fe6c29SRuslan Bukin 	int errcode;
194974fe6c29SRuslan Bukin 
195074fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
195174fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
195274fe6c29SRuslan Bukin 
195374fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
195474fe6c29SRuslan Bukin 
195574fe6c29SRuslan Bukin 	errcode = pt_qry_sync_forward(decoder, &addr);
195674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
195774fe6c29SRuslan Bukin 
195874fe6c29SRuslan Bukin 	return ptu_passed();
195974fe6c29SRuslan Bukin }
196074fe6c29SRuslan Bukin 
196174fe6c29SRuslan Bukin static struct ptunit_result
sync_event_incomplete_fail(struct ptu_decoder_fixture * dfix)196274fe6c29SRuslan Bukin sync_event_incomplete_fail(struct ptu_decoder_fixture *dfix)
196374fe6c29SRuslan Bukin {
196474fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
196574fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
196674fe6c29SRuslan Bukin 	uint64_t addr;
196774fe6c29SRuslan Bukin 	int errcode;
196874fe6c29SRuslan Bukin 
196974fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
197074fe6c29SRuslan Bukin 
197174fe6c29SRuslan Bukin 	errcode = pt_qry_sync_forward(decoder, &addr);
197274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
197374fe6c29SRuslan Bukin 
197474fe6c29SRuslan Bukin 	return ptu_passed();
197574fe6c29SRuslan Bukin }
197674fe6c29SRuslan Bukin 
sync_ovf_event(struct ptu_decoder_fixture * dfix,enum pt_ip_compression ipc)197774fe6c29SRuslan Bukin static struct ptunit_result sync_ovf_event(struct ptu_decoder_fixture *dfix,
197874fe6c29SRuslan Bukin 					   enum pt_ip_compression ipc)
197974fe6c29SRuslan Bukin {
198074fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
198174fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
198274fe6c29SRuslan Bukin 	struct pt_packet_ip fup, ovf;
198374fe6c29SRuslan Bukin 	struct pt_event event;
198474fe6c29SRuslan Bukin 	uint64_t addr = 0;
198574fe6c29SRuslan Bukin 	int errcode;
198674fe6c29SRuslan Bukin 
198774fe6c29SRuslan Bukin 	fup.ipc = pt_ipc_sext_48;
198874fe6c29SRuslan Bukin 	fup.ip = pt_dfix_max_ip;
198974fe6c29SRuslan Bukin 
199074fe6c29SRuslan Bukin 	ovf.ipc = ipc;
199174fe6c29SRuslan Bukin 	ovf.ip = 0xccull;
199274fe6c29SRuslan Bukin 
199374fe6c29SRuslan Bukin 	pt_last_ip_init(&dfix->last_ip);
199474fe6c29SRuslan Bukin 	pt_last_ip_update_ip(&dfix->last_ip, &ovf, &dfix->config);
199574fe6c29SRuslan Bukin 
199674fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
199774fe6c29SRuslan Bukin 	pt_encode_fup(encoder, fup.ip, fup.ipc);
199874fe6c29SRuslan Bukin 	pt_encode_mode_tsx(encoder, 0);
199974fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0x1000);
200074fe6c29SRuslan Bukin 	pt_encode_ovf(encoder);
200174fe6c29SRuslan Bukin 	pt_encode_fup(encoder, ovf.ip, ovf.ipc);
200274fe6c29SRuslan Bukin 
200374fe6c29SRuslan Bukin 	errcode = pt_qry_sync_forward(decoder, &addr);
200474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_event_pending);
200574fe6c29SRuslan Bukin 	ptu_uint_eq(addr, fup.ip);
200674fe6c29SRuslan Bukin 
200774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
200874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_event_pending);
200974fe6c29SRuslan Bukin 	ptu_uint_ne(event.status_update, 0);
201074fe6c29SRuslan Bukin 	ptu_int_eq(event.type, ptev_tsx);
201174fe6c29SRuslan Bukin 	ptu_int_eq(event.variant.tsx.speculative, 0);
201274fe6c29SRuslan Bukin 	ptu_int_eq(event.variant.tsx.aborted, 0);
201374fe6c29SRuslan Bukin 	ptu_uint_eq(event.variant.tsx.ip, fup.ip);
201474fe6c29SRuslan Bukin 	ptu_int_eq(event.has_tsc, 1);
201574fe6c29SRuslan Bukin 	ptu_uint_eq(event.tsc, 0x1000);
201674fe6c29SRuslan Bukin 
201774fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
201874fe6c29SRuslan Bukin 	switch (ipc) {
201974fe6c29SRuslan Bukin 	case pt_ipc_suppressed:
202074fe6c29SRuslan Bukin 		ptu_int_eq(errcode, -pte_noip);
202174fe6c29SRuslan Bukin 		return ptu_passed();
202274fe6c29SRuslan Bukin 
202374fe6c29SRuslan Bukin 	case pt_ipc_update_16:
202474fe6c29SRuslan Bukin 	case pt_ipc_update_32:
202574fe6c29SRuslan Bukin 	case pt_ipc_update_48:
202674fe6c29SRuslan Bukin 	case pt_ipc_sext_48:
202774fe6c29SRuslan Bukin 	case pt_ipc_full:
202874fe6c29SRuslan Bukin 		ptu_int_eq(errcode, pts_eos);
202974fe6c29SRuslan Bukin 		ptu_int_eq(event.type, ptev_overflow);
203074fe6c29SRuslan Bukin 		ptu_uint_eq(event.variant.overflow.ip, dfix->last_ip.ip);
203174fe6c29SRuslan Bukin 		ptu_int_eq(event.has_tsc, 1);
203274fe6c29SRuslan Bukin 		ptu_uint_eq(event.tsc, 0x1000);
203374fe6c29SRuslan Bukin 		break;
203474fe6c29SRuslan Bukin 	}
203574fe6c29SRuslan Bukin 
203674fe6c29SRuslan Bukin 	return ptu_passed();
203774fe6c29SRuslan Bukin }
203874fe6c29SRuslan Bukin 
203974fe6c29SRuslan Bukin static struct ptunit_result
sync_ovf_event_cutoff_fail(struct ptu_decoder_fixture * dfix)204074fe6c29SRuslan Bukin sync_ovf_event_cutoff_fail(struct ptu_decoder_fixture *dfix)
204174fe6c29SRuslan Bukin {
204274fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
204374fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
204474fe6c29SRuslan Bukin 	uint64_t addr;
204574fe6c29SRuslan Bukin 	int errcode;
204674fe6c29SRuslan Bukin 
204774fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
204874fe6c29SRuslan Bukin 	pt_encode_ovf(encoder);
204974fe6c29SRuslan Bukin 
205074fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
205174fe6c29SRuslan Bukin 
205274fe6c29SRuslan Bukin 	errcode = pt_qry_sync_forward(decoder, &addr);
205374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
205474fe6c29SRuslan Bukin 
205574fe6c29SRuslan Bukin 	return ptu_passed();
205674fe6c29SRuslan Bukin }
205774fe6c29SRuslan Bukin 
time_null_fail(struct ptu_decoder_fixture * dfix)205874fe6c29SRuslan Bukin static struct ptunit_result time_null_fail(struct ptu_decoder_fixture *dfix)
205974fe6c29SRuslan Bukin {
206074fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
206174fe6c29SRuslan Bukin 	uint64_t tsc;
206274fe6c29SRuslan Bukin 	int errcode;
206374fe6c29SRuslan Bukin 
206474fe6c29SRuslan Bukin 	errcode = pt_qry_time(NULL, NULL, NULL, NULL);
206574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
206674fe6c29SRuslan Bukin 
206774fe6c29SRuslan Bukin 	errcode = pt_qry_time(decoder, NULL, NULL, NULL);
206874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
206974fe6c29SRuslan Bukin 
207074fe6c29SRuslan Bukin 	errcode = pt_qry_time(NULL, &tsc, NULL, NULL);
207174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
207274fe6c29SRuslan Bukin 
207374fe6c29SRuslan Bukin 	return ptu_passed();
207474fe6c29SRuslan Bukin }
207574fe6c29SRuslan Bukin 
time_initial(struct ptu_decoder_fixture * dfix)207674fe6c29SRuslan Bukin static struct ptunit_result time_initial(struct ptu_decoder_fixture *dfix)
207774fe6c29SRuslan Bukin {
207874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
207974fe6c29SRuslan Bukin 	uint64_t tsc;
208074fe6c29SRuslan Bukin 	int errcode;
208174fe6c29SRuslan Bukin 
208274fe6c29SRuslan Bukin 	errcode = pt_qry_time(decoder, &tsc, NULL, NULL);
208374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_no_time);
208474fe6c29SRuslan Bukin 
208574fe6c29SRuslan Bukin 	return ptu_passed();
208674fe6c29SRuslan Bukin }
208774fe6c29SRuslan Bukin 
time(struct ptu_decoder_fixture * dfix)208874fe6c29SRuslan Bukin static struct ptunit_result time(struct ptu_decoder_fixture *dfix)
208974fe6c29SRuslan Bukin {
209074fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
209174fe6c29SRuslan Bukin 	uint64_t tsc, exp;
209274fe6c29SRuslan Bukin 	int errcode;
209374fe6c29SRuslan Bukin 
209474fe6c29SRuslan Bukin 	exp = 0x11223344556677ull;
209574fe6c29SRuslan Bukin 
209674fe6c29SRuslan Bukin 	decoder->last_time.have_tsc = 1;
209774fe6c29SRuslan Bukin 	decoder->last_time.tsc = exp;
209874fe6c29SRuslan Bukin 
209974fe6c29SRuslan Bukin 	errcode = pt_qry_time(decoder, &tsc, NULL, NULL);
210074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
210174fe6c29SRuslan Bukin 	ptu_uint_eq(tsc, exp);
210274fe6c29SRuslan Bukin 
210374fe6c29SRuslan Bukin 	return ptu_passed();
210474fe6c29SRuslan Bukin }
210574fe6c29SRuslan Bukin 
cbr_null(struct ptu_decoder_fixture * dfix)210674fe6c29SRuslan Bukin static struct ptunit_result cbr_null(struct ptu_decoder_fixture *dfix)
210774fe6c29SRuslan Bukin {
210874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
210974fe6c29SRuslan Bukin 	uint32_t cbr;
211074fe6c29SRuslan Bukin 	int errcode;
211174fe6c29SRuslan Bukin 
211274fe6c29SRuslan Bukin 	errcode = pt_qry_core_bus_ratio(NULL, NULL);
211374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
211474fe6c29SRuslan Bukin 
211574fe6c29SRuslan Bukin 	errcode = pt_qry_core_bus_ratio(decoder, NULL);
211674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
211774fe6c29SRuslan Bukin 
211874fe6c29SRuslan Bukin 	errcode = pt_qry_core_bus_ratio(NULL, &cbr);
211974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
212074fe6c29SRuslan Bukin 
212174fe6c29SRuslan Bukin 	return ptu_passed();
212274fe6c29SRuslan Bukin }
212374fe6c29SRuslan Bukin 
cbr_initial(struct ptu_decoder_fixture * dfix)212474fe6c29SRuslan Bukin static struct ptunit_result cbr_initial(struct ptu_decoder_fixture *dfix)
212574fe6c29SRuslan Bukin {
212674fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
212774fe6c29SRuslan Bukin 	uint32_t cbr;
212874fe6c29SRuslan Bukin 	int errcode;
212974fe6c29SRuslan Bukin 
213074fe6c29SRuslan Bukin 	errcode = pt_qry_core_bus_ratio(decoder, &cbr);
213174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_no_cbr);
213274fe6c29SRuslan Bukin 
213374fe6c29SRuslan Bukin 	return ptu_passed();
213474fe6c29SRuslan Bukin }
213574fe6c29SRuslan Bukin 
cbr(struct ptu_decoder_fixture * dfix)213674fe6c29SRuslan Bukin static struct ptunit_result cbr(struct ptu_decoder_fixture *dfix)
213774fe6c29SRuslan Bukin {
213874fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
213974fe6c29SRuslan Bukin 	uint32_t cbr;
214074fe6c29SRuslan Bukin 	int errcode;
214174fe6c29SRuslan Bukin 
214274fe6c29SRuslan Bukin 	decoder->last_time.have_cbr = 1;
214374fe6c29SRuslan Bukin 	decoder->last_time.cbr = 42;
214474fe6c29SRuslan Bukin 
214574fe6c29SRuslan Bukin 	errcode = pt_qry_core_bus_ratio(decoder, &cbr);
214674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
214774fe6c29SRuslan Bukin 	ptu_uint_eq(cbr, 42);
214874fe6c29SRuslan Bukin 
214974fe6c29SRuslan Bukin 	return ptu_passed();
215074fe6c29SRuslan Bukin }
215174fe6c29SRuslan Bukin 
215274fe6c29SRuslan Bukin /* Test that end-of-stream is indicated correctly when the stream ends with a
215374fe6c29SRuslan Bukin  * partial non-query-relevant packet.
215474fe6c29SRuslan Bukin  */
indir_cyc_cutoff(struct ptu_decoder_fixture * dfix)215574fe6c29SRuslan Bukin static struct ptunit_result indir_cyc_cutoff(struct ptu_decoder_fixture *dfix)
215674fe6c29SRuslan Bukin {
215774fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
215874fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
215974fe6c29SRuslan Bukin 	uint64_t ip;
216074fe6c29SRuslan Bukin 	int errcode;
216174fe6c29SRuslan Bukin 
216274fe6c29SRuslan Bukin 	pt_encode_tip(encoder, 0xa000ull, pt_ipc_full);
216374fe6c29SRuslan Bukin 	pt_encode_cyc(encoder, 0xfff);
216474fe6c29SRuslan Bukin 
216574fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
216674fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
216774fe6c29SRuslan Bukin 
216874fe6c29SRuslan Bukin 	errcode = pt_qry_indirect_branch(decoder, &ip);
216974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
217074fe6c29SRuslan Bukin 
217174fe6c29SRuslan Bukin 	return ptu_passed();
217274fe6c29SRuslan Bukin }
217374fe6c29SRuslan Bukin 
217474fe6c29SRuslan Bukin /* Test that end-of-stream is indicated correctly when the stream ends with a
217574fe6c29SRuslan Bukin  * partial non-query-relevant packet.
217674fe6c29SRuslan Bukin  */
cond_cyc_cutoff(struct ptu_decoder_fixture * dfix)217774fe6c29SRuslan Bukin static struct ptunit_result cond_cyc_cutoff(struct ptu_decoder_fixture *dfix)
217874fe6c29SRuslan Bukin {
217974fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
218074fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
218174fe6c29SRuslan Bukin 	int errcode, taken;
218274fe6c29SRuslan Bukin 
218374fe6c29SRuslan Bukin 	pt_encode_tnt_8(encoder, 0, 1);
218474fe6c29SRuslan Bukin 	pt_encode_cyc(encoder, 0xfff);
218574fe6c29SRuslan Bukin 
218674fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
218774fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
218874fe6c29SRuslan Bukin 
218974fe6c29SRuslan Bukin 	errcode = pt_qry_cond_branch(decoder, &taken);
219074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
219174fe6c29SRuslan Bukin 
219274fe6c29SRuslan Bukin 	return ptu_passed();
219374fe6c29SRuslan Bukin }
219474fe6c29SRuslan Bukin 
219574fe6c29SRuslan Bukin /* Test that end-of-stream is indicated correctly when the stream ends with a
219674fe6c29SRuslan Bukin  * partial non-query-relevant packet.
219774fe6c29SRuslan Bukin  */
event_cyc_cutoff(struct ptu_decoder_fixture * dfix)219874fe6c29SRuslan Bukin static struct ptunit_result event_cyc_cutoff(struct ptu_decoder_fixture *dfix)
219974fe6c29SRuslan Bukin {
220074fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
220174fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
220274fe6c29SRuslan Bukin 	struct pt_event event;
220374fe6c29SRuslan Bukin 	int errcode;
220474fe6c29SRuslan Bukin 
220574fe6c29SRuslan Bukin 	pt_encode_tip_pgd(encoder, 0ull, pt_ipc_full);
220674fe6c29SRuslan Bukin 	pt_encode_cyc(encoder, 0xffff);
220774fe6c29SRuslan Bukin 
220874fe6c29SRuslan Bukin 	ptu_check(cutoff, decoder, encoder);
220974fe6c29SRuslan Bukin 	ptu_check(ptu_sync_decoder, decoder);
221074fe6c29SRuslan Bukin 
221174fe6c29SRuslan Bukin 	errcode = pt_qry_event(decoder, &event, sizeof(event));
221274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, pts_eos);
221374fe6c29SRuslan Bukin 
221474fe6c29SRuslan Bukin 	return ptu_passed();
221574fe6c29SRuslan Bukin }
221674fe6c29SRuslan Bukin 
ptu_dfix_init(struct ptu_decoder_fixture * dfix)221774fe6c29SRuslan Bukin static struct ptunit_result ptu_dfix_init(struct ptu_decoder_fixture *dfix)
221874fe6c29SRuslan Bukin {
221974fe6c29SRuslan Bukin 	struct pt_config *config = &dfix->config;
222074fe6c29SRuslan Bukin 	int errcode;
222174fe6c29SRuslan Bukin 
222274fe6c29SRuslan Bukin 	(void) memset(dfix->buffer, 0, sizeof(dfix->buffer));
222374fe6c29SRuslan Bukin 
222474fe6c29SRuslan Bukin 	pt_config_init(config);
222574fe6c29SRuslan Bukin 
222674fe6c29SRuslan Bukin 	config->begin = dfix->buffer;
222774fe6c29SRuslan Bukin 	config->end = dfix->buffer + sizeof(dfix->buffer);
222874fe6c29SRuslan Bukin 
222974fe6c29SRuslan Bukin 	errcode = pt_encoder_init(&dfix->encoder, config);
223074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
223174fe6c29SRuslan Bukin 
223274fe6c29SRuslan Bukin 	errcode = pt_qry_decoder_init(&dfix->decoder, config);
223374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
223474fe6c29SRuslan Bukin 
223574fe6c29SRuslan Bukin 	dfix->decoder.ip.ip = pt_dfix_bad_ip;
223674fe6c29SRuslan Bukin 	dfix->decoder.ip.have_ip = 1;
223774fe6c29SRuslan Bukin 	dfix->decoder.ip.suppressed = 0;
223874fe6c29SRuslan Bukin 
223974fe6c29SRuslan Bukin 	dfix->last_ip = dfix->decoder.ip;
224074fe6c29SRuslan Bukin 
224174fe6c29SRuslan Bukin 	if (dfix->header)
224274fe6c29SRuslan Bukin 		dfix->header(dfix);
224374fe6c29SRuslan Bukin 
224474fe6c29SRuslan Bukin 	return ptu_passed();
224574fe6c29SRuslan Bukin }
224674fe6c29SRuslan Bukin 
ptu_dfix_fini(struct ptu_decoder_fixture * dfix)224774fe6c29SRuslan Bukin static struct ptunit_result ptu_dfix_fini(struct ptu_decoder_fixture *dfix)
224874fe6c29SRuslan Bukin {
224974fe6c29SRuslan Bukin 	pt_qry_decoder_fini(&dfix->decoder);
225074fe6c29SRuslan Bukin 	pt_encoder_fini(&dfix->encoder);
225174fe6c29SRuslan Bukin 
225274fe6c29SRuslan Bukin 	return ptu_passed();
225374fe6c29SRuslan Bukin }
225474fe6c29SRuslan Bukin 
225574fe6c29SRuslan Bukin /* Synchronize the decoder at the beginnig of an empty buffer. */
225674fe6c29SRuslan Bukin static struct ptunit_result
ptu_dfix_header_sync(struct ptu_decoder_fixture * dfix)225774fe6c29SRuslan Bukin ptu_dfix_header_sync(struct ptu_decoder_fixture *dfix)
225874fe6c29SRuslan Bukin {
225974fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
226074fe6c29SRuslan Bukin 
226174fe6c29SRuslan Bukin 	/* Synchronize the decoder at the beginning of the buffer. */
226274fe6c29SRuslan Bukin 	decoder->pos = decoder->config.begin;
226374fe6c29SRuslan Bukin 
226474fe6c29SRuslan Bukin 	return ptu_passed();
226574fe6c29SRuslan Bukin }
226674fe6c29SRuslan Bukin 
226774fe6c29SRuslan Bukin /* Synchronize the decoder at the beginnig of a buffer containing packets that
226874fe6c29SRuslan Bukin  * should be skipped for unconditional indirect branch queries.
226974fe6c29SRuslan Bukin  */
227074fe6c29SRuslan Bukin static struct ptunit_result
ptu_dfix_header_indir(struct ptu_decoder_fixture * dfix)227174fe6c29SRuslan Bukin ptu_dfix_header_indir(struct ptu_decoder_fixture *dfix)
227274fe6c29SRuslan Bukin {
227374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
227474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
227574fe6c29SRuslan Bukin 
227674fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
227774fe6c29SRuslan Bukin 	pt_encode_mtc(encoder, 1);
227874fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
227974fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0);
228074fe6c29SRuslan Bukin 
228174fe6c29SRuslan Bukin 	/* Synchronize the decoder at the beginning of the buffer. */
228274fe6c29SRuslan Bukin 	decoder->pos = decoder->config.begin;
228374fe6c29SRuslan Bukin 
228474fe6c29SRuslan Bukin 	return ptu_passed();
228574fe6c29SRuslan Bukin }
228674fe6c29SRuslan Bukin 
228774fe6c29SRuslan Bukin /* Synchronize the decoder at the beginnig of a buffer containing packets that
228874fe6c29SRuslan Bukin  * should be skipped for unconditional indirect branch queries including a PSB.
228974fe6c29SRuslan Bukin  */
229074fe6c29SRuslan Bukin static struct ptunit_result
ptu_dfix_header_indir_psb(struct ptu_decoder_fixture * dfix)229174fe6c29SRuslan Bukin ptu_dfix_header_indir_psb(struct ptu_decoder_fixture *dfix)
229274fe6c29SRuslan Bukin {
229374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
229474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
229574fe6c29SRuslan Bukin 
229674fe6c29SRuslan Bukin 	/* The psb must be empty since the tests won't skip status events.
229774fe6c29SRuslan Bukin 	 * On the other hand, we do need to provide an address since tests
229874fe6c29SRuslan Bukin 	 * may want to update last-ip, which requires a last-ip, of course.
229974fe6c29SRuslan Bukin 	 */
230074fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
230174fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0);
230274fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
230374fe6c29SRuslan Bukin 	pt_encode_mtc(encoder, 1);
230474fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
230574fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0);
230674fe6c29SRuslan Bukin 	pt_encode_fup(encoder, pt_dfix_sext_ip, pt_ipc_sext_48);
230774fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
230874fe6c29SRuslan Bukin 	pt_encode_mtc(encoder, 1);
230974fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
231074fe6c29SRuslan Bukin 
231174fe6c29SRuslan Bukin 	/* Synchronize the decoder at the beginning of the buffer. */
231274fe6c29SRuslan Bukin 	decoder->pos = decoder->config.begin;
231374fe6c29SRuslan Bukin 
231474fe6c29SRuslan Bukin 	return ptu_passed();
231574fe6c29SRuslan Bukin }
231674fe6c29SRuslan Bukin 
231774fe6c29SRuslan Bukin /* Synchronize the decoder at the beginnig of a buffer containing packets that
231874fe6c29SRuslan Bukin  * should be skipped for conditional branch queries.
231974fe6c29SRuslan Bukin  */
232074fe6c29SRuslan Bukin static struct ptunit_result
ptu_dfix_header_cond(struct ptu_decoder_fixture * dfix)232174fe6c29SRuslan Bukin ptu_dfix_header_cond(struct ptu_decoder_fixture *dfix)
232274fe6c29SRuslan Bukin {
232374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
232474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
232574fe6c29SRuslan Bukin 
232674fe6c29SRuslan Bukin 	/* The psb must be empty since the tests won't skip status events.
232774fe6c29SRuslan Bukin 	 * On the other hand, we do need to provide an address since tests
232874fe6c29SRuslan Bukin 	 * may want to update last-ip, which requires a last-ip, of course.
232974fe6c29SRuslan Bukin 	 */
233074fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
233174fe6c29SRuslan Bukin 	pt_encode_mtc(encoder, 1);
233274fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
233374fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0);
233474fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
233574fe6c29SRuslan Bukin 	pt_encode_fup(encoder, pt_dfix_sext_ip, pt_ipc_sext_48);
233674fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
233774fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
233874fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0);
233974fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
234074fe6c29SRuslan Bukin 
234174fe6c29SRuslan Bukin 	/* Synchronize the decoder at the beginning of the buffer. */
234274fe6c29SRuslan Bukin 	decoder->pos = decoder->config.begin;
234374fe6c29SRuslan Bukin 
234474fe6c29SRuslan Bukin 	return ptu_passed();
234574fe6c29SRuslan Bukin }
234674fe6c29SRuslan Bukin 
234774fe6c29SRuslan Bukin /* Synchronize the decoder at the beginnig of a buffer containing packets that
234874fe6c29SRuslan Bukin  * should be skipped for event queries.
234974fe6c29SRuslan Bukin  */
235074fe6c29SRuslan Bukin static struct ptunit_result
ptu_dfix_header_event(struct ptu_decoder_fixture * dfix)235174fe6c29SRuslan Bukin ptu_dfix_header_event(struct ptu_decoder_fixture *dfix)
235274fe6c29SRuslan Bukin {
235374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
235474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
235574fe6c29SRuslan Bukin 
235674fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
235774fe6c29SRuslan Bukin 	pt_encode_mtc(encoder, 1);
235874fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
235974fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0x1000);
236074fe6c29SRuslan Bukin 
236174fe6c29SRuslan Bukin 	/* Synchronize the decoder at the beginning of the buffer. */
236274fe6c29SRuslan Bukin 	decoder->pos = decoder->config.begin;
236374fe6c29SRuslan Bukin 
236474fe6c29SRuslan Bukin 	return ptu_passed();
236574fe6c29SRuslan Bukin }
236674fe6c29SRuslan Bukin 
236774fe6c29SRuslan Bukin /* Synchronize the decoder at the beginnig of a buffer containing packets that
236874fe6c29SRuslan Bukin  * should be skipped for event queries including a PSB.
236974fe6c29SRuslan Bukin  */
237074fe6c29SRuslan Bukin static struct ptunit_result
ptu_dfix_header_event_psb(struct ptu_decoder_fixture * dfix)237174fe6c29SRuslan Bukin ptu_dfix_header_event_psb(struct ptu_decoder_fixture *dfix)
237274fe6c29SRuslan Bukin {
237374fe6c29SRuslan Bukin 	struct pt_query_decoder *decoder = &dfix->decoder;
237474fe6c29SRuslan Bukin 	struct pt_encoder *encoder = &dfix->encoder;
237574fe6c29SRuslan Bukin 
237674fe6c29SRuslan Bukin 	/* The psb must be empty since the tests won't skip status events.
237774fe6c29SRuslan Bukin 	 * On the other hand, we do need to provide an address since tests
237874fe6c29SRuslan Bukin 	 * may want to update last-ip, which requires a last-ip, of course.
237974fe6c29SRuslan Bukin 	 */
238074fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
238174fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0);
238274fe6c29SRuslan Bukin 	pt_encode_psb(encoder);
238374fe6c29SRuslan Bukin 	pt_encode_mtc(encoder, 1);
238474fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
238574fe6c29SRuslan Bukin 	pt_encode_tsc(encoder, 0x1000);
238674fe6c29SRuslan Bukin 	pt_encode_fup(encoder, pt_dfix_sext_ip, pt_ipc_sext_48);
238774fe6c29SRuslan Bukin 	pt_encode_psbend(encoder);
238874fe6c29SRuslan Bukin 	pt_encode_mtc(encoder, 1);
238974fe6c29SRuslan Bukin 	pt_encode_pad(encoder);
239074fe6c29SRuslan Bukin 
239174fe6c29SRuslan Bukin 	/* Synchronize the decoder at the beginning of the buffer. */
239274fe6c29SRuslan Bukin 	decoder->pos = decoder->config.begin;
239374fe6c29SRuslan Bukin 
239474fe6c29SRuslan Bukin 	return ptu_passed();
239574fe6c29SRuslan Bukin }
239674fe6c29SRuslan Bukin 
239774fe6c29SRuslan Bukin static struct ptu_decoder_fixture dfix_raw;
239874fe6c29SRuslan Bukin static struct ptu_decoder_fixture dfix_empty;
239974fe6c29SRuslan Bukin static struct ptu_decoder_fixture dfix_indir;
240074fe6c29SRuslan Bukin static struct ptu_decoder_fixture dfix_indir_psb;
240174fe6c29SRuslan Bukin static struct ptu_decoder_fixture dfix_cond;
240274fe6c29SRuslan Bukin static struct ptu_decoder_fixture dfix_event;
240374fe6c29SRuslan Bukin static struct ptu_decoder_fixture dfix_event_psb;
240474fe6c29SRuslan Bukin 
init_fixtures(void)240574fe6c29SRuslan Bukin static void init_fixtures(void)
240674fe6c29SRuslan Bukin {
240774fe6c29SRuslan Bukin 	dfix_raw.init = ptu_dfix_init;
240874fe6c29SRuslan Bukin 	dfix_raw.fini = ptu_dfix_fini;
240974fe6c29SRuslan Bukin 
241074fe6c29SRuslan Bukin 	dfix_empty = dfix_raw;
241174fe6c29SRuslan Bukin 	dfix_empty.header = ptu_dfix_header_sync;
241274fe6c29SRuslan Bukin 
241374fe6c29SRuslan Bukin 	dfix_indir = dfix_raw;
241474fe6c29SRuslan Bukin 	dfix_indir.header = ptu_dfix_header_indir;
241574fe6c29SRuslan Bukin 
241674fe6c29SRuslan Bukin 	dfix_indir_psb = dfix_raw;
241774fe6c29SRuslan Bukin 	dfix_indir_psb.header = ptu_dfix_header_indir_psb;
241874fe6c29SRuslan Bukin 
241974fe6c29SRuslan Bukin 	dfix_cond = dfix_raw;
242074fe6c29SRuslan Bukin 	dfix_cond.header = ptu_dfix_header_cond;
242174fe6c29SRuslan Bukin 
242274fe6c29SRuslan Bukin 	dfix_event = dfix_raw;
242374fe6c29SRuslan Bukin 	dfix_event.header = ptu_dfix_header_event;
242474fe6c29SRuslan Bukin 
242574fe6c29SRuslan Bukin 	dfix_event_psb = dfix_raw;
242674fe6c29SRuslan Bukin 	dfix_event_psb.header = ptu_dfix_header_event_psb;
242774fe6c29SRuslan Bukin }
242874fe6c29SRuslan Bukin 
main(int argc,char ** argv)242974fe6c29SRuslan Bukin int main(int argc, char **argv)
243074fe6c29SRuslan Bukin {
243174fe6c29SRuslan Bukin 	struct ptunit_suite suite;
243274fe6c29SRuslan Bukin 
243374fe6c29SRuslan Bukin 	init_fixtures();
243474fe6c29SRuslan Bukin 
243574fe6c29SRuslan Bukin 	suite = ptunit_mk_suite(argc, argv);
243674fe6c29SRuslan Bukin 
243774fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_not_synced, dfix_raw);
243874fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_not_synced, dfix_raw);
243974fe6c29SRuslan Bukin 	ptu_run_f(suite, event_not_synced, dfix_raw);
244074fe6c29SRuslan Bukin 
244174fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_backward, dfix_raw);
244274fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_backward_empty_end, dfix_raw);
244374fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_backward_empty_mid, dfix_raw);
244474fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_backward_empty_begin, dfix_raw);
244574fe6c29SRuslan Bukin 	ptu_run_f(suite, decode_sync_backward, dfix_raw);
244674fe6c29SRuslan Bukin 
244774fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_null, dfix_empty);
244874fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_empty, dfix_empty);
244974fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_suppressed);
245074fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_update_16);
245174fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_update_32);
245274fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_update_48);
245374fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_sext_48);
245474fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_empty, pt_ipc_full);
245574fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_suppressed);
245674fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_update_16);
245774fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_update_32);
245874fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_update_48);
245974fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_sext_48);
246074fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_empty, pt_ipc_full);
246174fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_cutoff_fail, dfix_empty);
246274fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tnt_fail, dfix_empty);
246374fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tip_pge_fail, dfix_empty);
246474fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tip_pgd_fail, dfix_empty);
246574fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_fup_tip_fail, dfix_empty);
246674fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_fup_tip_pgd_fail, dfix_empty);
246774fe6c29SRuslan Bukin 
246874fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_suppressed);
246974fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_update_16);
247074fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_update_32);
247174fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_update_48);
247274fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_sext_48);
247374fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir, pt_ipc_full);
247474fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_suppressed);
247574fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_update_16);
247674fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_update_32);
247774fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_update_48);
247874fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_sext_48);
247974fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir, pt_ipc_full);
248074fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_cutoff_fail, dfix_indir);
248174fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tnt_fail, dfix_indir);
248274fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tip_pge_fail, dfix_indir);
248374fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tip_pgd_fail, dfix_indir);
248474fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_fup_tip_fail, dfix_indir);
248574fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_fup_tip_pgd_fail, dfix_indir);
248674fe6c29SRuslan Bukin 
248774fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir_psb, pt_ipc_suppressed);
248874fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir_psb, pt_ipc_sext_48);
248974fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir, dfix_indir_psb, pt_ipc_full);
249074fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir_psb, pt_ipc_suppressed);
249174fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir_psb, pt_ipc_sext_48);
249274fe6c29SRuslan Bukin 	ptu_run_fp(suite, indir_tnt, dfix_indir_psb, pt_ipc_full);
249374fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_cutoff_fail, dfix_indir_psb);
249474fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tnt_fail, dfix_indir_psb);
249574fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tip_pge_fail, dfix_indir_psb);
249674fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_tip_pgd_fail, dfix_indir_psb);
249774fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_fup_tip_fail, dfix_indir_psb);
249874fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_skip_fup_tip_pgd_fail, dfix_indir_psb);
249974fe6c29SRuslan Bukin 
250074fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_null, dfix_empty);
250174fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_empty, dfix_empty);
250274fe6c29SRuslan Bukin 	ptu_run_f(suite, cond, dfix_empty);
250374fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_tip_fail, dfix_empty);
250474fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_tip_pge_fail, dfix_empty);
250574fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_tip_pgd_fail, dfix_empty);
250674fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_fup_tip_fail, dfix_empty);
250774fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_fup_tip_pgd_fail, dfix_empty);
250874fe6c29SRuslan Bukin 
250974fe6c29SRuslan Bukin 	ptu_run_f(suite, cond, dfix_cond);
251074fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_tip_fail, dfix_cond);
251174fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_tip_pge_fail, dfix_cond);
251274fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_tip_pgd_fail, dfix_cond);
251374fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_fup_tip_fail, dfix_cond);
251474fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_skip_fup_tip_pgd_fail, dfix_cond);
251574fe6c29SRuslan Bukin 
251674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_null, dfix_empty);
251774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_bad_size, dfix_empty);
251874fe6c29SRuslan Bukin 	ptu_run_f(suite, event_small_size, dfix_empty);
251974fe6c29SRuslan Bukin 	ptu_run_f(suite, event_big_size, dfix_empty);
252074fe6c29SRuslan Bukin 	ptu_run_f(suite, event_empty, dfix_empty);
252174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_suppressed, 0);
252274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_update_16, 0);
252374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_update_32, 0);
252474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_update_48, 0);
252574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_sext_48, 0);
252674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_empty, pt_ipc_full, 0);
252774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_enabled_cutoff_fail, dfix_empty);
252874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_suppressed, 0);
252974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_update_16, 0);
253074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_update_32, 0);
253174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_update_48, 0);
253274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_sext_48, 0);
253374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_empty, pt_ipc_full, 0);
253474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_disabled_cutoff_fail, dfix_empty);
253574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_suppressed,
253674fe6c29SRuslan Bukin 		   0);
253774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_update_16,
253874fe6c29SRuslan Bukin 		   0);
253974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_update_32,
254074fe6c29SRuslan Bukin 		   0);
254174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_update_48,
254274fe6c29SRuslan Bukin 		   0);
254374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_sext_48, 0);
254474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_empty, pt_ipc_full, 0);
254574fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_suppressed_fail, dfix_empty);
254674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_cutoff_fail_a, dfix_empty);
254774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_cutoff_fail_b, dfix_empty);
254874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_suppressed, 0);
254974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_update_16, 0);
255074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_update_32, 0);
255174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_update_48, 0);
255274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_sext_48, 0);
255374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_empty, pt_ipc_full, 0);
255474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_suppressed_fail, dfix_empty);
255574fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_cutoff_fail_a, dfix_empty);
255674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_cutoff_fail_b, dfix_empty);
255774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_paging, dfix_empty, 0, 0);
255874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_paging, dfix_empty, pt_pl_pip_nr, 0);
255974fe6c29SRuslan Bukin 	ptu_run_f(suite, event_paging_cutoff_fail, dfix_empty);
256074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging, dfix_empty, 0, 0);
256174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging, dfix_empty, pt_pl_pip_nr, 0);
256274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging_suppressed, dfix_empty, 0, 0);
256374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging_suppressed, dfix_empty,
256474fe6c29SRuslan Bukin 		   pt_pl_pip_nr, 0);
256574fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_paging_cutoff_fail, dfix_empty);
256674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_suppressed, 0);
256774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_update_16, 0);
256874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_update_32, 0);
256974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_update_48, 0);
257074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_sext_48, 0);
257174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_empty, pt_ipc_full, 0);
257274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty,
257374fe6c29SRuslan Bukin 		   pt_ipc_suppressed, 0);
257474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_update_16,
257574fe6c29SRuslan Bukin 		   0);
257674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_update_32,
257774fe6c29SRuslan Bukin 		   0);
257874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_update_48,
257974fe6c29SRuslan Bukin 		   0);
258074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_sext_48,
258174fe6c29SRuslan Bukin 		   0);
258274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_empty, pt_ipc_full,
258374fe6c29SRuslan Bukin 		   0);
258474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_overflow_cutoff_fail, dfix_empty);
258574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_stop, dfix_empty, 0);
258674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_suppressed,
258774fe6c29SRuslan Bukin 		   0);
258874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_update_16, 0);
258974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_update_32, 0);
259074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_update_48, 0);
259174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_sext_48, 0);
259274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_empty, pt_ipc_full, 0);
259374fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_tip_cutoff_fail, dfix_empty);
259474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty,
259574fe6c29SRuslan Bukin 		   pt_ipc_suppressed, 0);
259674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty,
259774fe6c29SRuslan Bukin 		   pt_ipc_update_16, 0);
259874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty,
259974fe6c29SRuslan Bukin 		   pt_ipc_update_32, 0);
260074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty,
260174fe6c29SRuslan Bukin 		   pt_ipc_update_48, 0);
260274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty, pt_ipc_sext_48,
260374fe6c29SRuslan Bukin 		   0);
260474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_empty, pt_ipc_full,
260574fe6c29SRuslan Bukin 		   0);
260674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_tip_pge_cutoff_fail, dfix_empty);
260774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_cutoff_fail, dfix_empty);
260874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_suppressed,
260974fe6c29SRuslan Bukin 		   pt_mob_tsx_intx, 0);
261074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_update_16, 0, 0);
261174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_update_32,
261274fe6c29SRuslan Bukin 		   pt_mob_tsx_intx, 0);
261374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_update_48,
261474fe6c29SRuslan Bukin 		   pt_mob_tsx_intx, 0);
261574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_sext_48, 0, 0);
261674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_empty, pt_ipc_full, 0, 0);
261774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_tsx_fup_cutoff_fail, dfix_empty);
261874fe6c29SRuslan Bukin 	ptu_run_f(suite, event_tsx_cutoff_fail, dfix_empty);
261974fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tip_fail, dfix_empty);
262074fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tnt_8_fail, dfix_empty);
262174fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tnt_64_fail, dfix_empty);
262274fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_suppressed);
262374fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_update_16);
262474fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_update_32);
262574fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_update_48);
262674fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_sext_48);
262774fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_empty, pt_ipc_full);
262874fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_event_cutoff_fail, dfix_empty);
262974fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_event_incomplete_fail, dfix_empty);
263074fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_suppressed);
263174fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_update_16);
263274fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_update_32);
263374fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_update_48);
263474fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_sext_48);
263574fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_empty, pt_ipc_full);
263674fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_ovf_event_cutoff_fail, dfix_empty);
263774fe6c29SRuslan Bukin 
263874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_suppressed, 0x1000);
263974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_update_16, 0x1000);
264074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_update_32, 0x1000);
264174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_update_48, 0x1000);
264274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_sext_48, 0x1000);
264374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event, pt_ipc_full, 0x1000);
264474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_enabled_cutoff_fail, dfix_event);
264574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_suppressed,
264674fe6c29SRuslan Bukin 		   0x1000);
264774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_update_16, 0x1000);
264874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_update_32, 0x1000);
264974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_update_48, 0x1000);
265074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_sext_48, 0x1000);
265174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event, pt_ipc_full, 0x1000);
265274fe6c29SRuslan Bukin 	ptu_run_f(suite, event_disabled_cutoff_fail, dfix_event);
265374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_suppressed,
265474fe6c29SRuslan Bukin 		   0x1000);
265574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_update_16,
265674fe6c29SRuslan Bukin 		   0x1000);
265774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_update_32,
265874fe6c29SRuslan Bukin 		   0x1000);
265974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_update_48,
266074fe6c29SRuslan Bukin 		   0x1000);
266174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_sext_48,
266274fe6c29SRuslan Bukin 		   0x1000);
266374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event, pt_ipc_full,
266474fe6c29SRuslan Bukin 		   0x1000);
266574fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_suppressed_fail, dfix_event);
266674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_cutoff_fail_a, dfix_event);
266774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_cutoff_fail_b, dfix_event);
266874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_suppressed,
266974fe6c29SRuslan Bukin 		   0x1000);
267074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_update_16,
267174fe6c29SRuslan Bukin 		   0x1000);
267274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_update_32,
267374fe6c29SRuslan Bukin 		   0x1000);
267474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_update_48,
267574fe6c29SRuslan Bukin 		   0x1000);
267674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_sext_48,
267774fe6c29SRuslan Bukin 		   0x1000);
267874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event, pt_ipc_full,
267974fe6c29SRuslan Bukin 		   0x1000);
268074fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_suppressed_fail, dfix_event);
268174fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_cutoff_fail_a, dfix_event);
268274fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_cutoff_fail_b, dfix_event);
268374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_paging, dfix_event, 0, 0x1000);
268474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_paging, dfix_event, pt_pl_pip_nr, 0x1000);
268574fe6c29SRuslan Bukin 	ptu_run_f(suite, event_paging_cutoff_fail, dfix_event);
268674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging, dfix_event, 0, 0x1000);
268774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging, dfix_event, pt_pl_pip_nr, 0x1000);
268874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging_suppressed, dfix_event, 0, 0x1000);
268974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging_suppressed, dfix_event,
269074fe6c29SRuslan Bukin 		   pt_pl_pip_nr, 0x1000);
269174fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_paging_cutoff_fail, dfix_event);
269274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_suppressed,
269374fe6c29SRuslan Bukin 		   0x1000);
269474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_update_16,
269574fe6c29SRuslan Bukin 		   0x1000);
269674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_update_32,
269774fe6c29SRuslan Bukin 		   0x1000);
269874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_update_48,
269974fe6c29SRuslan Bukin 		   0x1000);
270074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_sext_48,
270174fe6c29SRuslan Bukin 		   0x1000);
270274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_fup, dfix_event, pt_ipc_full,
270374fe6c29SRuslan Bukin 		   0x1000);
270474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event,
270574fe6c29SRuslan Bukin 		   pt_ipc_suppressed, 0x1000);
270674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_update_16,
270774fe6c29SRuslan Bukin 		   0x1000);
270874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_update_32,
270974fe6c29SRuslan Bukin 		   0x1000);
271074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_update_48,
271174fe6c29SRuslan Bukin 		   0x1000);
271274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_sext_48,
271374fe6c29SRuslan Bukin 		   0x1000);
271474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_overflow_tip_pge, dfix_event, pt_ipc_full,
271574fe6c29SRuslan Bukin 		   0x1000);
271674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_overflow_cutoff_fail, dfix_event);
271774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_stop, dfix_event, 0x1000);
271874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_suppressed,
271974fe6c29SRuslan Bukin 		   0x1000);
272074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_update_16,
272174fe6c29SRuslan Bukin 		   0x1000);
272274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_update_32,
272374fe6c29SRuslan Bukin 		   0x1000);
272474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_update_48,
272574fe6c29SRuslan Bukin 		   0x1000);
272674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_sext_48,
272774fe6c29SRuslan Bukin 		   0x1000);
272874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event, pt_ipc_full,
272974fe6c29SRuslan Bukin 		   0x1000);
273074fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_tip_cutoff_fail, dfix_event);
273174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event,
273274fe6c29SRuslan Bukin 		   pt_ipc_suppressed, 0x1000);
273374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event,
273474fe6c29SRuslan Bukin 		   pt_ipc_update_16, 0x1000);
273574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event,
273674fe6c29SRuslan Bukin 		   pt_ipc_update_32, 0x1000);
273774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event,
273874fe6c29SRuslan Bukin 		   pt_ipc_update_48, 0x1000);
273974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event, pt_ipc_sext_48,
274074fe6c29SRuslan Bukin 		   0x1000);
274174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event, pt_ipc_full,
274274fe6c29SRuslan Bukin 		   0x1000);
274374fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_tip_pge_cutoff_fail, dfix_event);
274474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_cutoff_fail, dfix_event);
274574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_suppressed, 0,
274674fe6c29SRuslan Bukin 		   0x1000);
274774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_update_16,
274874fe6c29SRuslan Bukin 		   pt_mob_tsx_intx, 0x1000);
274974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_update_32, 0,
275074fe6c29SRuslan Bukin 		   0x1000);
275174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_update_48, 0,
275274fe6c29SRuslan Bukin 		   0x1000);
275374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_sext_48,
275474fe6c29SRuslan Bukin 		   pt_mob_tsx_intx, 0x1000);
275574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event, pt_ipc_full,
275674fe6c29SRuslan Bukin 		   pt_mob_tsx_intx, 0x1000);
275774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_tsx_fup_cutoff_fail, dfix_event);
275874fe6c29SRuslan Bukin 	ptu_run_f(suite, event_tsx_cutoff_fail, dfix_event);
275974fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tip_fail, dfix_event);
276074fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tnt_8_fail, dfix_event);
276174fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tnt_64_fail, dfix_event);
276274fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_suppressed);
276374fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_update_16);
276474fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_update_32);
276574fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_update_48);
276674fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_sext_48);
276774fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_event, dfix_event, pt_ipc_full);
276874fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_event_cutoff_fail, dfix_event);
276974fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_event_incomplete_fail, dfix_event);
277074fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_suppressed);
277174fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_update_16);
277274fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_update_32);
277374fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_update_48);
277474fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_sext_48);
277574fe6c29SRuslan Bukin 	ptu_run_fp(suite, sync_ovf_event, dfix_event, pt_ipc_full);
277674fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_ovf_event_cutoff_fail, dfix_event);
277774fe6c29SRuslan Bukin 
277874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event_psb, pt_ipc_suppressed,
277974fe6c29SRuslan Bukin 		   0x1000);
278074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event_psb, pt_ipc_sext_48,
278174fe6c29SRuslan Bukin 		   0x1000);
278274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_enabled, dfix_event_psb, pt_ipc_full,
278374fe6c29SRuslan Bukin 		   0x1000);
278474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_enabled_cutoff_fail, dfix_event_psb);
278574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event_psb, pt_ipc_suppressed,
278674fe6c29SRuslan Bukin 		   0x1000);
278774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event_psb, pt_ipc_sext_48,
278874fe6c29SRuslan Bukin 		   0x1000);
278974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_disabled, dfix_event_psb, pt_ipc_full,
279074fe6c29SRuslan Bukin 		   0x1000);
279174fe6c29SRuslan Bukin 	ptu_run_f(suite, event_disabled_cutoff_fail, dfix_event_psb);
279274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
279374fe6c29SRuslan Bukin 		   pt_ipc_suppressed, 0x1000);
279474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
279574fe6c29SRuslan Bukin 		   pt_ipc_update_16, 0x1000);
279674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
279774fe6c29SRuslan Bukin 		   pt_ipc_update_32, 0x1000);
279874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
279974fe6c29SRuslan Bukin 		   pt_ipc_update_48, 0x1000);
280074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
280174fe6c29SRuslan Bukin 		   pt_ipc_sext_48, 0x1000);
280274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_disabled, dfix_event_psb,
280374fe6c29SRuslan Bukin 		   pt_ipc_full, 0x1000);
280474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_suppressed_fail, dfix_event_psb);
280574fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_cutoff_fail_a, dfix_event_psb);
280674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_disabled_cutoff_fail_b, dfix_event_psb);
280774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event_psb,
280874fe6c29SRuslan Bukin 		   pt_ipc_suppressed, 0x1000);
280974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_update_16,
281074fe6c29SRuslan Bukin 		   0x1000);
281174fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_update_32,
281274fe6c29SRuslan Bukin 		   0x1000);
281374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_update_48,
281474fe6c29SRuslan Bukin 		   0x1000);
281574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_sext_48,
281674fe6c29SRuslan Bukin 		   0x1000);
281774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_branch, dfix_event_psb, pt_ipc_full,
281874fe6c29SRuslan Bukin 		   0x1000);
281974fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_suppressed_fail, dfix_event_psb);
282074fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_cutoff_fail_a, dfix_event_psb);
282174fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_branch_cutoff_fail_b, dfix_event_psb);
282274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_paging, dfix_event_psb, 0, 0x1000);
282374fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_paging, dfix_event_psb, pt_pl_pip_nr, 0x1000);
282474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_paging_cutoff_fail, dfix_event_psb);
282574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging, dfix_event_psb, 0, 0x1000);
282674fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging, dfix_event_psb, pt_pl_pip_nr,
282774fe6c29SRuslan Bukin 		   0x1000);
282874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging_suppressed, dfix_event_psb, 0,
282974fe6c29SRuslan Bukin 		   0x1000);
283074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_async_paging_suppressed, dfix_event_psb,
283174fe6c29SRuslan Bukin 		  pt_pl_pip_nr, 0x1000);
283274fe6c29SRuslan Bukin 	ptu_run_f(suite, event_async_paging_cutoff_fail, dfix_event_psb);
283374fe6c29SRuslan Bukin 	ptu_run_f(suite, event_overflow_cutoff_fail, dfix_event_psb);
283474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_stop, dfix_event_psb, 0x1000);
283574fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event_psb,
283674fe6c29SRuslan Bukin 		   pt_ipc_suppressed, 0x1000);
283774fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event_psb, pt_ipc_sext_48,
283874fe6c29SRuslan Bukin 		   0x1000);
283974fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip, dfix_event_psb, pt_ipc_full,
284074fe6c29SRuslan Bukin 		   0x1000);
284174fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_tip_cutoff_fail, dfix_event_psb);
284274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event_psb,
284374fe6c29SRuslan Bukin 		   pt_ipc_sext_48, 0x1000);
284474fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_exec_mode_tip_pge, dfix_event_psb,
284574fe6c29SRuslan Bukin 		   pt_ipc_full, 0x1000);
284674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_tip_pge_cutoff_fail, dfix_event_psb);
284774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_exec_mode_cutoff_fail, dfix_event_psb);
284874fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event_psb, pt_ipc_suppressed, 0,
284974fe6c29SRuslan Bukin 		   0x1000);
285074fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event_psb, pt_ipc_sext_48,
285174fe6c29SRuslan Bukin 		   pt_mob_tsx_intx, 0x1000);
285274fe6c29SRuslan Bukin 	ptu_run_fp(suite, event_tsx_fup, dfix_event_psb, pt_ipc_full,
285374fe6c29SRuslan Bukin 		   pt_mob_tsx_intx, 0x1000);
285474fe6c29SRuslan Bukin 	ptu_run_f(suite, event_tsx_fup_cutoff_fail, dfix_event_psb);
285574fe6c29SRuslan Bukin 	ptu_run_f(suite, event_tsx_cutoff_fail, dfix_event_psb);
285674fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tip_fail, dfix_event_psb);
285774fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tnt_8_fail, dfix_event_psb);
285874fe6c29SRuslan Bukin 	ptu_run_f(suite, event_skip_tnt_64_fail, dfix_event_psb);
285974fe6c29SRuslan Bukin 
286074fe6c29SRuslan Bukin 	ptu_run_f(suite, time_null_fail, dfix_empty);
286174fe6c29SRuslan Bukin 	ptu_run_f(suite, time_initial, dfix_empty);
286274fe6c29SRuslan Bukin 	ptu_run_f(suite, time, dfix_empty);
286374fe6c29SRuslan Bukin 
286474fe6c29SRuslan Bukin 	ptu_run_f(suite, cbr_null, dfix_empty);
286574fe6c29SRuslan Bukin 	ptu_run_f(suite, cbr_initial, dfix_empty);
286674fe6c29SRuslan Bukin 	ptu_run_f(suite, cbr, dfix_empty);
286774fe6c29SRuslan Bukin 
286874fe6c29SRuslan Bukin 	ptu_run_f(suite, indir_cyc_cutoff, dfix_empty);
286974fe6c29SRuslan Bukin 	ptu_run_f(suite, cond_cyc_cutoff, dfix_empty);
287074fe6c29SRuslan Bukin 	ptu_run_f(suite, event_cyc_cutoff, dfix_empty);
287174fe6c29SRuslan Bukin 
287274fe6c29SRuslan Bukin 	return ptunit_report(&suite);
287374fe6c29SRuslan Bukin }
2874