xref: /freebsd-src/contrib/processor-trace/libipt/test/src/ptunit-sync.c (revision 85f87cf491bec6f90948a85b10f5523ea24db9e3)
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_sync.h"
3274fe6c29SRuslan Bukin #include "pt_opcodes.h"
3374fe6c29SRuslan Bukin 
3474fe6c29SRuslan Bukin #include "intel-pt.h"
3574fe6c29SRuslan Bukin 
3674fe6c29SRuslan Bukin 
3774fe6c29SRuslan Bukin /* A test fixture for sync tests. */
3874fe6c29SRuslan Bukin struct sync_fixture {
3974fe6c29SRuslan Bukin 	/* The trace buffer. */
4074fe6c29SRuslan Bukin 	uint8_t buffer[1024];
4174fe6c29SRuslan Bukin 
4274fe6c29SRuslan Bukin 	/* A trace configuration. */
4374fe6c29SRuslan Bukin 	struct pt_config config;
4474fe6c29SRuslan Bukin 
4574fe6c29SRuslan Bukin 	/* The test fixture initialization and finalization functions. */
4674fe6c29SRuslan Bukin 	struct ptunit_result (*init)(struct sync_fixture *);
4774fe6c29SRuslan Bukin 	struct ptunit_result (*fini)(struct sync_fixture *);
4874fe6c29SRuslan Bukin };
4974fe6c29SRuslan Bukin 
sfix_init(struct sync_fixture * sfix)5074fe6c29SRuslan Bukin static struct ptunit_result sfix_init(struct sync_fixture *sfix)
5174fe6c29SRuslan Bukin {
5274fe6c29SRuslan Bukin 	memset(sfix->buffer, 0xcd, sizeof(sfix->buffer));
5374fe6c29SRuslan Bukin 
5474fe6c29SRuslan Bukin 	memset(&sfix->config, 0, sizeof(sfix->config));
5574fe6c29SRuslan Bukin 	sfix->config.size = sizeof(sfix->config);
5674fe6c29SRuslan Bukin 	sfix->config.begin = sfix->buffer;
5774fe6c29SRuslan Bukin 	sfix->config.end = sfix->buffer + sizeof(sfix->buffer);
5874fe6c29SRuslan Bukin 
5974fe6c29SRuslan Bukin 	return ptu_passed();
6074fe6c29SRuslan Bukin }
6174fe6c29SRuslan Bukin 
sfix_encode_psb(uint8_t * pos)6274fe6c29SRuslan Bukin static void sfix_encode_psb(uint8_t *pos)
6374fe6c29SRuslan Bukin {
6474fe6c29SRuslan Bukin 	int i;
6574fe6c29SRuslan Bukin 
6674fe6c29SRuslan Bukin 	*pos++ = pt_opc_psb;
6774fe6c29SRuslan Bukin 	*pos++ = pt_ext_psb;
6874fe6c29SRuslan Bukin 
6974fe6c29SRuslan Bukin 	for (i = 0; i < pt_psb_repeat_count; ++i) {
7074fe6c29SRuslan Bukin 		*pos++ = pt_psb_hi;
7174fe6c29SRuslan Bukin 		*pos++ = pt_psb_lo;
7274fe6c29SRuslan Bukin 	}
7374fe6c29SRuslan Bukin }
7474fe6c29SRuslan Bukin 
7574fe6c29SRuslan Bukin 
sync_fwd_null(struct sync_fixture * sfix)7674fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_null(struct sync_fixture *sfix)
7774fe6c29SRuslan Bukin {
7874fe6c29SRuslan Bukin 	const uint8_t *sync;
7974fe6c29SRuslan Bukin 	int errcode;
8074fe6c29SRuslan Bukin 
8174fe6c29SRuslan Bukin 	errcode = pt_sync_forward(NULL, sfix->config.begin, &sfix->config);
8274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
8374fe6c29SRuslan Bukin 
8474fe6c29SRuslan Bukin 	errcode = pt_sync_forward(&sync, NULL, &sfix->config);
8574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
8674fe6c29SRuslan Bukin 
8774fe6c29SRuslan Bukin 	errcode = pt_sync_forward(&sync, sfix->config.begin, NULL);
8874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
8974fe6c29SRuslan Bukin 
9074fe6c29SRuslan Bukin 	return ptu_passed();
9174fe6c29SRuslan Bukin }
9274fe6c29SRuslan Bukin 
sync_bwd_null(struct sync_fixture * sfix)9374fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_null(struct sync_fixture *sfix)
9474fe6c29SRuslan Bukin {
9574fe6c29SRuslan Bukin 	const uint8_t *sync;
9674fe6c29SRuslan Bukin 	int errcode;
9774fe6c29SRuslan Bukin 
9874fe6c29SRuslan Bukin 	errcode = pt_sync_backward(NULL, sfix->config.begin, &sfix->config);
9974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
10074fe6c29SRuslan Bukin 
10174fe6c29SRuslan Bukin 	errcode = pt_sync_backward(&sync, NULL, &sfix->config);
10274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
10374fe6c29SRuslan Bukin 
10474fe6c29SRuslan Bukin 	errcode = pt_sync_backward(&sync, sfix->config.begin, NULL);
10574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
10674fe6c29SRuslan Bukin 
10774fe6c29SRuslan Bukin 	return ptu_passed();
10874fe6c29SRuslan Bukin }
10974fe6c29SRuslan Bukin 
sync_fwd_empty(struct sync_fixture * sfix)11074fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_empty(struct sync_fixture *sfix)
11174fe6c29SRuslan Bukin {
11274fe6c29SRuslan Bukin 	const uint8_t *sync;
11374fe6c29SRuslan Bukin 	int errcode;
11474fe6c29SRuslan Bukin 
11574fe6c29SRuslan Bukin 	sfix->config.end = sfix->config.begin;
11674fe6c29SRuslan Bukin 
11774fe6c29SRuslan Bukin 	errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config);
11874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
11974fe6c29SRuslan Bukin 
12074fe6c29SRuslan Bukin 	return ptu_passed();
12174fe6c29SRuslan Bukin }
12274fe6c29SRuslan Bukin 
sync_bwd_empty(struct sync_fixture * sfix)12374fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_empty(struct sync_fixture *sfix)
12474fe6c29SRuslan Bukin {
12574fe6c29SRuslan Bukin 	const uint8_t *sync;
12674fe6c29SRuslan Bukin 	int errcode;
12774fe6c29SRuslan Bukin 
12874fe6c29SRuslan Bukin 	sfix->config.end = sfix->config.begin;
12974fe6c29SRuslan Bukin 
13074fe6c29SRuslan Bukin 	errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config);
13174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
13274fe6c29SRuslan Bukin 
13374fe6c29SRuslan Bukin 	return ptu_passed();
13474fe6c29SRuslan Bukin }
13574fe6c29SRuslan Bukin 
sync_fwd_none(struct sync_fixture * sfix)13674fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_none(struct sync_fixture *sfix)
13774fe6c29SRuslan Bukin {
13874fe6c29SRuslan Bukin 	const uint8_t *sync;
13974fe6c29SRuslan Bukin 	int errcode;
14074fe6c29SRuslan Bukin 
14174fe6c29SRuslan Bukin 	errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config);
14274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
14374fe6c29SRuslan Bukin 
14474fe6c29SRuslan Bukin 	return ptu_passed();
14574fe6c29SRuslan Bukin }
14674fe6c29SRuslan Bukin 
sync_bwd_none(struct sync_fixture * sfix)14774fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_none(struct sync_fixture *sfix)
14874fe6c29SRuslan Bukin {
14974fe6c29SRuslan Bukin 	const uint8_t *sync;
15074fe6c29SRuslan Bukin 	int errcode;
15174fe6c29SRuslan Bukin 
15274fe6c29SRuslan Bukin 	errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config);
15374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
15474fe6c29SRuslan Bukin 
15574fe6c29SRuslan Bukin 	return ptu_passed();
15674fe6c29SRuslan Bukin }
15774fe6c29SRuslan Bukin 
sync_fwd_here(struct sync_fixture * sfix)15874fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_here(struct sync_fixture *sfix)
15974fe6c29SRuslan Bukin {
16074fe6c29SRuslan Bukin 	const uint8_t *sync;
16174fe6c29SRuslan Bukin 	int errcode;
16274fe6c29SRuslan Bukin 
16374fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.begin);
16474fe6c29SRuslan Bukin 
16574fe6c29SRuslan Bukin 	errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config);
16674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
16774fe6c29SRuslan Bukin 	ptu_ptr_eq(sync, sfix->config.begin);
16874fe6c29SRuslan Bukin 
16974fe6c29SRuslan Bukin 	return ptu_passed();
17074fe6c29SRuslan Bukin }
17174fe6c29SRuslan Bukin 
sync_bwd_here(struct sync_fixture * sfix)17274fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_here(struct sync_fixture *sfix)
17374fe6c29SRuslan Bukin {
17474fe6c29SRuslan Bukin 	const uint8_t *sync;
17574fe6c29SRuslan Bukin 	int errcode;
17674fe6c29SRuslan Bukin 
17774fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.end - ptps_psb);
17874fe6c29SRuslan Bukin 
17974fe6c29SRuslan Bukin 	errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config);
18074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
18174fe6c29SRuslan Bukin 	ptu_ptr_eq(sync, sfix->config.end - ptps_psb);
18274fe6c29SRuslan Bukin 
18374fe6c29SRuslan Bukin 	return ptu_passed();
18474fe6c29SRuslan Bukin }
18574fe6c29SRuslan Bukin 
sync_fwd(struct sync_fixture * sfix)18674fe6c29SRuslan Bukin static struct ptunit_result sync_fwd(struct sync_fixture *sfix)
18774fe6c29SRuslan Bukin {
18874fe6c29SRuslan Bukin 	const uint8_t *sync;
18974fe6c29SRuslan Bukin 	int errcode;
19074fe6c29SRuslan Bukin 
19174fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.begin + 0x23);
19274fe6c29SRuslan Bukin 
19374fe6c29SRuslan Bukin 	errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config);
19474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
19574fe6c29SRuslan Bukin 	ptu_ptr_eq(sync, sfix->config.begin + 0x23);
19674fe6c29SRuslan Bukin 
19774fe6c29SRuslan Bukin 	return ptu_passed();
19874fe6c29SRuslan Bukin }
19974fe6c29SRuslan Bukin 
sync_bwd(struct sync_fixture * sfix)20074fe6c29SRuslan Bukin static struct ptunit_result sync_bwd(struct sync_fixture *sfix)
20174fe6c29SRuslan Bukin {
20274fe6c29SRuslan Bukin 	const uint8_t *sync;
20374fe6c29SRuslan Bukin 	int errcode;
20474fe6c29SRuslan Bukin 
20574fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.begin + 0x23);
20674fe6c29SRuslan Bukin 
20774fe6c29SRuslan Bukin 	errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config);
20874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
20974fe6c29SRuslan Bukin 	ptu_ptr_eq(sync, sfix->config.begin + 0x23);
21074fe6c29SRuslan Bukin 
21174fe6c29SRuslan Bukin 	return ptu_passed();
21274fe6c29SRuslan Bukin }
21374fe6c29SRuslan Bukin 
sync_fwd_past(struct sync_fixture * sfix)21474fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_past(struct sync_fixture *sfix)
21574fe6c29SRuslan Bukin {
21674fe6c29SRuslan Bukin 	const uint8_t *sync;
21774fe6c29SRuslan Bukin 	int errcode;
21874fe6c29SRuslan Bukin 
21974fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.begin);
22074fe6c29SRuslan Bukin 
22174fe6c29SRuslan Bukin 	errcode = pt_sync_forward(&sync, sfix->config.begin + ptps_psb,
22274fe6c29SRuslan Bukin 				  &sfix->config);
22374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
22474fe6c29SRuslan Bukin 
22574fe6c29SRuslan Bukin 	return ptu_passed();
22674fe6c29SRuslan Bukin }
22774fe6c29SRuslan Bukin 
sync_bwd_past(struct sync_fixture * sfix)22874fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_past(struct sync_fixture *sfix)
22974fe6c29SRuslan Bukin {
23074fe6c29SRuslan Bukin 	const uint8_t *sync;
23174fe6c29SRuslan Bukin 	int errcode;
23274fe6c29SRuslan Bukin 
23374fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.end - ptps_psb);
23474fe6c29SRuslan Bukin 
23574fe6c29SRuslan Bukin 	errcode = pt_sync_backward(&sync, sfix->config.end - ptps_psb,
23674fe6c29SRuslan Bukin 				   &sfix->config);
23774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
23874fe6c29SRuslan Bukin 
23974fe6c29SRuslan Bukin 	return ptu_passed();
24074fe6c29SRuslan Bukin }
24174fe6c29SRuslan Bukin 
sync_fwd_cutoff(struct sync_fixture * sfix)24274fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_cutoff(struct sync_fixture *sfix)
24374fe6c29SRuslan Bukin {
24474fe6c29SRuslan Bukin 	const uint8_t *sync;
24574fe6c29SRuslan Bukin 	int errcode;
24674fe6c29SRuslan Bukin 
24774fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.begin);
24874fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.end - ptps_psb);
24974fe6c29SRuslan Bukin 	sfix->config.begin += 1;
25074fe6c29SRuslan Bukin 	sfix->config.end -= 1;
25174fe6c29SRuslan Bukin 
25274fe6c29SRuslan Bukin 	errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config);
25374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
25474fe6c29SRuslan Bukin 
25574fe6c29SRuslan Bukin 	return ptu_passed();
25674fe6c29SRuslan Bukin }
25774fe6c29SRuslan Bukin 
sync_bwd_cutoff(struct sync_fixture * sfix)25874fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_cutoff(struct sync_fixture *sfix)
25974fe6c29SRuslan Bukin {
26074fe6c29SRuslan Bukin 	const uint8_t *sync;
26174fe6c29SRuslan Bukin 	int errcode;
26274fe6c29SRuslan Bukin 
26374fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.begin);
26474fe6c29SRuslan Bukin 	sfix_encode_psb(sfix->config.end - ptps_psb);
26574fe6c29SRuslan Bukin 	sfix->config.begin += 1;
26674fe6c29SRuslan Bukin 	sfix->config.end -= 1;
26774fe6c29SRuslan Bukin 
26874fe6c29SRuslan Bukin 	errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config);
26974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
27074fe6c29SRuslan Bukin 
27174fe6c29SRuslan Bukin 	return ptu_passed();
27274fe6c29SRuslan Bukin }
27374fe6c29SRuslan Bukin 
main(int argc,char ** argv)27474fe6c29SRuslan Bukin int main(int argc, char **argv)
27574fe6c29SRuslan Bukin {
27674fe6c29SRuslan Bukin 	struct sync_fixture sfix;
27774fe6c29SRuslan Bukin 	struct ptunit_suite suite;
27874fe6c29SRuslan Bukin 
27974fe6c29SRuslan Bukin 	sfix.init = sfix_init;
28074fe6c29SRuslan Bukin 	sfix.fini = NULL;
28174fe6c29SRuslan Bukin 
28274fe6c29SRuslan Bukin 	suite = ptunit_mk_suite(argc, argv);
28374fe6c29SRuslan Bukin 
28474fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_fwd_null, sfix);
28574fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_bwd_null, sfix);
28674fe6c29SRuslan Bukin 
28774fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_fwd_empty, sfix);
28874fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_bwd_empty, sfix);
28974fe6c29SRuslan Bukin 
29074fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_fwd_none, sfix);
29174fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_bwd_none, sfix);
29274fe6c29SRuslan Bukin 
29374fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_fwd_here, sfix);
29474fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_bwd_here, sfix);
29574fe6c29SRuslan Bukin 
29674fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_fwd, sfix);
29774fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_bwd, sfix);
29874fe6c29SRuslan Bukin 
29974fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_fwd_past, sfix);
30074fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_bwd_past, sfix);
30174fe6c29SRuslan Bukin 
30274fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_fwd_cutoff, sfix);
30374fe6c29SRuslan Bukin 	ptu_run_f(suite, sync_bwd_cutoff, sfix);
30474fe6c29SRuslan Bukin 
30574fe6c29SRuslan Bukin 	return ptunit_report(&suite);
30674fe6c29SRuslan Bukin }
307