174fe6c29SRuslan Bukin /*
2*85f87cf4SRuslan Bukin * Copyright (c) 2014-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_packet_decoder.h"
3274fe6c29SRuslan Bukin #include "pt_query_decoder.h"
3374fe6c29SRuslan Bukin #include "pt_encoder.h"
3474fe6c29SRuslan Bukin #include "pt_opcodes.h"
3574fe6c29SRuslan Bukin
3674fe6c29SRuslan Bukin #include "intel-pt.h"
3774fe6c29SRuslan Bukin
3874fe6c29SRuslan Bukin #include <string.h>
3974fe6c29SRuslan Bukin
4074fe6c29SRuslan Bukin
4174fe6c29SRuslan Bukin /* A test fixture providing everything needed for packet en- and de-coding. */
4274fe6c29SRuslan Bukin struct packet_fixture {
4374fe6c29SRuslan Bukin /* The trace buffer. */
4474fe6c29SRuslan Bukin uint8_t buffer[64];
4574fe6c29SRuslan Bukin
4674fe6c29SRuslan Bukin /* Two packets for encoding[0] and decoding[1]. */
4774fe6c29SRuslan Bukin struct pt_packet packet[2];
4874fe6c29SRuslan Bukin
4974fe6c29SRuslan Bukin /* The configuration. */
5074fe6c29SRuslan Bukin struct pt_config config;
5174fe6c29SRuslan Bukin
5274fe6c29SRuslan Bukin /* The encoder. */
5374fe6c29SRuslan Bukin struct pt_encoder encoder;
5474fe6c29SRuslan Bukin
5574fe6c29SRuslan Bukin /* The decoder. */
5674fe6c29SRuslan Bukin struct pt_packet_decoder decoder;
5774fe6c29SRuslan Bukin
5874fe6c29SRuslan Bukin /* The return value for an unknown decode. */
5974fe6c29SRuslan Bukin int unknown;
6074fe6c29SRuslan Bukin
6174fe6c29SRuslan Bukin /* The test fixture initialization and finalization functions. */
6274fe6c29SRuslan Bukin struct ptunit_result (*init)(struct packet_fixture *);
6374fe6c29SRuslan Bukin struct ptunit_result (*fini)(struct packet_fixture *);
6474fe6c29SRuslan Bukin };
6574fe6c29SRuslan Bukin
pfix_decode_unknown(struct pt_packet_unknown * packet,const struct pt_config * config,const uint8_t * pos,void * context)6674fe6c29SRuslan Bukin static int pfix_decode_unknown(struct pt_packet_unknown *packet,
6774fe6c29SRuslan Bukin const struct pt_config *config,
6874fe6c29SRuslan Bukin const uint8_t *pos, void *context)
6974fe6c29SRuslan Bukin {
7074fe6c29SRuslan Bukin struct packet_fixture *pfix;
7174fe6c29SRuslan Bukin
7274fe6c29SRuslan Bukin if (!packet || !config)
7374fe6c29SRuslan Bukin return -pte_internal;
7474fe6c29SRuslan Bukin
7574fe6c29SRuslan Bukin pfix = (struct packet_fixture *) context;
7674fe6c29SRuslan Bukin if (!pfix)
7774fe6c29SRuslan Bukin return -pte_internal;
7874fe6c29SRuslan Bukin
7974fe6c29SRuslan Bukin if (config->begin != pfix->buffer)
8074fe6c29SRuslan Bukin return -pte_internal;
8174fe6c29SRuslan Bukin
8274fe6c29SRuslan Bukin if (config->end != pfix->buffer + sizeof(pfix->buffer))
8374fe6c29SRuslan Bukin return -pte_internal;
8474fe6c29SRuslan Bukin
8574fe6c29SRuslan Bukin if (pos != pfix->buffer)
8674fe6c29SRuslan Bukin return -pte_internal;
8774fe6c29SRuslan Bukin
8874fe6c29SRuslan Bukin packet->priv = pfix;
8974fe6c29SRuslan Bukin
9074fe6c29SRuslan Bukin return pfix->unknown;
9174fe6c29SRuslan Bukin }
9274fe6c29SRuslan Bukin
pfix_init(struct packet_fixture * pfix)9374fe6c29SRuslan Bukin static struct ptunit_result pfix_init(struct packet_fixture *pfix)
9474fe6c29SRuslan Bukin {
9574fe6c29SRuslan Bukin int errcode;
9674fe6c29SRuslan Bukin
9774fe6c29SRuslan Bukin memset(pfix->buffer, 0, sizeof(pfix->buffer));
9874fe6c29SRuslan Bukin memset(pfix->packet, 0, sizeof(pfix->packet));
9974fe6c29SRuslan Bukin memset(&pfix->config, 0, sizeof(pfix->config));
10074fe6c29SRuslan Bukin pfix->config.size = sizeof(pfix->config);
10174fe6c29SRuslan Bukin pfix->config.begin = pfix->buffer;
10274fe6c29SRuslan Bukin pfix->config.end = pfix->buffer + sizeof(pfix->buffer);
10374fe6c29SRuslan Bukin pfix->config.decode.callback = pfix_decode_unknown;
10474fe6c29SRuslan Bukin pfix->config.decode.context = pfix;
10574fe6c29SRuslan Bukin
10674fe6c29SRuslan Bukin pt_encoder_init(&pfix->encoder, &pfix->config);
10774fe6c29SRuslan Bukin pt_pkt_decoder_init(&pfix->decoder, &pfix->config);
10874fe6c29SRuslan Bukin
10974fe6c29SRuslan Bukin errcode = pt_pkt_sync_set(&pfix->decoder, 0x0ull);
11074fe6c29SRuslan Bukin ptu_int_eq(errcode, 0);
11174fe6c29SRuslan Bukin
11274fe6c29SRuslan Bukin pfix->unknown = 0;
11374fe6c29SRuslan Bukin
11474fe6c29SRuslan Bukin return ptu_passed();
11574fe6c29SRuslan Bukin }
11674fe6c29SRuslan Bukin
pfix_fini(struct packet_fixture * pfix)11774fe6c29SRuslan Bukin static struct ptunit_result pfix_fini(struct packet_fixture *pfix)
11874fe6c29SRuslan Bukin {
11974fe6c29SRuslan Bukin pt_encoder_fini(&pfix->encoder);
12074fe6c29SRuslan Bukin pt_pkt_decoder_fini(&pfix->decoder);
12174fe6c29SRuslan Bukin
12274fe6c29SRuslan Bukin return ptu_passed();
12374fe6c29SRuslan Bukin }
12474fe6c29SRuslan Bukin
ptu_pkt_eq(const struct pt_packet * enc,const struct pt_packet * dec)12574fe6c29SRuslan Bukin static struct ptunit_result ptu_pkt_eq(const struct pt_packet *enc,
12674fe6c29SRuslan Bukin const struct pt_packet *dec)
12774fe6c29SRuslan Bukin {
12874fe6c29SRuslan Bukin const uint8_t *renc, *rdec;
12974fe6c29SRuslan Bukin size_t byte;
13074fe6c29SRuslan Bukin
13174fe6c29SRuslan Bukin ptu_ptr(enc);
13274fe6c29SRuslan Bukin ptu_ptr(dec);
13374fe6c29SRuslan Bukin
13474fe6c29SRuslan Bukin renc = (const uint8_t *) enc;
13574fe6c29SRuslan Bukin rdec = (const uint8_t *) dec;
13674fe6c29SRuslan Bukin
13774fe6c29SRuslan Bukin for (byte = 0; byte < sizeof(*enc); ++byte)
13874fe6c29SRuslan Bukin ptu_uint_eq(renc[byte], rdec[byte]);
13974fe6c29SRuslan Bukin
14074fe6c29SRuslan Bukin return ptu_passed();
14174fe6c29SRuslan Bukin }
14274fe6c29SRuslan Bukin
pfix_test(struct packet_fixture * pfix)14374fe6c29SRuslan Bukin static struct ptunit_result pfix_test(struct packet_fixture *pfix)
14474fe6c29SRuslan Bukin {
14574fe6c29SRuslan Bukin int size;
14674fe6c29SRuslan Bukin
14774fe6c29SRuslan Bukin size = pt_enc_next(&pfix->encoder, &pfix->packet[0]);
14874fe6c29SRuslan Bukin ptu_int_gt(size, 0);
14974fe6c29SRuslan Bukin
15074fe6c29SRuslan Bukin pfix->packet[0].size = (uint8_t) size;
15174fe6c29SRuslan Bukin
15274fe6c29SRuslan Bukin size = pt_pkt_next(&pfix->decoder, &pfix->packet[1],
15374fe6c29SRuslan Bukin sizeof(pfix->packet[1]));
15474fe6c29SRuslan Bukin ptu_int_gt(size, 0);
15574fe6c29SRuslan Bukin
15674fe6c29SRuslan Bukin return ptu_pkt_eq(&pfix->packet[0], &pfix->packet[1]);
15774fe6c29SRuslan Bukin }
15874fe6c29SRuslan Bukin
no_payload(struct packet_fixture * pfix,enum pt_packet_type type)15974fe6c29SRuslan Bukin static struct ptunit_result no_payload(struct packet_fixture *pfix,
16074fe6c29SRuslan Bukin enum pt_packet_type type)
16174fe6c29SRuslan Bukin {
16274fe6c29SRuslan Bukin pfix->packet[0].type = type;
16374fe6c29SRuslan Bukin
16474fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
16574fe6c29SRuslan Bukin
16674fe6c29SRuslan Bukin return ptu_passed();
16774fe6c29SRuslan Bukin }
16874fe6c29SRuslan Bukin
unknown(struct packet_fixture * pfix,int exp)16974fe6c29SRuslan Bukin static struct ptunit_result unknown(struct packet_fixture *pfix, int exp)
17074fe6c29SRuslan Bukin {
17174fe6c29SRuslan Bukin int size;
17274fe6c29SRuslan Bukin
17374fe6c29SRuslan Bukin pfix->buffer[0] = pt_opc_bad;
17474fe6c29SRuslan Bukin pfix->unknown = exp;
17574fe6c29SRuslan Bukin
17674fe6c29SRuslan Bukin size = pt_pkt_next(&pfix->decoder, &pfix->packet[1],
17774fe6c29SRuslan Bukin sizeof(pfix->packet[1]));
17874fe6c29SRuslan Bukin ptu_int_eq(size, pfix->unknown);
17974fe6c29SRuslan Bukin
18074fe6c29SRuslan Bukin if (size >= 0) {
18174fe6c29SRuslan Bukin ptu_int_eq(pfix->packet[1].type, ppt_unknown);
18274fe6c29SRuslan Bukin ptu_uint_eq(pfix->packet[1].size, (uint8_t) size);
18374fe6c29SRuslan Bukin ptu_ptr_eq(pfix->packet[1].payload.unknown.packet,
18474fe6c29SRuslan Bukin pfix->buffer);
18574fe6c29SRuslan Bukin ptu_ptr_eq(pfix->packet[1].payload.unknown.priv, pfix);
18674fe6c29SRuslan Bukin }
18774fe6c29SRuslan Bukin
18874fe6c29SRuslan Bukin return ptu_passed();
18974fe6c29SRuslan Bukin }
19074fe6c29SRuslan Bukin
unknown_ext(struct packet_fixture * pfix,int exp)19174fe6c29SRuslan Bukin static struct ptunit_result unknown_ext(struct packet_fixture *pfix, int exp)
19274fe6c29SRuslan Bukin {
19374fe6c29SRuslan Bukin int size;
19474fe6c29SRuslan Bukin
19574fe6c29SRuslan Bukin pfix->buffer[0] = pt_opc_ext;
19674fe6c29SRuslan Bukin pfix->buffer[1] = pt_ext_bad;
19774fe6c29SRuslan Bukin pfix->unknown = exp;
19874fe6c29SRuslan Bukin
19974fe6c29SRuslan Bukin size = pt_pkt_next(&pfix->decoder, &pfix->packet[1],
20074fe6c29SRuslan Bukin sizeof(pfix->packet[1]));
20174fe6c29SRuslan Bukin ptu_int_eq(size, pfix->unknown);
20274fe6c29SRuslan Bukin
20374fe6c29SRuslan Bukin if (size >= 0) {
20474fe6c29SRuslan Bukin ptu_int_eq(pfix->packet[1].type, ppt_unknown);
20574fe6c29SRuslan Bukin ptu_uint_eq(pfix->packet[1].size, (uint8_t) size);
20674fe6c29SRuslan Bukin ptu_ptr_eq(pfix->packet[1].payload.unknown.packet,
20774fe6c29SRuslan Bukin pfix->buffer);
20874fe6c29SRuslan Bukin ptu_ptr_eq(pfix->packet[1].payload.unknown.priv, pfix);
20974fe6c29SRuslan Bukin }
21074fe6c29SRuslan Bukin
21174fe6c29SRuslan Bukin return ptu_passed();
21274fe6c29SRuslan Bukin }
21374fe6c29SRuslan Bukin
unknown_ext2(struct packet_fixture * pfix,int exp)21474fe6c29SRuslan Bukin static struct ptunit_result unknown_ext2(struct packet_fixture *pfix, int exp)
21574fe6c29SRuslan Bukin {
21674fe6c29SRuslan Bukin int size;
21774fe6c29SRuslan Bukin
21874fe6c29SRuslan Bukin pfix->buffer[0] = pt_opc_ext;
21974fe6c29SRuslan Bukin pfix->buffer[1] = pt_ext_ext2;
22074fe6c29SRuslan Bukin pfix->buffer[2] = pt_ext2_bad;
22174fe6c29SRuslan Bukin pfix->unknown = exp;
22274fe6c29SRuslan Bukin
22374fe6c29SRuslan Bukin size = pt_pkt_next(&pfix->decoder, &pfix->packet[1],
22474fe6c29SRuslan Bukin sizeof(pfix->packet[1]));
22574fe6c29SRuslan Bukin ptu_int_eq(size, exp);
22674fe6c29SRuslan Bukin
22774fe6c29SRuslan Bukin if (exp >= 0) {
22874fe6c29SRuslan Bukin ptu_int_eq(pfix->packet[1].type, ppt_unknown);
22974fe6c29SRuslan Bukin ptu_uint_eq(pfix->packet[1].size, (uint8_t) size);
23074fe6c29SRuslan Bukin ptu_ptr_eq(pfix->packet[1].payload.unknown.packet,
23174fe6c29SRuslan Bukin pfix->buffer);
23274fe6c29SRuslan Bukin ptu_ptr_eq(pfix->packet[1].payload.unknown.priv, pfix);
23374fe6c29SRuslan Bukin }
23474fe6c29SRuslan Bukin
23574fe6c29SRuslan Bukin return ptu_passed();
23674fe6c29SRuslan Bukin }
23774fe6c29SRuslan Bukin
tnt_8(struct packet_fixture * pfix)23874fe6c29SRuslan Bukin static struct ptunit_result tnt_8(struct packet_fixture *pfix)
23974fe6c29SRuslan Bukin {
24074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_tnt_8;
24174fe6c29SRuslan Bukin pfix->packet[0].payload.tnt.bit_size = 4;
24274fe6c29SRuslan Bukin pfix->packet[0].payload.tnt.payload = 0x5ull;
24374fe6c29SRuslan Bukin
24474fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
24574fe6c29SRuslan Bukin
24674fe6c29SRuslan Bukin return ptu_passed();
24774fe6c29SRuslan Bukin }
24874fe6c29SRuslan Bukin
tnt_64(struct packet_fixture * pfix)24974fe6c29SRuslan Bukin static struct ptunit_result tnt_64(struct packet_fixture *pfix)
25074fe6c29SRuslan Bukin {
25174fe6c29SRuslan Bukin pfix->packet[0].type = ppt_tnt_64;
25274fe6c29SRuslan Bukin pfix->packet[0].payload.tnt.bit_size = 23;
25374fe6c29SRuslan Bukin pfix->packet[0].payload.tnt.payload = 0xabcdeull;
25474fe6c29SRuslan Bukin
25574fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
25674fe6c29SRuslan Bukin
25774fe6c29SRuslan Bukin return ptu_passed();
25874fe6c29SRuslan Bukin }
25974fe6c29SRuslan Bukin
ip(struct packet_fixture * pfix,enum pt_packet_type type,enum pt_ip_compression ipc,uint64_t ip)26074fe6c29SRuslan Bukin static struct ptunit_result ip(struct packet_fixture *pfix,
26174fe6c29SRuslan Bukin enum pt_packet_type type,
26274fe6c29SRuslan Bukin enum pt_ip_compression ipc,
26374fe6c29SRuslan Bukin uint64_t ip)
26474fe6c29SRuslan Bukin {
26574fe6c29SRuslan Bukin pfix->packet[0].type = type;
26674fe6c29SRuslan Bukin pfix->packet[0].payload.ip.ipc = ipc;
26774fe6c29SRuslan Bukin pfix->packet[0].payload.ip.ip = ip;
26874fe6c29SRuslan Bukin
26974fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
27074fe6c29SRuslan Bukin
27174fe6c29SRuslan Bukin return ptu_passed();
27274fe6c29SRuslan Bukin }
27374fe6c29SRuslan Bukin
mode_exec(struct packet_fixture * pfix,enum pt_exec_mode mode)27474fe6c29SRuslan Bukin static struct ptunit_result mode_exec(struct packet_fixture *pfix,
27574fe6c29SRuslan Bukin enum pt_exec_mode mode)
27674fe6c29SRuslan Bukin {
27774fe6c29SRuslan Bukin struct pt_packet_mode_exec packet;
27874fe6c29SRuslan Bukin
27974fe6c29SRuslan Bukin packet = pt_set_exec_mode(mode);
28074fe6c29SRuslan Bukin
28174fe6c29SRuslan Bukin pfix->packet[0].type = ppt_mode;
28274fe6c29SRuslan Bukin pfix->packet[0].payload.mode.leaf = pt_mol_exec;
28374fe6c29SRuslan Bukin pfix->packet[0].payload.mode.bits.exec.csl = packet.csl;
28474fe6c29SRuslan Bukin pfix->packet[0].payload.mode.bits.exec.csd = packet.csd;
28574fe6c29SRuslan Bukin
28674fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
28774fe6c29SRuslan Bukin
28874fe6c29SRuslan Bukin return ptu_passed();
28974fe6c29SRuslan Bukin }
29074fe6c29SRuslan Bukin
mode_tsx(struct packet_fixture * pfix)29174fe6c29SRuslan Bukin static struct ptunit_result mode_tsx(struct packet_fixture *pfix)
29274fe6c29SRuslan Bukin {
29374fe6c29SRuslan Bukin pfix->packet[0].type = ppt_mode;
29474fe6c29SRuslan Bukin pfix->packet[0].payload.mode.leaf = pt_mol_tsx;
29574fe6c29SRuslan Bukin pfix->packet[0].payload.mode.bits.tsx.intx = 1;
29674fe6c29SRuslan Bukin
29774fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
29874fe6c29SRuslan Bukin
29974fe6c29SRuslan Bukin return ptu_passed();
30074fe6c29SRuslan Bukin }
30174fe6c29SRuslan Bukin
pip(struct packet_fixture * pfix)30274fe6c29SRuslan Bukin static struct ptunit_result pip(struct packet_fixture *pfix)
30374fe6c29SRuslan Bukin {
30474fe6c29SRuslan Bukin pfix->packet[0].type = ppt_pip;
30574fe6c29SRuslan Bukin pfix->packet[0].payload.pip.cr3 = 0x4200ull;
30674fe6c29SRuslan Bukin pfix->packet[0].payload.pip.nr = 1;
30774fe6c29SRuslan Bukin
30874fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
30974fe6c29SRuslan Bukin
31074fe6c29SRuslan Bukin return ptu_passed();
31174fe6c29SRuslan Bukin }
31274fe6c29SRuslan Bukin
tsc(struct packet_fixture * pfix)31374fe6c29SRuslan Bukin static struct ptunit_result tsc(struct packet_fixture *pfix)
31474fe6c29SRuslan Bukin {
31574fe6c29SRuslan Bukin pfix->packet[0].type = ppt_tsc;
31674fe6c29SRuslan Bukin pfix->packet[0].payload.tsc.tsc = 0x42ull;
31774fe6c29SRuslan Bukin
31874fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
31974fe6c29SRuslan Bukin
32074fe6c29SRuslan Bukin return ptu_passed();
32174fe6c29SRuslan Bukin }
32274fe6c29SRuslan Bukin
cbr(struct packet_fixture * pfix)32374fe6c29SRuslan Bukin static struct ptunit_result cbr(struct packet_fixture *pfix)
32474fe6c29SRuslan Bukin {
32574fe6c29SRuslan Bukin pfix->packet[0].type = ppt_cbr;
32674fe6c29SRuslan Bukin pfix->packet[0].payload.cbr.ratio = 0x23;
32774fe6c29SRuslan Bukin
32874fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
32974fe6c29SRuslan Bukin
33074fe6c29SRuslan Bukin return ptu_passed();
33174fe6c29SRuslan Bukin }
33274fe6c29SRuslan Bukin
tma(struct packet_fixture * pfix)33374fe6c29SRuslan Bukin static struct ptunit_result tma(struct packet_fixture *pfix)
33474fe6c29SRuslan Bukin {
33574fe6c29SRuslan Bukin pfix->packet[0].type = ppt_tma;
33674fe6c29SRuslan Bukin pfix->packet[0].payload.tma.ctc = 0x42;
33774fe6c29SRuslan Bukin pfix->packet[0].payload.tma.fc = 0x123;
33874fe6c29SRuslan Bukin
33974fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
34074fe6c29SRuslan Bukin
34174fe6c29SRuslan Bukin return ptu_passed();
34274fe6c29SRuslan Bukin }
34374fe6c29SRuslan Bukin
tma_bad(struct packet_fixture * pfix)34474fe6c29SRuslan Bukin static struct ptunit_result tma_bad(struct packet_fixture *pfix)
34574fe6c29SRuslan Bukin {
34674fe6c29SRuslan Bukin int errcode;
34774fe6c29SRuslan Bukin
34874fe6c29SRuslan Bukin pfix->packet[0].type = ppt_tma;
34974fe6c29SRuslan Bukin pfix->packet[0].payload.tma.ctc = 0x42;
35074fe6c29SRuslan Bukin pfix->packet[0].payload.tma.fc = 0x200;
35174fe6c29SRuslan Bukin
35274fe6c29SRuslan Bukin errcode = pt_enc_next(&pfix->encoder, &pfix->packet[0]);
35374fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_bad_packet);
35474fe6c29SRuslan Bukin
35574fe6c29SRuslan Bukin return ptu_passed();
35674fe6c29SRuslan Bukin }
35774fe6c29SRuslan Bukin
mtc(struct packet_fixture * pfix)35874fe6c29SRuslan Bukin static struct ptunit_result mtc(struct packet_fixture *pfix)
35974fe6c29SRuslan Bukin {
36074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_mtc;
36174fe6c29SRuslan Bukin pfix->packet[0].payload.mtc.ctc = 0x23;
36274fe6c29SRuslan Bukin
36374fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
36474fe6c29SRuslan Bukin
36574fe6c29SRuslan Bukin return ptu_passed();
36674fe6c29SRuslan Bukin }
36774fe6c29SRuslan Bukin
cyc(struct packet_fixture * pfix)36874fe6c29SRuslan Bukin static struct ptunit_result cyc(struct packet_fixture *pfix)
36974fe6c29SRuslan Bukin {
37074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_cyc;
37174fe6c29SRuslan Bukin pfix->packet[0].payload.cyc.value = 0x23;
37274fe6c29SRuslan Bukin
37374fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
37474fe6c29SRuslan Bukin
37574fe6c29SRuslan Bukin return ptu_passed();
37674fe6c29SRuslan Bukin }
37774fe6c29SRuslan Bukin
vmcs(struct packet_fixture * pfix)37874fe6c29SRuslan Bukin static struct ptunit_result vmcs(struct packet_fixture *pfix)
37974fe6c29SRuslan Bukin {
38074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_vmcs;
38174fe6c29SRuslan Bukin pfix->packet[0].payload.vmcs.base = 0xabcdef000ull;
38274fe6c29SRuslan Bukin
38374fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
38474fe6c29SRuslan Bukin
38574fe6c29SRuslan Bukin return ptu_passed();
38674fe6c29SRuslan Bukin }
38774fe6c29SRuslan Bukin
mnt(struct packet_fixture * pfix)38874fe6c29SRuslan Bukin static struct ptunit_result mnt(struct packet_fixture *pfix)
38974fe6c29SRuslan Bukin {
39074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_mnt;
39174fe6c29SRuslan Bukin pfix->packet[0].payload.mnt.payload = 0x1234567890abcdefull;
39274fe6c29SRuslan Bukin
39374fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
39474fe6c29SRuslan Bukin
39574fe6c29SRuslan Bukin return ptu_passed();
39674fe6c29SRuslan Bukin }
39774fe6c29SRuslan Bukin
exstop(struct packet_fixture * pfix,int ip)39874fe6c29SRuslan Bukin static struct ptunit_result exstop(struct packet_fixture *pfix, int ip)
39974fe6c29SRuslan Bukin {
40074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_exstop;
40174fe6c29SRuslan Bukin pfix->packet[0].payload.exstop.ip = ip ? 1 : 0;
40274fe6c29SRuslan Bukin
40374fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
40474fe6c29SRuslan Bukin
40574fe6c29SRuslan Bukin return ptu_passed();
40674fe6c29SRuslan Bukin }
40774fe6c29SRuslan Bukin
mwait(struct packet_fixture * pfix)40874fe6c29SRuslan Bukin static struct ptunit_result mwait(struct packet_fixture *pfix)
40974fe6c29SRuslan Bukin {
41074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_mwait;
41174fe6c29SRuslan Bukin pfix->packet[0].payload.mwait.hints = 0xc;
41274fe6c29SRuslan Bukin pfix->packet[0].payload.mwait.ext = 0x1;
41374fe6c29SRuslan Bukin
41474fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
41574fe6c29SRuslan Bukin
41674fe6c29SRuslan Bukin return ptu_passed();
41774fe6c29SRuslan Bukin }
41874fe6c29SRuslan Bukin
pwre(struct packet_fixture * pfix)41974fe6c29SRuslan Bukin static struct ptunit_result pwre(struct packet_fixture *pfix)
42074fe6c29SRuslan Bukin {
42174fe6c29SRuslan Bukin pfix->packet[0].type = ppt_pwre;
42274fe6c29SRuslan Bukin pfix->packet[0].payload.pwre.state = 0x0;
42374fe6c29SRuslan Bukin pfix->packet[0].payload.pwre.sub_state = 0x3;
42474fe6c29SRuslan Bukin pfix->packet[0].payload.pwre.hw = 1;
42574fe6c29SRuslan Bukin
42674fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
42774fe6c29SRuslan Bukin
42874fe6c29SRuslan Bukin return ptu_passed();
42974fe6c29SRuslan Bukin }
43074fe6c29SRuslan Bukin
pwrx(struct packet_fixture * pfix)43174fe6c29SRuslan Bukin static struct ptunit_result pwrx(struct packet_fixture *pfix)
43274fe6c29SRuslan Bukin {
43374fe6c29SRuslan Bukin pfix->packet[0].type = ppt_pwrx;
43474fe6c29SRuslan Bukin pfix->packet[0].payload.pwrx.last = 0x3;
43574fe6c29SRuslan Bukin pfix->packet[0].payload.pwrx.deepest = 0xa;
43674fe6c29SRuslan Bukin pfix->packet[0].payload.pwrx.store = 1;
43774fe6c29SRuslan Bukin
43874fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
43974fe6c29SRuslan Bukin
44074fe6c29SRuslan Bukin return ptu_passed();
44174fe6c29SRuslan Bukin }
44274fe6c29SRuslan Bukin
ptw(struct packet_fixture * pfix,uint8_t plc,int ip)44374fe6c29SRuslan Bukin static struct ptunit_result ptw(struct packet_fixture *pfix, uint8_t plc,
44474fe6c29SRuslan Bukin int ip)
44574fe6c29SRuslan Bukin {
44674fe6c29SRuslan Bukin uint64_t pl, mask;
44774fe6c29SRuslan Bukin int size;
44874fe6c29SRuslan Bukin
44974fe6c29SRuslan Bukin size = pt_ptw_size(plc);
45074fe6c29SRuslan Bukin ptu_int_gt(size, 0);
45174fe6c29SRuslan Bukin
45274fe6c29SRuslan Bukin pl = 0x1234567890abcdefull;
45374fe6c29SRuslan Bukin
45474fe6c29SRuslan Bukin ptu_uint_le((size_t) size, sizeof(mask));
45574fe6c29SRuslan Bukin mask = ~0ull >> ((sizeof(mask) - (size_t) size) * 8);
45674fe6c29SRuslan Bukin
45774fe6c29SRuslan Bukin pfix->packet[0].type = ppt_ptw;
45874fe6c29SRuslan Bukin pfix->packet[0].payload.ptw.payload = pl & mask;
45974fe6c29SRuslan Bukin pfix->packet[0].payload.ptw.plc = plc;
46074fe6c29SRuslan Bukin pfix->packet[0].payload.ptw.ip = ip ? 1 : 0;
46174fe6c29SRuslan Bukin
46274fe6c29SRuslan Bukin ptu_test(pfix_test, pfix);
46374fe6c29SRuslan Bukin
46474fe6c29SRuslan Bukin return ptu_passed();
46574fe6c29SRuslan Bukin }
46674fe6c29SRuslan Bukin
cutoff(struct packet_fixture * pfix,enum pt_packet_type type)46774fe6c29SRuslan Bukin static struct ptunit_result cutoff(struct packet_fixture *pfix,
46874fe6c29SRuslan Bukin enum pt_packet_type type)
46974fe6c29SRuslan Bukin {
47074fe6c29SRuslan Bukin int size;
47174fe6c29SRuslan Bukin
47274fe6c29SRuslan Bukin pfix->packet[0].type = type;
47374fe6c29SRuslan Bukin
47474fe6c29SRuslan Bukin size = pt_enc_next(&pfix->encoder, &pfix->packet[0]);
47574fe6c29SRuslan Bukin ptu_int_gt(size, 0);
47674fe6c29SRuslan Bukin
47774fe6c29SRuslan Bukin pfix->decoder.config.end = pfix->encoder.pos - 1;
47874fe6c29SRuslan Bukin
47974fe6c29SRuslan Bukin size = pt_pkt_next(&pfix->decoder, &pfix->packet[1],
48074fe6c29SRuslan Bukin sizeof(pfix->packet[1]));
48174fe6c29SRuslan Bukin ptu_int_eq(size, -pte_eos);
48274fe6c29SRuslan Bukin
48374fe6c29SRuslan Bukin return ptu_passed();
48474fe6c29SRuslan Bukin }
48574fe6c29SRuslan Bukin
cutoff_ip(struct packet_fixture * pfix,enum pt_packet_type type)48674fe6c29SRuslan Bukin static struct ptunit_result cutoff_ip(struct packet_fixture *pfix,
48774fe6c29SRuslan Bukin enum pt_packet_type type)
48874fe6c29SRuslan Bukin {
48974fe6c29SRuslan Bukin int size;
49074fe6c29SRuslan Bukin
49174fe6c29SRuslan Bukin pfix->packet[0].type = type;
49274fe6c29SRuslan Bukin pfix->packet[0].payload.ip.ipc = pt_ipc_sext_48;
49374fe6c29SRuslan Bukin
49474fe6c29SRuslan Bukin size = pt_enc_next(&pfix->encoder, &pfix->packet[0]);
49574fe6c29SRuslan Bukin ptu_int_gt(size, 0);
49674fe6c29SRuslan Bukin
49774fe6c29SRuslan Bukin pfix->decoder.config.end = pfix->encoder.pos - 1;
49874fe6c29SRuslan Bukin
49974fe6c29SRuslan Bukin size = pt_pkt_next(&pfix->decoder, &pfix->packet[1],
50074fe6c29SRuslan Bukin sizeof(pfix->packet[1]));
50174fe6c29SRuslan Bukin ptu_int_eq(size, -pte_eos);
50274fe6c29SRuslan Bukin
50374fe6c29SRuslan Bukin return ptu_passed();
50474fe6c29SRuslan Bukin }
50574fe6c29SRuslan Bukin
cutoff_cyc(struct packet_fixture * pfix)50674fe6c29SRuslan Bukin static struct ptunit_result cutoff_cyc(struct packet_fixture *pfix)
50774fe6c29SRuslan Bukin {
50874fe6c29SRuslan Bukin int size;
50974fe6c29SRuslan Bukin
51074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_cyc;
51174fe6c29SRuslan Bukin pfix->packet[0].payload.cyc.value = 0xa8;
51274fe6c29SRuslan Bukin
51374fe6c29SRuslan Bukin size = pt_enc_next(&pfix->encoder, &pfix->packet[0]);
51474fe6c29SRuslan Bukin ptu_int_gt(size, 0);
51574fe6c29SRuslan Bukin
51674fe6c29SRuslan Bukin pfix->decoder.config.end = pfix->encoder.pos - 1;
51774fe6c29SRuslan Bukin
51874fe6c29SRuslan Bukin size = pt_pkt_next(&pfix->decoder, &pfix->packet[1],
51974fe6c29SRuslan Bukin sizeof(pfix->packet[1]));
52074fe6c29SRuslan Bukin ptu_int_eq(size, -pte_eos);
52174fe6c29SRuslan Bukin
52274fe6c29SRuslan Bukin return ptu_passed();
52374fe6c29SRuslan Bukin }
52474fe6c29SRuslan Bukin
cutoff_mode(struct packet_fixture * pfix,enum pt_mode_leaf leaf)52574fe6c29SRuslan Bukin static struct ptunit_result cutoff_mode(struct packet_fixture *pfix,
52674fe6c29SRuslan Bukin enum pt_mode_leaf leaf)
52774fe6c29SRuslan Bukin {
52874fe6c29SRuslan Bukin int size;
52974fe6c29SRuslan Bukin
53074fe6c29SRuslan Bukin pfix->packet[0].type = ppt_mode;
53174fe6c29SRuslan Bukin pfix->packet[0].payload.mode.leaf = leaf;
53274fe6c29SRuslan Bukin
53374fe6c29SRuslan Bukin size = pt_enc_next(&pfix->encoder, &pfix->packet[0]);
53474fe6c29SRuslan Bukin ptu_int_gt(size, 0);
53574fe6c29SRuslan Bukin
53674fe6c29SRuslan Bukin pfix->decoder.config.end = pfix->encoder.pos - 1;
53774fe6c29SRuslan Bukin
53874fe6c29SRuslan Bukin size = pt_pkt_next(&pfix->decoder, &pfix->packet[1],
53974fe6c29SRuslan Bukin sizeof(pfix->packet[1]));
54074fe6c29SRuslan Bukin ptu_int_eq(size, -pte_eos);
54174fe6c29SRuslan Bukin
54274fe6c29SRuslan Bukin return ptu_passed();
54374fe6c29SRuslan Bukin }
54474fe6c29SRuslan Bukin
main(int argc,char ** argv)54574fe6c29SRuslan Bukin int main(int argc, char **argv)
54674fe6c29SRuslan Bukin {
54774fe6c29SRuslan Bukin struct packet_fixture pfix;
54874fe6c29SRuslan Bukin struct ptunit_suite suite;
54974fe6c29SRuslan Bukin
55074fe6c29SRuslan Bukin pfix.init = pfix_init;
55174fe6c29SRuslan Bukin pfix.fini = pfix_fini;
55274fe6c29SRuslan Bukin
55374fe6c29SRuslan Bukin suite = ptunit_mk_suite(argc, argv);
55474fe6c29SRuslan Bukin
55574fe6c29SRuslan Bukin ptu_run_fp(suite, no_payload, pfix, ppt_pad);
55674fe6c29SRuslan Bukin ptu_run_fp(suite, no_payload, pfix, ppt_psb);
55774fe6c29SRuslan Bukin ptu_run_fp(suite, no_payload, pfix, ppt_ovf);
55874fe6c29SRuslan Bukin ptu_run_fp(suite, no_payload, pfix, ppt_psbend);
55974fe6c29SRuslan Bukin ptu_run_fp(suite, no_payload, pfix, ppt_stop);
56074fe6c29SRuslan Bukin
56174fe6c29SRuslan Bukin ptu_run_fp(suite, unknown, pfix, 4);
56274fe6c29SRuslan Bukin ptu_run_fp(suite, unknown, pfix, -pte_nomem);
56374fe6c29SRuslan Bukin ptu_run_fp(suite, unknown_ext, pfix, 4);
56474fe6c29SRuslan Bukin ptu_run_fp(suite, unknown_ext, pfix, -pte_nomem);
56574fe6c29SRuslan Bukin ptu_run_fp(suite, unknown_ext2, pfix, 4);
56674fe6c29SRuslan Bukin ptu_run_fp(suite, unknown_ext2, pfix, -pte_nomem);
56774fe6c29SRuslan Bukin
56874fe6c29SRuslan Bukin ptu_run_f(suite, tnt_8, pfix);
56974fe6c29SRuslan Bukin ptu_run_f(suite, tnt_64, pfix);
57074fe6c29SRuslan Bukin
57174fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_suppressed, 0x0ull);
57274fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_update_16, 0x42ull);
57374fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_update_32, 0x4200ull);
57474fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_update_48, 0x4200ull);
57574fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_sext_48, 0x42ull);
57674fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_full, 0x42ull);
57774fe6c29SRuslan Bukin
57874fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_suppressed, 0x0ull);
57974fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_update_16, 0x42ull);
58074fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_update_32, 0x4200ull);
58174fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_update_48, 0x4200ull);
58274fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_sext_48, 0x42ull);
58374fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip, pt_ipc_full, 0x42ull);
58474fe6c29SRuslan Bukin
58574fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pge, pt_ipc_suppressed, 0x0ull);
58674fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pge, pt_ipc_update_16, 0x42ull);
58774fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pge, pt_ipc_update_32, 0x4200ull);
58874fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pge, pt_ipc_update_48, 0x4200ull);
58974fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pge, pt_ipc_sext_48, 0x42ull);
59074fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pge, pt_ipc_full, 0x42ull);
59174fe6c29SRuslan Bukin
59274fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pgd, pt_ipc_suppressed, 0x0ull);
59374fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pgd, pt_ipc_update_16, 0x42ull);
59474fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pgd, pt_ipc_update_32, 0x4200ull);
59574fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pgd, pt_ipc_update_48, 0x4200ull);
59674fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pgd, pt_ipc_sext_48, 0x42ull);
59774fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_tip_pgd, pt_ipc_full, 0x42ull);
59874fe6c29SRuslan Bukin
59974fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_fup, pt_ipc_suppressed, 0x0ull);
60074fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_fup, pt_ipc_update_16, 0x42ull);
60174fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_fup, pt_ipc_update_32, 0x4200ull);
60274fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_fup, pt_ipc_update_48, 0x4200ull);
60374fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_fup, pt_ipc_sext_48, 0x42ull);
60474fe6c29SRuslan Bukin ptu_run_fp(suite, ip, pfix, ppt_fup, pt_ipc_full, 0x42ull);
60574fe6c29SRuslan Bukin
60674fe6c29SRuslan Bukin ptu_run_fp(suite, mode_exec, pfix, ptem_16bit);
60774fe6c29SRuslan Bukin ptu_run_fp(suite, mode_exec, pfix, ptem_32bit);
60874fe6c29SRuslan Bukin ptu_run_fp(suite, mode_exec, pfix, ptem_64bit);
60974fe6c29SRuslan Bukin ptu_run_f(suite, mode_tsx, pfix);
61074fe6c29SRuslan Bukin
61174fe6c29SRuslan Bukin ptu_run_f(suite, pip, pfix);
61274fe6c29SRuslan Bukin ptu_run_f(suite, tsc, pfix);
61374fe6c29SRuslan Bukin ptu_run_f(suite, cbr, pfix);
61474fe6c29SRuslan Bukin ptu_run_f(suite, tma, pfix);
61574fe6c29SRuslan Bukin ptu_run_f(suite, tma_bad, pfix);
61674fe6c29SRuslan Bukin ptu_run_f(suite, mtc, pfix);
61774fe6c29SRuslan Bukin ptu_run_f(suite, cyc, pfix);
61874fe6c29SRuslan Bukin ptu_run_f(suite, vmcs, pfix);
61974fe6c29SRuslan Bukin ptu_run_f(suite, mnt, pfix);
62074fe6c29SRuslan Bukin ptu_run_fp(suite, exstop, pfix, 0);
62174fe6c29SRuslan Bukin ptu_run_fp(suite, exstop, pfix, 1);
62274fe6c29SRuslan Bukin ptu_run_f(suite, mwait, pfix);
62374fe6c29SRuslan Bukin ptu_run_f(suite, pwre, pfix);
62474fe6c29SRuslan Bukin ptu_run_f(suite, pwrx, pfix);
62574fe6c29SRuslan Bukin ptu_run_fp(suite, ptw, pfix, 0, 1);
62674fe6c29SRuslan Bukin ptu_run_fp(suite, ptw, pfix, 1, 0);
62774fe6c29SRuslan Bukin
62874fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_psb);
62974fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff_ip, pfix, ppt_tip);
63074fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff_ip, pfix, ppt_tip_pge);
63174fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff_ip, pfix, ppt_tip_pgd);
63274fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff_ip, pfix, ppt_fup);
63374fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_ovf);
63474fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_psbend);
63574fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_tnt_64);
63674fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_tsc);
63774fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_cbr);
63874fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_tma);
63974fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_mtc);
64074fe6c29SRuslan Bukin ptu_run_f(suite, cutoff_cyc, pfix);
64174fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff_mode, pfix, pt_mol_exec);
64274fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff_mode, pfix, pt_mol_tsx);
64374fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_vmcs);
64474fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_mnt);
64574fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_exstop);
64674fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_mwait);
64774fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_pwre);
64874fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_pwrx);
64974fe6c29SRuslan Bukin ptu_run_fp(suite, cutoff, pfix, ppt_ptw);
65074fe6c29SRuslan Bukin
65174fe6c29SRuslan Bukin return ptunit_report(&suite);
65274fe6c29SRuslan Bukin }
65374fe6c29SRuslan Bukin
65474fe6c29SRuslan Bukin
65574fe6c29SRuslan Bukin /* Dummy decode functions to satisfy link dependencies.
65674fe6c29SRuslan Bukin *
65774fe6c29SRuslan Bukin * As a nice side-effect, we will know if we need to add more tests when
65874fe6c29SRuslan Bukin * adding new decoder functions.
65974fe6c29SRuslan Bukin */
66074fe6c29SRuslan Bukin struct pt_query_decoder;
66174fe6c29SRuslan Bukin
pt_qry_decode_unknown(struct pt_query_decoder * d)66274fe6c29SRuslan Bukin int pt_qry_decode_unknown(struct pt_query_decoder *d)
66374fe6c29SRuslan Bukin {
66474fe6c29SRuslan Bukin (void) d;
66574fe6c29SRuslan Bukin
66674fe6c29SRuslan Bukin return -pte_internal;
66774fe6c29SRuslan Bukin }
pt_qry_decode_pad(struct pt_query_decoder * d)66874fe6c29SRuslan Bukin int pt_qry_decode_pad(struct pt_query_decoder *d)
66974fe6c29SRuslan Bukin {
67074fe6c29SRuslan Bukin (void) d;
67174fe6c29SRuslan Bukin
67274fe6c29SRuslan Bukin return -pte_internal;
67374fe6c29SRuslan Bukin }
pt_qry_decode_psb(struct pt_query_decoder * d)67474fe6c29SRuslan Bukin int pt_qry_decode_psb(struct pt_query_decoder *d)
67574fe6c29SRuslan Bukin {
67674fe6c29SRuslan Bukin (void) d;
67774fe6c29SRuslan Bukin
67874fe6c29SRuslan Bukin return -pte_internal;
67974fe6c29SRuslan Bukin }
pt_qry_decode_tip(struct pt_query_decoder * d)68074fe6c29SRuslan Bukin int pt_qry_decode_tip(struct pt_query_decoder *d)
68174fe6c29SRuslan Bukin {
68274fe6c29SRuslan Bukin (void) d;
68374fe6c29SRuslan Bukin
68474fe6c29SRuslan Bukin return -pte_internal;
68574fe6c29SRuslan Bukin }
pt_qry_decode_tnt_8(struct pt_query_decoder * d)68674fe6c29SRuslan Bukin int pt_qry_decode_tnt_8(struct pt_query_decoder *d)
68774fe6c29SRuslan Bukin {
68874fe6c29SRuslan Bukin (void) d;
68974fe6c29SRuslan Bukin
69074fe6c29SRuslan Bukin return -pte_internal;
69174fe6c29SRuslan Bukin }
pt_qry_decode_tnt_64(struct pt_query_decoder * d)69274fe6c29SRuslan Bukin int pt_qry_decode_tnt_64(struct pt_query_decoder *d)
69374fe6c29SRuslan Bukin {
69474fe6c29SRuslan Bukin (void) d;
69574fe6c29SRuslan Bukin
69674fe6c29SRuslan Bukin return -pte_internal;
69774fe6c29SRuslan Bukin }
pt_qry_decode_tip_pge(struct pt_query_decoder * d)69874fe6c29SRuslan Bukin int pt_qry_decode_tip_pge(struct pt_query_decoder *d)
69974fe6c29SRuslan Bukin {
70074fe6c29SRuslan Bukin (void) d;
70174fe6c29SRuslan Bukin
70274fe6c29SRuslan Bukin return -pte_internal;
70374fe6c29SRuslan Bukin }
pt_qry_decode_tip_pgd(struct pt_query_decoder * d)70474fe6c29SRuslan Bukin int pt_qry_decode_tip_pgd(struct pt_query_decoder *d)
70574fe6c29SRuslan Bukin {
70674fe6c29SRuslan Bukin (void) d;
70774fe6c29SRuslan Bukin
70874fe6c29SRuslan Bukin return -pte_internal;
70974fe6c29SRuslan Bukin }
pt_qry_decode_fup(struct pt_query_decoder * d)71074fe6c29SRuslan Bukin int pt_qry_decode_fup(struct pt_query_decoder *d)
71174fe6c29SRuslan Bukin {
71274fe6c29SRuslan Bukin (void) d;
71374fe6c29SRuslan Bukin
71474fe6c29SRuslan Bukin return -pte_internal;
71574fe6c29SRuslan Bukin }
pt_qry_header_fup(struct pt_query_decoder * d)71674fe6c29SRuslan Bukin int pt_qry_header_fup(struct pt_query_decoder *d)
71774fe6c29SRuslan Bukin {
71874fe6c29SRuslan Bukin (void) d;
71974fe6c29SRuslan Bukin
72074fe6c29SRuslan Bukin return -pte_internal;
72174fe6c29SRuslan Bukin }
pt_qry_decode_pip(struct pt_query_decoder * d)72274fe6c29SRuslan Bukin int pt_qry_decode_pip(struct pt_query_decoder *d)
72374fe6c29SRuslan Bukin {
72474fe6c29SRuslan Bukin (void) d;
72574fe6c29SRuslan Bukin
72674fe6c29SRuslan Bukin return -pte_internal;
72774fe6c29SRuslan Bukin }
pt_qry_header_pip(struct pt_query_decoder * d)72874fe6c29SRuslan Bukin int pt_qry_header_pip(struct pt_query_decoder *d)
72974fe6c29SRuslan Bukin {
73074fe6c29SRuslan Bukin (void) d;
73174fe6c29SRuslan Bukin
73274fe6c29SRuslan Bukin return -pte_internal;
73374fe6c29SRuslan Bukin }
pt_qry_decode_ovf(struct pt_query_decoder * d)73474fe6c29SRuslan Bukin int pt_qry_decode_ovf(struct pt_query_decoder *d)
73574fe6c29SRuslan Bukin {
73674fe6c29SRuslan Bukin (void) d;
73774fe6c29SRuslan Bukin
73874fe6c29SRuslan Bukin return -pte_internal;
73974fe6c29SRuslan Bukin }
pt_qry_decode_mode(struct pt_query_decoder * d)74074fe6c29SRuslan Bukin int pt_qry_decode_mode(struct pt_query_decoder *d)
74174fe6c29SRuslan Bukin {
74274fe6c29SRuslan Bukin (void) d;
74374fe6c29SRuslan Bukin
74474fe6c29SRuslan Bukin return -pte_internal;
74574fe6c29SRuslan Bukin }
pt_qry_header_mode(struct pt_query_decoder * d)74674fe6c29SRuslan Bukin int pt_qry_header_mode(struct pt_query_decoder *d)
74774fe6c29SRuslan Bukin {
74874fe6c29SRuslan Bukin (void) d;
74974fe6c29SRuslan Bukin
75074fe6c29SRuslan Bukin return -pte_internal;
75174fe6c29SRuslan Bukin }
pt_qry_decode_psbend(struct pt_query_decoder * d)75274fe6c29SRuslan Bukin int pt_qry_decode_psbend(struct pt_query_decoder *d)
75374fe6c29SRuslan Bukin {
75474fe6c29SRuslan Bukin (void) d;
75574fe6c29SRuslan Bukin
75674fe6c29SRuslan Bukin return -pte_internal;
75774fe6c29SRuslan Bukin }
pt_qry_decode_tsc(struct pt_query_decoder * d)75874fe6c29SRuslan Bukin int pt_qry_decode_tsc(struct pt_query_decoder *d)
75974fe6c29SRuslan Bukin {
76074fe6c29SRuslan Bukin (void) d;
76174fe6c29SRuslan Bukin
76274fe6c29SRuslan Bukin return -pte_internal;
76374fe6c29SRuslan Bukin }
pt_qry_header_tsc(struct pt_query_decoder * d)76474fe6c29SRuslan Bukin int pt_qry_header_tsc(struct pt_query_decoder *d)
76574fe6c29SRuslan Bukin {
76674fe6c29SRuslan Bukin (void) d;
76774fe6c29SRuslan Bukin
76874fe6c29SRuslan Bukin return -pte_internal;
76974fe6c29SRuslan Bukin }
pt_qry_decode_cbr(struct pt_query_decoder * d)77074fe6c29SRuslan Bukin int pt_qry_decode_cbr(struct pt_query_decoder *d)
77174fe6c29SRuslan Bukin {
77274fe6c29SRuslan Bukin (void) d;
77374fe6c29SRuslan Bukin
77474fe6c29SRuslan Bukin return -pte_internal;
77574fe6c29SRuslan Bukin }
pt_qry_header_cbr(struct pt_query_decoder * d)77674fe6c29SRuslan Bukin int pt_qry_header_cbr(struct pt_query_decoder *d)
77774fe6c29SRuslan Bukin {
77874fe6c29SRuslan Bukin (void) d;
77974fe6c29SRuslan Bukin
78074fe6c29SRuslan Bukin return -pte_internal;
78174fe6c29SRuslan Bukin }
pt_qry_decode_tma(struct pt_query_decoder * d)78274fe6c29SRuslan Bukin int pt_qry_decode_tma(struct pt_query_decoder *d)
78374fe6c29SRuslan Bukin {
78474fe6c29SRuslan Bukin (void) d;
78574fe6c29SRuslan Bukin
78674fe6c29SRuslan Bukin return -pte_internal;
78774fe6c29SRuslan Bukin }
pt_qry_decode_mtc(struct pt_query_decoder * d)78874fe6c29SRuslan Bukin int pt_qry_decode_mtc(struct pt_query_decoder *d)
78974fe6c29SRuslan Bukin {
79074fe6c29SRuslan Bukin (void) d;
79174fe6c29SRuslan Bukin
79274fe6c29SRuslan Bukin return -pte_internal;
79374fe6c29SRuslan Bukin }
pt_qry_decode_cyc(struct pt_query_decoder * d)79474fe6c29SRuslan Bukin int pt_qry_decode_cyc(struct pt_query_decoder *d)
79574fe6c29SRuslan Bukin {
79674fe6c29SRuslan Bukin (void) d;
79774fe6c29SRuslan Bukin
79874fe6c29SRuslan Bukin return -pte_internal;
79974fe6c29SRuslan Bukin }
pt_qry_decode_stop(struct pt_query_decoder * d)80074fe6c29SRuslan Bukin int pt_qry_decode_stop(struct pt_query_decoder *d)
80174fe6c29SRuslan Bukin {
80274fe6c29SRuslan Bukin (void) d;
80374fe6c29SRuslan Bukin
80474fe6c29SRuslan Bukin return -pte_internal;
80574fe6c29SRuslan Bukin }
pt_qry_decode_vmcs(struct pt_query_decoder * d)80674fe6c29SRuslan Bukin int pt_qry_decode_vmcs(struct pt_query_decoder *d)
80774fe6c29SRuslan Bukin {
80874fe6c29SRuslan Bukin (void) d;
80974fe6c29SRuslan Bukin
81074fe6c29SRuslan Bukin return -pte_internal;
81174fe6c29SRuslan Bukin }
pt_qry_header_vmcs(struct pt_query_decoder * d)81274fe6c29SRuslan Bukin int pt_qry_header_vmcs(struct pt_query_decoder *d)
81374fe6c29SRuslan Bukin {
81474fe6c29SRuslan Bukin (void) d;
81574fe6c29SRuslan Bukin
81674fe6c29SRuslan Bukin return -pte_internal;
81774fe6c29SRuslan Bukin }
pt_qry_decode_mnt(struct pt_query_decoder * d)81874fe6c29SRuslan Bukin int pt_qry_decode_mnt(struct pt_query_decoder *d)
81974fe6c29SRuslan Bukin {
82074fe6c29SRuslan Bukin (void) d;
82174fe6c29SRuslan Bukin
82274fe6c29SRuslan Bukin return -pte_internal;
82374fe6c29SRuslan Bukin }
pt_qry_header_mnt(struct pt_query_decoder * d)82474fe6c29SRuslan Bukin int pt_qry_header_mnt(struct pt_query_decoder *d)
82574fe6c29SRuslan Bukin {
82674fe6c29SRuslan Bukin (void) d;
82774fe6c29SRuslan Bukin
82874fe6c29SRuslan Bukin return -pte_internal;
82974fe6c29SRuslan Bukin }
pt_qry_decode_exstop(struct pt_query_decoder * d)83074fe6c29SRuslan Bukin int pt_qry_decode_exstop(struct pt_query_decoder *d)
83174fe6c29SRuslan Bukin {
83274fe6c29SRuslan Bukin (void) d;
83374fe6c29SRuslan Bukin
83474fe6c29SRuslan Bukin return -pte_internal;
83574fe6c29SRuslan Bukin }
pt_qry_decode_mwait(struct pt_query_decoder * d)83674fe6c29SRuslan Bukin int pt_qry_decode_mwait(struct pt_query_decoder *d)
83774fe6c29SRuslan Bukin {
83874fe6c29SRuslan Bukin (void) d;
83974fe6c29SRuslan Bukin
84074fe6c29SRuslan Bukin return -pte_internal;
84174fe6c29SRuslan Bukin }
pt_qry_decode_pwre(struct pt_query_decoder * d)84274fe6c29SRuslan Bukin int pt_qry_decode_pwre(struct pt_query_decoder *d)
84374fe6c29SRuslan Bukin {
84474fe6c29SRuslan Bukin (void) d;
84574fe6c29SRuslan Bukin
84674fe6c29SRuslan Bukin return -pte_internal;
84774fe6c29SRuslan Bukin }
pt_qry_decode_pwrx(struct pt_query_decoder * d)84874fe6c29SRuslan Bukin int pt_qry_decode_pwrx(struct pt_query_decoder *d)
84974fe6c29SRuslan Bukin {
85074fe6c29SRuslan Bukin (void) d;
85174fe6c29SRuslan Bukin
85274fe6c29SRuslan Bukin return -pte_internal;
85374fe6c29SRuslan Bukin }
pt_qry_decode_ptw(struct pt_query_decoder * d)85474fe6c29SRuslan Bukin int pt_qry_decode_ptw(struct pt_query_decoder *d)
85574fe6c29SRuslan Bukin {
85674fe6c29SRuslan Bukin (void) d;
85774fe6c29SRuslan Bukin
85874fe6c29SRuslan Bukin return -pte_internal;
85974fe6c29SRuslan Bukin }
860