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