174fe6c29SRuslan Bukin /*
285f87cf4SRuslan 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 "pt_time.h"
3074fe6c29SRuslan Bukin 
3174fe6c29SRuslan Bukin #include "intel-pt.h"
3274fe6c29SRuslan Bukin 
3374fe6c29SRuslan Bukin #include "ptunit.h"
3474fe6c29SRuslan Bukin 
3574fe6c29SRuslan Bukin 
3674fe6c29SRuslan Bukin /* A time unit test fixture. */
3774fe6c29SRuslan Bukin 
3874fe6c29SRuslan Bukin struct time_fixture {
3974fe6c29SRuslan Bukin 	/* The configuration to use. */
4074fe6c29SRuslan Bukin 	struct pt_config config;
4174fe6c29SRuslan Bukin 
4274fe6c29SRuslan Bukin 	/* The calibration to use. */
4374fe6c29SRuslan Bukin 	struct pt_time_cal tcal;
4474fe6c29SRuslan Bukin 
4574fe6c29SRuslan Bukin 	/* The time struct to update. */
4674fe6c29SRuslan Bukin 	struct pt_time time;
4774fe6c29SRuslan Bukin 
4874fe6c29SRuslan Bukin 	/* The test fixture initialization and finalization functions. */
4974fe6c29SRuslan Bukin 	struct ptunit_result (*init)(struct time_fixture *);
5074fe6c29SRuslan Bukin 	struct ptunit_result (*fini)(struct time_fixture *);
5174fe6c29SRuslan Bukin };
5274fe6c29SRuslan Bukin 
tfix_init(struct time_fixture * tfix)5374fe6c29SRuslan Bukin static struct ptunit_result tfix_init(struct time_fixture *tfix)
5474fe6c29SRuslan Bukin {
5574fe6c29SRuslan Bukin 	memset(&tfix->config, 0, sizeof(tfix->config));
5674fe6c29SRuslan Bukin 	tfix->config.size = sizeof(tfix->config);
5774fe6c29SRuslan Bukin 	tfix->config.cpuid_0x15_eax = 2;
5874fe6c29SRuslan Bukin 	tfix->config.cpuid_0x15_ebx = 1;
5974fe6c29SRuslan Bukin 	tfix->config.mtc_freq = 4;
6074fe6c29SRuslan Bukin 
6174fe6c29SRuslan Bukin 	pt_tcal_init(&tfix->tcal);
6274fe6c29SRuslan Bukin 	pt_tcal_set_fcr(&tfix->tcal, 0x2ull << pt_tcal_fcr_shr);
6374fe6c29SRuslan Bukin 
6474fe6c29SRuslan Bukin 	pt_time_init(&tfix->time);
6574fe6c29SRuslan Bukin 
6674fe6c29SRuslan Bukin 	return ptu_passed();
6774fe6c29SRuslan Bukin }
6874fe6c29SRuslan Bukin 
6974fe6c29SRuslan Bukin 
tsc_null(struct time_fixture * tfix)7074fe6c29SRuslan Bukin static struct ptunit_result tsc_null(struct time_fixture *tfix)
7174fe6c29SRuslan Bukin {
7274fe6c29SRuslan Bukin 	struct pt_packet_tsc packet;
7374fe6c29SRuslan Bukin 	int errcode;
7474fe6c29SRuslan Bukin 
7574fe6c29SRuslan Bukin 	errcode = pt_time_update_tsc(NULL, &packet, &tfix->config);
7674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
7774fe6c29SRuslan Bukin 
7874fe6c29SRuslan Bukin 	errcode = pt_time_update_tsc(&tfix->time, NULL, &tfix->config);
7974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
8074fe6c29SRuslan Bukin 
8174fe6c29SRuslan Bukin 	return ptu_passed();
8274fe6c29SRuslan Bukin }
8374fe6c29SRuslan Bukin 
cbr_null(struct time_fixture * tfix)8474fe6c29SRuslan Bukin static struct ptunit_result cbr_null(struct time_fixture *tfix)
8574fe6c29SRuslan Bukin {
8674fe6c29SRuslan Bukin 	struct pt_packet_cbr packet;
8774fe6c29SRuslan Bukin 	int errcode;
8874fe6c29SRuslan Bukin 
8974fe6c29SRuslan Bukin 	errcode = pt_time_update_cbr(NULL, &packet, &tfix->config);
9074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
9174fe6c29SRuslan Bukin 
9274fe6c29SRuslan Bukin 	errcode = pt_time_update_cbr(&tfix->time, NULL, &tfix->config);
9374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
9474fe6c29SRuslan Bukin 
9574fe6c29SRuslan Bukin 	return ptu_passed();
9674fe6c29SRuslan Bukin }
9774fe6c29SRuslan Bukin 
tma_null(struct time_fixture * tfix)9874fe6c29SRuslan Bukin static struct ptunit_result tma_null(struct time_fixture *tfix)
9974fe6c29SRuslan Bukin {
10074fe6c29SRuslan Bukin 	struct pt_packet_tma packet;
10174fe6c29SRuslan Bukin 	int errcode;
10274fe6c29SRuslan Bukin 
10374fe6c29SRuslan Bukin 	errcode = pt_time_update_tma(NULL, &packet, &tfix->config);
10474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
10574fe6c29SRuslan Bukin 
10674fe6c29SRuslan Bukin 	errcode = pt_time_update_tma(&tfix->time, NULL, &tfix->config);
10774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
10874fe6c29SRuslan Bukin 
10974fe6c29SRuslan Bukin 	errcode = pt_time_update_tma(&tfix->time, &packet, NULL);
11074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
11174fe6c29SRuslan Bukin 
11274fe6c29SRuslan Bukin 	return ptu_passed();
11374fe6c29SRuslan Bukin }
11474fe6c29SRuslan Bukin 
mtc_null(struct time_fixture * tfix)11574fe6c29SRuslan Bukin static struct ptunit_result mtc_null(struct time_fixture *tfix)
11674fe6c29SRuslan Bukin {
11774fe6c29SRuslan Bukin 	struct pt_packet_mtc packet;
11874fe6c29SRuslan Bukin 	int errcode;
11974fe6c29SRuslan Bukin 
12074fe6c29SRuslan Bukin 	errcode = pt_time_update_mtc(NULL, &packet, &tfix->config);
12174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
12274fe6c29SRuslan Bukin 
12374fe6c29SRuslan Bukin 	errcode = pt_time_update_mtc(&tfix->time, NULL, &tfix->config);
12474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
12574fe6c29SRuslan Bukin 
12674fe6c29SRuslan Bukin 	errcode = pt_time_update_mtc(&tfix->time, &packet, NULL);
12774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
12874fe6c29SRuslan Bukin 
12974fe6c29SRuslan Bukin 	return ptu_passed();
13074fe6c29SRuslan Bukin }
13174fe6c29SRuslan Bukin 
cyc_null(struct time_fixture * tfix)13274fe6c29SRuslan Bukin static struct ptunit_result cyc_null(struct time_fixture *tfix)
13374fe6c29SRuslan Bukin {
13474fe6c29SRuslan Bukin 	struct pt_packet_cyc packet;
13574fe6c29SRuslan Bukin 	int errcode;
13674fe6c29SRuslan Bukin 
13774fe6c29SRuslan Bukin 	errcode = pt_time_update_cyc(NULL, &packet, &tfix->config, 0ull);
13874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
13974fe6c29SRuslan Bukin 
14074fe6c29SRuslan Bukin 	errcode = pt_time_update_cyc(&tfix->time, NULL, &tfix->config, 0ull);
14174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
14274fe6c29SRuslan Bukin 
14374fe6c29SRuslan Bukin 	errcode = pt_time_update_cyc(&tfix->time, &packet, NULL, 0ull);
14474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
14574fe6c29SRuslan Bukin 
14674fe6c29SRuslan Bukin 	return ptu_passed();
14774fe6c29SRuslan Bukin }
14874fe6c29SRuslan Bukin 
query_tsc_null(struct time_fixture * tfix)14974fe6c29SRuslan Bukin static struct ptunit_result query_tsc_null(struct time_fixture *tfix)
15074fe6c29SRuslan Bukin {
15174fe6c29SRuslan Bukin 	uint64_t tsc;
15274fe6c29SRuslan Bukin 	int errcode;
15374fe6c29SRuslan Bukin 
15474fe6c29SRuslan Bukin 	errcode = pt_time_query_tsc(NULL, NULL, NULL, &tfix->time);
15574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
15674fe6c29SRuslan Bukin 
15774fe6c29SRuslan Bukin 	errcode = pt_time_query_tsc(&tsc, NULL, NULL, NULL);
15874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
15974fe6c29SRuslan Bukin 
16074fe6c29SRuslan Bukin 	return ptu_passed();
16174fe6c29SRuslan Bukin }
16274fe6c29SRuslan Bukin 
query_tsc_none(struct time_fixture * tfix)16374fe6c29SRuslan Bukin static struct ptunit_result query_tsc_none(struct time_fixture *tfix)
16474fe6c29SRuslan Bukin {
16574fe6c29SRuslan Bukin 	uint64_t tsc;
16674fe6c29SRuslan Bukin 	int errcode;
16774fe6c29SRuslan Bukin 
16874fe6c29SRuslan Bukin 	errcode = pt_time_query_tsc(&tsc, NULL, NULL, &tfix->time);
16974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_no_time);
17074fe6c29SRuslan Bukin 
17174fe6c29SRuslan Bukin 	return ptu_passed();
17274fe6c29SRuslan Bukin }
17374fe6c29SRuslan Bukin 
query_cbr_null(struct time_fixture * tfix)17474fe6c29SRuslan Bukin static struct ptunit_result query_cbr_null(struct time_fixture *tfix)
17574fe6c29SRuslan Bukin {
17674fe6c29SRuslan Bukin 	uint32_t cbr;
17774fe6c29SRuslan Bukin 	int errcode;
17874fe6c29SRuslan Bukin 
17974fe6c29SRuslan Bukin 	errcode = pt_time_query_cbr(NULL, &tfix->time);
18074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
18174fe6c29SRuslan Bukin 
18274fe6c29SRuslan Bukin 	errcode = pt_time_query_cbr(&cbr, NULL);
18374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
18474fe6c29SRuslan Bukin 
18574fe6c29SRuslan Bukin 	return ptu_passed();
18674fe6c29SRuslan Bukin }
18774fe6c29SRuslan Bukin 
query_cbr_none(struct time_fixture * tfix)18874fe6c29SRuslan Bukin static struct ptunit_result query_cbr_none(struct time_fixture *tfix)
18974fe6c29SRuslan Bukin {
19074fe6c29SRuslan Bukin 	uint32_t cbr;
19174fe6c29SRuslan Bukin 	int errcode;
19274fe6c29SRuslan Bukin 
19374fe6c29SRuslan Bukin 	errcode = pt_time_query_cbr(&cbr, &tfix->time);
19474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_no_cbr);
19574fe6c29SRuslan Bukin 
19674fe6c29SRuslan Bukin 	return ptu_passed();
19774fe6c29SRuslan Bukin }
19874fe6c29SRuslan Bukin 
tcal_cbr_null(struct time_fixture * tfix)19974fe6c29SRuslan Bukin static struct ptunit_result tcal_cbr_null(struct time_fixture *tfix)
20074fe6c29SRuslan Bukin {
20174fe6c29SRuslan Bukin 	struct pt_packet_cbr packet;
20274fe6c29SRuslan Bukin 	int errcode;
20374fe6c29SRuslan Bukin 
20474fe6c29SRuslan Bukin 	errcode = pt_tcal_update_cbr(NULL, &packet, &tfix->config);
20574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
20674fe6c29SRuslan Bukin 
20774fe6c29SRuslan Bukin 	return ptu_passed();
20874fe6c29SRuslan Bukin }
20974fe6c29SRuslan Bukin 
tcal_cbr_zero(struct time_fixture * tfix)21085f87cf4SRuslan Bukin static struct ptunit_result tcal_cbr_zero(struct time_fixture *tfix)
21185f87cf4SRuslan Bukin {
21285f87cf4SRuslan Bukin 	struct pt_packet_cbr packet;
21385f87cf4SRuslan Bukin 	struct pt_config config;
21485f87cf4SRuslan Bukin 	int errcode;
21585f87cf4SRuslan Bukin 
21685f87cf4SRuslan Bukin 	config = tfix->config;
21785f87cf4SRuslan Bukin 	config.nom_freq = 1;
21885f87cf4SRuslan Bukin 	packet.ratio = 0;
21985f87cf4SRuslan Bukin 
22085f87cf4SRuslan Bukin 	errcode = pt_tcal_update_cbr(&tfix->tcal, &packet, &config);
22185f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_packet);
22285f87cf4SRuslan Bukin 
22385f87cf4SRuslan Bukin 	return ptu_passed();
22485f87cf4SRuslan Bukin }
22585f87cf4SRuslan Bukin 
tcal_mtc_null(struct time_fixture * tfix)22674fe6c29SRuslan Bukin static struct ptunit_result tcal_mtc_null(struct time_fixture *tfix)
22774fe6c29SRuslan Bukin {
22874fe6c29SRuslan Bukin 	struct pt_packet_mtc packet;
22974fe6c29SRuslan Bukin 	int errcode;
23074fe6c29SRuslan Bukin 
23174fe6c29SRuslan Bukin 	errcode = pt_tcal_update_mtc(NULL, &packet, &tfix->config);
23274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
23374fe6c29SRuslan Bukin 
23474fe6c29SRuslan Bukin 	errcode = pt_tcal_update_mtc(&tfix->tcal, NULL, &tfix->config);
23574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
23674fe6c29SRuslan Bukin 
23774fe6c29SRuslan Bukin 	errcode = pt_tcal_update_mtc(&tfix->tcal, &packet, NULL);
23874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
23974fe6c29SRuslan Bukin 
24074fe6c29SRuslan Bukin 	return ptu_passed();
24174fe6c29SRuslan Bukin }
24274fe6c29SRuslan Bukin 
tcal_cyc_null(struct time_fixture * tfix)24374fe6c29SRuslan Bukin static struct ptunit_result tcal_cyc_null(struct time_fixture *tfix)
24474fe6c29SRuslan Bukin {
24574fe6c29SRuslan Bukin 	struct pt_packet_cyc packet;
24674fe6c29SRuslan Bukin 	int errcode;
24774fe6c29SRuslan Bukin 
24874fe6c29SRuslan Bukin 	errcode = pt_tcal_update_cyc(NULL, &packet, &tfix->config);
24974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
25074fe6c29SRuslan Bukin 
25174fe6c29SRuslan Bukin 	errcode = pt_tcal_update_cyc(&tfix->tcal, NULL, &tfix->config);
25274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
25374fe6c29SRuslan Bukin 
25474fe6c29SRuslan Bukin 	return ptu_passed();
25574fe6c29SRuslan Bukin }
25674fe6c29SRuslan Bukin 
tsc(struct time_fixture * tfix)25774fe6c29SRuslan Bukin static struct ptunit_result tsc(struct time_fixture *tfix)
25874fe6c29SRuslan Bukin {
25974fe6c29SRuslan Bukin 	struct pt_packet_tsc packet;
26074fe6c29SRuslan Bukin 	uint64_t tsc;
26174fe6c29SRuslan Bukin 	uint32_t lost_mtc, lost_cyc;
26274fe6c29SRuslan Bukin 	int errcode;
26374fe6c29SRuslan Bukin 
26474fe6c29SRuslan Bukin 	packet.tsc = 0xdedededeull;
26574fe6c29SRuslan Bukin 
26674fe6c29SRuslan Bukin 	errcode = pt_time_update_tsc(&tfix->time, &packet, &tfix->config);
26774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
26874fe6c29SRuslan Bukin 
26974fe6c29SRuslan Bukin 	errcode = pt_time_query_tsc(&tsc, &lost_mtc, &lost_cyc, &tfix->time);
27074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
27174fe6c29SRuslan Bukin 
27274fe6c29SRuslan Bukin 	ptu_uint_eq(tsc, 0xdedededeull);
27374fe6c29SRuslan Bukin 	ptu_uint_eq(lost_mtc, 0);
27474fe6c29SRuslan Bukin 	ptu_uint_eq(lost_cyc, 0);
27574fe6c29SRuslan Bukin 
27674fe6c29SRuslan Bukin 	return ptu_passed();
27774fe6c29SRuslan Bukin }
27874fe6c29SRuslan Bukin 
cbr(struct time_fixture * tfix)27974fe6c29SRuslan Bukin static struct ptunit_result cbr(struct time_fixture *tfix)
28074fe6c29SRuslan Bukin {
28174fe6c29SRuslan Bukin 	struct pt_packet_cbr packet;
28274fe6c29SRuslan Bukin 	uint32_t cbr;
28374fe6c29SRuslan Bukin 	int errcode;
28474fe6c29SRuslan Bukin 
28574fe6c29SRuslan Bukin 	packet.ratio = 0x38;
28674fe6c29SRuslan Bukin 
28774fe6c29SRuslan Bukin 	errcode = pt_time_update_cbr(&tfix->time, &packet, &tfix->config);
28874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
28974fe6c29SRuslan Bukin 
29074fe6c29SRuslan Bukin 	errcode = pt_time_query_cbr(&cbr, &tfix->time);
29174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
29274fe6c29SRuslan Bukin 
29374fe6c29SRuslan Bukin 	ptu_uint_eq(cbr, 0x38);
29474fe6c29SRuslan Bukin 
29574fe6c29SRuslan Bukin 	return ptu_passed();
29674fe6c29SRuslan Bukin }
29774fe6c29SRuslan Bukin 
cbr_zero(struct time_fixture * tfix)29885f87cf4SRuslan Bukin static struct ptunit_result cbr_zero(struct time_fixture *tfix)
29985f87cf4SRuslan Bukin {
30085f87cf4SRuslan Bukin 	struct pt_packet_cbr packet;
30185f87cf4SRuslan Bukin 	int errcode;
30285f87cf4SRuslan Bukin 
30385f87cf4SRuslan Bukin 	packet.ratio = 0;
30485f87cf4SRuslan Bukin 
30585f87cf4SRuslan Bukin 	errcode = pt_time_update_cbr(&tfix->time, &packet, &tfix->config);
30685f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_packet);
30785f87cf4SRuslan Bukin 
30885f87cf4SRuslan Bukin 	return ptu_passed();
30985f87cf4SRuslan Bukin }
31085f87cf4SRuslan Bukin 
tma(struct time_fixture * tfix)31174fe6c29SRuslan Bukin static struct ptunit_result tma(struct time_fixture *tfix)
31274fe6c29SRuslan Bukin {
31374fe6c29SRuslan Bukin 	struct pt_packet_tma packet;
31474fe6c29SRuslan Bukin 	int errcode;
31574fe6c29SRuslan Bukin 
31674fe6c29SRuslan Bukin 	packet.ctc = 0xdc;
31774fe6c29SRuslan Bukin 	packet.fc = 0xf;
31874fe6c29SRuslan Bukin 
31974fe6c29SRuslan Bukin 	errcode = pt_time_update_tma(&tfix->time, &packet, &tfix->config);
32074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_context);
32174fe6c29SRuslan Bukin 
32274fe6c29SRuslan Bukin 	return ptu_passed();
32374fe6c29SRuslan Bukin }
32474fe6c29SRuslan Bukin 
mtc(struct time_fixture * tfix)32574fe6c29SRuslan Bukin static struct ptunit_result mtc(struct time_fixture *tfix)
32674fe6c29SRuslan Bukin {
32774fe6c29SRuslan Bukin 	struct pt_packet_mtc packet;
32874fe6c29SRuslan Bukin 	uint64_t tsc;
32974fe6c29SRuslan Bukin 	int errcode;
33074fe6c29SRuslan Bukin 
33174fe6c29SRuslan Bukin 	packet.ctc = 0xdc;
33274fe6c29SRuslan Bukin 
33374fe6c29SRuslan Bukin 	errcode = pt_time_update_mtc(&tfix->time, &packet, &tfix->config);
33474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
33574fe6c29SRuslan Bukin 
33674fe6c29SRuslan Bukin 	errcode = pt_time_query_tsc(&tsc, NULL, NULL, &tfix->time);
33774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_no_time);
33874fe6c29SRuslan Bukin 
33974fe6c29SRuslan Bukin 	return ptu_passed();
34074fe6c29SRuslan Bukin }
34174fe6c29SRuslan Bukin 
cyc(struct time_fixture * tfix)34274fe6c29SRuslan Bukin static struct ptunit_result cyc(struct time_fixture *tfix)
34374fe6c29SRuslan Bukin {
34474fe6c29SRuslan Bukin 	struct pt_packet_cyc packet;
34574fe6c29SRuslan Bukin 	uint64_t fcr, tsc;
34674fe6c29SRuslan Bukin 	int errcode;
34774fe6c29SRuslan Bukin 
34874fe6c29SRuslan Bukin 	errcode = pt_tcal_fcr(&fcr, &tfix->tcal);
34974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
35074fe6c29SRuslan Bukin 
35174fe6c29SRuslan Bukin 	packet.value = 0xdc;
35274fe6c29SRuslan Bukin 
35374fe6c29SRuslan Bukin 	errcode = pt_time_update_cyc(&tfix->time, &packet, &tfix->config, fcr);
35474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
35574fe6c29SRuslan Bukin 
35674fe6c29SRuslan Bukin 	errcode = pt_time_query_tsc(&tsc, NULL, NULL, &tfix->time);
35774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_no_time);
35874fe6c29SRuslan Bukin 
35974fe6c29SRuslan Bukin 	return ptu_passed();
36074fe6c29SRuslan Bukin }
36174fe6c29SRuslan Bukin 
36274fe6c29SRuslan Bukin 
main(int argc,char ** argv)36374fe6c29SRuslan Bukin int main(int argc, char **argv)
36474fe6c29SRuslan Bukin {
36574fe6c29SRuslan Bukin 	struct ptunit_suite suite;
36674fe6c29SRuslan Bukin 	struct time_fixture tfix;
36774fe6c29SRuslan Bukin 
36874fe6c29SRuslan Bukin 	suite = ptunit_mk_suite(argc, argv);
36974fe6c29SRuslan Bukin 
37074fe6c29SRuslan Bukin 	tfix.init = tfix_init;
37174fe6c29SRuslan Bukin 	tfix.fini = NULL;
37274fe6c29SRuslan Bukin 
37374fe6c29SRuslan Bukin 	ptu_run_f(suite, tsc_null, tfix);
37474fe6c29SRuslan Bukin 	ptu_run_f(suite, cbr_null, tfix);
37574fe6c29SRuslan Bukin 	ptu_run_f(suite, tma_null, tfix);
37674fe6c29SRuslan Bukin 	ptu_run_f(suite, mtc_null, tfix);
37774fe6c29SRuslan Bukin 	ptu_run_f(suite, cyc_null, tfix);
37874fe6c29SRuslan Bukin 
37974fe6c29SRuslan Bukin 	ptu_run_f(suite, query_tsc_null, tfix);
38074fe6c29SRuslan Bukin 	ptu_run_f(suite, query_tsc_none, tfix);
38174fe6c29SRuslan Bukin 	ptu_run_f(suite, query_cbr_null, tfix);
38274fe6c29SRuslan Bukin 	ptu_run_f(suite, query_cbr_none, tfix);
38374fe6c29SRuslan Bukin 
38474fe6c29SRuslan Bukin 	ptu_run_f(suite, tcal_cbr_null, tfix);
38585f87cf4SRuslan Bukin 	ptu_run_f(suite, tcal_cbr_zero, tfix);
38674fe6c29SRuslan Bukin 	ptu_run_f(suite, tcal_mtc_null, tfix);
38774fe6c29SRuslan Bukin 	ptu_run_f(suite, tcal_cyc_null, tfix);
38874fe6c29SRuslan Bukin 
38974fe6c29SRuslan Bukin 	ptu_run_f(suite, tsc, tfix);
39074fe6c29SRuslan Bukin 	ptu_run_f(suite, cbr, tfix);
39185f87cf4SRuslan Bukin 	ptu_run_f(suite, cbr_zero, tfix);
39274fe6c29SRuslan Bukin 	ptu_run_f(suite, tma, tfix);
39374fe6c29SRuslan Bukin 	ptu_run_f(suite, mtc, tfix);
39474fe6c29SRuslan Bukin 	ptu_run_f(suite, cyc, tfix);
39574fe6c29SRuslan Bukin 
39674fe6c29SRuslan Bukin 	/* The bulk is covered in ptt tests. */
39774fe6c29SRuslan Bukin 
39874fe6c29SRuslan Bukin 	return ptunit_report(&suite);
39974fe6c29SRuslan Bukin }
400