xref: /freebsd-src/contrib/processor-trace/libipt/test/src/ptunit-section.c (revision 85f87cf491bec6f90948a85b10f5523ea24db9e3)
174fe6c29SRuslan Bukin /*
2*85f87cf4SRuslan Bukin  * Copyright (c) 2013-2019, Intel Corporation
374fe6c29SRuslan Bukin  *
474fe6c29SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
574fe6c29SRuslan Bukin  * modification, are permitted provided that the following conditions are met:
674fe6c29SRuslan Bukin  *
774fe6c29SRuslan Bukin  *  * Redistributions of source code must retain the above copyright notice,
874fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer.
974fe6c29SRuslan Bukin  *  * Redistributions in binary form must reproduce the above copyright notice,
1074fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer in the documentation
1174fe6c29SRuslan Bukin  *    and/or other materials provided with the distribution.
1274fe6c29SRuslan Bukin  *  * Neither the name of Intel Corporation nor the names of its contributors
1374fe6c29SRuslan Bukin  *    may be used to endorse or promote products derived from this software
1474fe6c29SRuslan Bukin  *    without specific prior written permission.
1574fe6c29SRuslan Bukin  *
1674fe6c29SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1774fe6c29SRuslan Bukin  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1874fe6c29SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1974fe6c29SRuslan Bukin  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2074fe6c29SRuslan Bukin  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2174fe6c29SRuslan Bukin  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2274fe6c29SRuslan Bukin  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2374fe6c29SRuslan Bukin  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2474fe6c29SRuslan Bukin  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2574fe6c29SRuslan Bukin  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2674fe6c29SRuslan Bukin  * POSSIBILITY OF SUCH DAMAGE.
2774fe6c29SRuslan Bukin  */
2874fe6c29SRuslan Bukin 
2974fe6c29SRuslan Bukin #include "ptunit_threads.h"
3074fe6c29SRuslan Bukin #include "ptunit_mkfile.h"
3174fe6c29SRuslan Bukin 
3274fe6c29SRuslan Bukin #include "pt_section.h"
3374fe6c29SRuslan Bukin #include "pt_block_cache.h"
3474fe6c29SRuslan Bukin 
3574fe6c29SRuslan Bukin #include "intel-pt.h"
3674fe6c29SRuslan Bukin 
3774fe6c29SRuslan Bukin #include <stdlib.h>
3874fe6c29SRuslan Bukin #include <stdio.h>
3974fe6c29SRuslan Bukin 
4074fe6c29SRuslan Bukin 
4174fe6c29SRuslan Bukin 
4274fe6c29SRuslan Bukin struct pt_image_section_cache {
4374fe6c29SRuslan Bukin 	int map;
4474fe6c29SRuslan Bukin };
4574fe6c29SRuslan Bukin 
4674fe6c29SRuslan Bukin extern int pt_iscache_notify_map(struct pt_image_section_cache *iscache,
4774fe6c29SRuslan Bukin 				 struct pt_section *section);
4874fe6c29SRuslan Bukin extern int pt_iscache_notify_resize(struct pt_image_section_cache *iscache,
4974fe6c29SRuslan Bukin 				    struct pt_section *section, uint64_t size);
5074fe6c29SRuslan Bukin 
pt_iscache_notify_map(struct pt_image_section_cache * iscache,struct pt_section * section)5174fe6c29SRuslan Bukin int pt_iscache_notify_map(struct pt_image_section_cache *iscache,
5274fe6c29SRuslan Bukin 			  struct pt_section *section)
5374fe6c29SRuslan Bukin {
5474fe6c29SRuslan Bukin 	if (!iscache)
5574fe6c29SRuslan Bukin 		return -pte_internal;
5674fe6c29SRuslan Bukin 
5774fe6c29SRuslan Bukin 	if (iscache->map <= 0)
5874fe6c29SRuslan Bukin 		return iscache->map;
5974fe6c29SRuslan Bukin 
6074fe6c29SRuslan Bukin 	/* Avoid recursion. */
6174fe6c29SRuslan Bukin 	iscache->map = 0;
6274fe6c29SRuslan Bukin 
6374fe6c29SRuslan Bukin 	return pt_section_map_share(section);
6474fe6c29SRuslan Bukin }
6574fe6c29SRuslan Bukin 
pt_iscache_notify_resize(struct pt_image_section_cache * iscache,struct pt_section * section,uint64_t size)6674fe6c29SRuslan Bukin int pt_iscache_notify_resize(struct pt_image_section_cache *iscache,
6774fe6c29SRuslan Bukin 			     struct pt_section *section, uint64_t size)
6874fe6c29SRuslan Bukin {
6974fe6c29SRuslan Bukin 	uint64_t memsize;
7074fe6c29SRuslan Bukin 	int errcode;
7174fe6c29SRuslan Bukin 
7274fe6c29SRuslan Bukin 	if (!iscache)
7374fe6c29SRuslan Bukin 		return -pte_internal;
7474fe6c29SRuslan Bukin 
7574fe6c29SRuslan Bukin 	if (iscache->map <= 0)
7674fe6c29SRuslan Bukin 		return iscache->map;
7774fe6c29SRuslan Bukin 
7874fe6c29SRuslan Bukin 	/* Avoid recursion. */
7974fe6c29SRuslan Bukin 	iscache->map = 0;
8074fe6c29SRuslan Bukin 
8174fe6c29SRuslan Bukin 	errcode = pt_section_memsize(section, &memsize);
8274fe6c29SRuslan Bukin 	if (errcode < 0)
8374fe6c29SRuslan Bukin 		return errcode;
8474fe6c29SRuslan Bukin 
8574fe6c29SRuslan Bukin 	if (size != memsize)
8674fe6c29SRuslan Bukin 		return -pte_internal;
8774fe6c29SRuslan Bukin 
8874fe6c29SRuslan Bukin 	return pt_section_map_share(section);
8974fe6c29SRuslan Bukin }
9074fe6c29SRuslan Bukin 
pt_bcache_alloc(uint64_t nentries)9174fe6c29SRuslan Bukin struct pt_block_cache *pt_bcache_alloc(uint64_t nentries)
9274fe6c29SRuslan Bukin {
9374fe6c29SRuslan Bukin 	struct pt_block_cache *bcache;
9474fe6c29SRuslan Bukin 
9574fe6c29SRuslan Bukin 	if (!nentries || (UINT32_MAX < nentries))
9674fe6c29SRuslan Bukin 		return NULL;
9774fe6c29SRuslan Bukin 
9874fe6c29SRuslan Bukin 	/* The cache is not really used by tests.  It suffices to allocate only
9974fe6c29SRuslan Bukin 	 * the cache struct with the single default entry.
10074fe6c29SRuslan Bukin 	 *
10174fe6c29SRuslan Bukin 	 * We still set the number of entries to the requested size.
10274fe6c29SRuslan Bukin 	 */
10374fe6c29SRuslan Bukin 	bcache = malloc(sizeof(*bcache));
10474fe6c29SRuslan Bukin 	if (bcache)
10574fe6c29SRuslan Bukin 		bcache->nentries = (uint32_t) nentries;
10674fe6c29SRuslan Bukin 
10774fe6c29SRuslan Bukin 	return bcache;
10874fe6c29SRuslan Bukin }
10974fe6c29SRuslan Bukin 
pt_bcache_free(struct pt_block_cache * bcache)11074fe6c29SRuslan Bukin void pt_bcache_free(struct pt_block_cache *bcache)
11174fe6c29SRuslan Bukin {
11274fe6c29SRuslan Bukin 	free(bcache);
11374fe6c29SRuslan Bukin }
11474fe6c29SRuslan Bukin 
11574fe6c29SRuslan Bukin /* A test fixture providing a temporary file and an initially NULL section. */
11674fe6c29SRuslan Bukin struct section_fixture {
11774fe6c29SRuslan Bukin 	/* Threading support. */
11874fe6c29SRuslan Bukin 	struct ptunit_thrd_fixture thrd;
11974fe6c29SRuslan Bukin 
12074fe6c29SRuslan Bukin 	/* A temporary file name. */
12174fe6c29SRuslan Bukin 	char *name;
12274fe6c29SRuslan Bukin 
12374fe6c29SRuslan Bukin 	/* That file opened for writing. */
12474fe6c29SRuslan Bukin 	FILE *file;
12574fe6c29SRuslan Bukin 
12674fe6c29SRuslan Bukin 	/* The section. */
12774fe6c29SRuslan Bukin 	struct pt_section *section;
12874fe6c29SRuslan Bukin 
12974fe6c29SRuslan Bukin 	/* The test fixture initialization and finalization functions. */
13074fe6c29SRuslan Bukin 	struct ptunit_result (*init)(struct section_fixture *);
13174fe6c29SRuslan Bukin 	struct ptunit_result (*fini)(struct section_fixture *);
13274fe6c29SRuslan Bukin };
13374fe6c29SRuslan Bukin 
13474fe6c29SRuslan Bukin enum {
13574fe6c29SRuslan Bukin #if defined(FEATURE_THREADS)
13674fe6c29SRuslan Bukin 
13774fe6c29SRuslan Bukin 	num_threads	= 4,
13874fe6c29SRuslan Bukin 
13974fe6c29SRuslan Bukin #endif /* defined(FEATURE_THREADS) */
14074fe6c29SRuslan Bukin 
14174fe6c29SRuslan Bukin 	num_work	= 0x4000
14274fe6c29SRuslan Bukin };
14374fe6c29SRuslan Bukin 
sfix_write_aux(struct section_fixture * sfix,const uint8_t * buffer,size_t size)14474fe6c29SRuslan Bukin static struct ptunit_result sfix_write_aux(struct section_fixture *sfix,
14574fe6c29SRuslan Bukin 					   const uint8_t *buffer, size_t size)
14674fe6c29SRuslan Bukin {
14774fe6c29SRuslan Bukin 	size_t written;
14874fe6c29SRuslan Bukin 
14974fe6c29SRuslan Bukin 	written = fwrite(buffer, 1, size, sfix->file);
15074fe6c29SRuslan Bukin 	ptu_uint_eq(written, size);
15174fe6c29SRuslan Bukin 
15274fe6c29SRuslan Bukin 	fflush(sfix->file);
15374fe6c29SRuslan Bukin 
15474fe6c29SRuslan Bukin 	return ptu_passed();
15574fe6c29SRuslan Bukin }
15674fe6c29SRuslan Bukin 
15774fe6c29SRuslan Bukin #define sfix_write(sfix, buffer)				\
15874fe6c29SRuslan Bukin 	ptu_check(sfix_write_aux, sfix, buffer, sizeof(buffer))
15974fe6c29SRuslan Bukin 
create(struct section_fixture * sfix)16074fe6c29SRuslan Bukin static struct ptunit_result create(struct section_fixture *sfix)
16174fe6c29SRuslan Bukin {
16274fe6c29SRuslan Bukin 	const char *name;
16374fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
16474fe6c29SRuslan Bukin 	uint64_t offset, size;
165*85f87cf4SRuslan Bukin 	int errcode;
16674fe6c29SRuslan Bukin 
16774fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
16874fe6c29SRuslan Bukin 
169*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
170*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
17174fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
17274fe6c29SRuslan Bukin 
17374fe6c29SRuslan Bukin 	name = pt_section_filename(sfix->section);
17474fe6c29SRuslan Bukin 	ptu_str_eq(name, sfix->name);
17574fe6c29SRuslan Bukin 
17674fe6c29SRuslan Bukin 	offset = pt_section_offset(sfix->section);
17774fe6c29SRuslan Bukin 	ptu_uint_eq(offset, 0x1ull);
17874fe6c29SRuslan Bukin 
17974fe6c29SRuslan Bukin 	size = pt_section_size(sfix->section);
18074fe6c29SRuslan Bukin 	ptu_uint_eq(size, 0x3ull);
18174fe6c29SRuslan Bukin 
18274fe6c29SRuslan Bukin 	return ptu_passed();
18374fe6c29SRuslan Bukin }
18474fe6c29SRuslan Bukin 
create_bad_offset(struct section_fixture * sfix)18574fe6c29SRuslan Bukin static struct ptunit_result create_bad_offset(struct section_fixture *sfix)
18674fe6c29SRuslan Bukin {
187*85f87cf4SRuslan Bukin 	int errcode;
188*85f87cf4SRuslan Bukin 
189*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x10ull, 0x0ull);
190*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
19174fe6c29SRuslan Bukin 
19274fe6c29SRuslan Bukin 	return ptu_passed();
19374fe6c29SRuslan Bukin }
19474fe6c29SRuslan Bukin 
create_truncated(struct section_fixture * sfix)19574fe6c29SRuslan Bukin static struct ptunit_result create_truncated(struct section_fixture *sfix)
19674fe6c29SRuslan Bukin {
19774fe6c29SRuslan Bukin 	const char *name;
19874fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
19974fe6c29SRuslan Bukin 	uint64_t offset, size;
200*85f87cf4SRuslan Bukin 	int errcode;
20174fe6c29SRuslan Bukin 
20274fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
20374fe6c29SRuslan Bukin 
204*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, UINT64_MAX);
205*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
20674fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
20774fe6c29SRuslan Bukin 
20874fe6c29SRuslan Bukin 	name = pt_section_filename(sfix->section);
20974fe6c29SRuslan Bukin 	ptu_str_eq(name, sfix->name);
21074fe6c29SRuslan Bukin 
21174fe6c29SRuslan Bukin 	offset = pt_section_offset(sfix->section);
21274fe6c29SRuslan Bukin 	ptu_uint_eq(offset, 0x1ull);
21374fe6c29SRuslan Bukin 
21474fe6c29SRuslan Bukin 	size = pt_section_size(sfix->section);
21574fe6c29SRuslan Bukin 	ptu_uint_eq(size, sizeof(bytes) - 1);
21674fe6c29SRuslan Bukin 
21774fe6c29SRuslan Bukin 	return ptu_passed();
21874fe6c29SRuslan Bukin }
21974fe6c29SRuslan Bukin 
create_empty(struct section_fixture * sfix)22074fe6c29SRuslan Bukin static struct ptunit_result create_empty(struct section_fixture *sfix)
22174fe6c29SRuslan Bukin {
222*85f87cf4SRuslan Bukin 	int errcode;
223*85f87cf4SRuslan Bukin 
224*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x0ull, 0x10ull);
225*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
22674fe6c29SRuslan Bukin 	ptu_null(sfix->section);
22774fe6c29SRuslan Bukin 
22874fe6c29SRuslan Bukin 	return ptu_passed();
22974fe6c29SRuslan Bukin }
23074fe6c29SRuslan Bukin 
filename_null(void)23174fe6c29SRuslan Bukin static struct ptunit_result filename_null(void)
23274fe6c29SRuslan Bukin {
23374fe6c29SRuslan Bukin 	const char *name;
23474fe6c29SRuslan Bukin 
23574fe6c29SRuslan Bukin 	name = pt_section_filename(NULL);
23674fe6c29SRuslan Bukin 	ptu_null(name);
23774fe6c29SRuslan Bukin 
23874fe6c29SRuslan Bukin 	return ptu_passed();
23974fe6c29SRuslan Bukin }
24074fe6c29SRuslan Bukin 
size_null(void)24174fe6c29SRuslan Bukin static struct ptunit_result size_null(void)
24274fe6c29SRuslan Bukin {
24374fe6c29SRuslan Bukin 	uint64_t size;
24474fe6c29SRuslan Bukin 
24574fe6c29SRuslan Bukin 	size = pt_section_size(NULL);
24674fe6c29SRuslan Bukin 	ptu_uint_eq(size, 0ull);
24774fe6c29SRuslan Bukin 
24874fe6c29SRuslan Bukin 	return ptu_passed();
24974fe6c29SRuslan Bukin }
25074fe6c29SRuslan Bukin 
memsize_null(struct section_fixture * sfix)25174fe6c29SRuslan Bukin static struct ptunit_result memsize_null(struct section_fixture *sfix)
25274fe6c29SRuslan Bukin {
25374fe6c29SRuslan Bukin 	uint64_t size;
25474fe6c29SRuslan Bukin 	int errcode;
25574fe6c29SRuslan Bukin 
25674fe6c29SRuslan Bukin 	errcode = pt_section_memsize(NULL, &size);
25774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
25874fe6c29SRuslan Bukin 
25974fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, NULL);
26074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
26174fe6c29SRuslan Bukin 
26274fe6c29SRuslan Bukin 	errcode = pt_section_memsize(NULL, NULL);
26374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
26474fe6c29SRuslan Bukin 
26574fe6c29SRuslan Bukin 	return ptu_passed();
26674fe6c29SRuslan Bukin }
26774fe6c29SRuslan Bukin 
offset_null(void)26874fe6c29SRuslan Bukin static struct ptunit_result offset_null(void)
26974fe6c29SRuslan Bukin {
27074fe6c29SRuslan Bukin 	uint64_t offset;
27174fe6c29SRuslan Bukin 
27274fe6c29SRuslan Bukin 	offset = pt_section_offset(NULL);
27374fe6c29SRuslan Bukin 	ptu_uint_eq(offset, 0ull);
27474fe6c29SRuslan Bukin 
27574fe6c29SRuslan Bukin 	return ptu_passed();
27674fe6c29SRuslan Bukin }
27774fe6c29SRuslan Bukin 
get_null(void)27874fe6c29SRuslan Bukin static struct ptunit_result get_null(void)
27974fe6c29SRuslan Bukin {
28074fe6c29SRuslan Bukin 	int errcode;
28174fe6c29SRuslan Bukin 
28274fe6c29SRuslan Bukin 	errcode = pt_section_get(NULL);
28374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
28474fe6c29SRuslan Bukin 
28574fe6c29SRuslan Bukin 	return ptu_passed();
28674fe6c29SRuslan Bukin }
28774fe6c29SRuslan Bukin 
put_null(void)28874fe6c29SRuslan Bukin static struct ptunit_result put_null(void)
28974fe6c29SRuslan Bukin {
29074fe6c29SRuslan Bukin 	int errcode;
29174fe6c29SRuslan Bukin 
29274fe6c29SRuslan Bukin 	errcode = pt_section_put(NULL);
29374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
29474fe6c29SRuslan Bukin 
29574fe6c29SRuslan Bukin 	return ptu_passed();
29674fe6c29SRuslan Bukin }
29774fe6c29SRuslan Bukin 
attach_null(void)29874fe6c29SRuslan Bukin static struct ptunit_result attach_null(void)
29974fe6c29SRuslan Bukin {
30074fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
30174fe6c29SRuslan Bukin 	struct pt_section section;
30274fe6c29SRuslan Bukin 	int errcode;
30374fe6c29SRuslan Bukin 
30474fe6c29SRuslan Bukin 	errcode = pt_section_attach(NULL, &iscache);
30574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
30674fe6c29SRuslan Bukin 
30774fe6c29SRuslan Bukin 	errcode = pt_section_attach(&section, NULL);
30874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
30974fe6c29SRuslan Bukin 
31074fe6c29SRuslan Bukin 	errcode = pt_section_attach(NULL, NULL);
31174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
31274fe6c29SRuslan Bukin 
31374fe6c29SRuslan Bukin 	return ptu_passed();
31474fe6c29SRuslan Bukin }
31574fe6c29SRuslan Bukin 
detach_null(void)31674fe6c29SRuslan Bukin static struct ptunit_result detach_null(void)
31774fe6c29SRuslan Bukin {
31874fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
31974fe6c29SRuslan Bukin 	struct pt_section section;
32074fe6c29SRuslan Bukin 	int errcode;
32174fe6c29SRuslan Bukin 
32274fe6c29SRuslan Bukin 	errcode = pt_section_detach(NULL, &iscache);
32374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
32474fe6c29SRuslan Bukin 
32574fe6c29SRuslan Bukin 	errcode = pt_section_detach(&section, NULL);
32674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
32774fe6c29SRuslan Bukin 
32874fe6c29SRuslan Bukin 	errcode = pt_section_detach(NULL, NULL);
32974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
33074fe6c29SRuslan Bukin 
33174fe6c29SRuslan Bukin 	return ptu_passed();
33274fe6c29SRuslan Bukin }
33374fe6c29SRuslan Bukin 
map_null(void)33474fe6c29SRuslan Bukin static struct ptunit_result map_null(void)
33574fe6c29SRuslan Bukin {
33674fe6c29SRuslan Bukin 	int errcode;
33774fe6c29SRuslan Bukin 
33874fe6c29SRuslan Bukin 	errcode = pt_section_map(NULL);
33974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
34074fe6c29SRuslan Bukin 
34174fe6c29SRuslan Bukin 	return ptu_passed();
34274fe6c29SRuslan Bukin }
34374fe6c29SRuslan Bukin 
unmap_null(void)34474fe6c29SRuslan Bukin static struct ptunit_result unmap_null(void)
34574fe6c29SRuslan Bukin {
34674fe6c29SRuslan Bukin 	int errcode;
34774fe6c29SRuslan Bukin 
34874fe6c29SRuslan Bukin 	errcode = pt_section_unmap(NULL);
34974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
35074fe6c29SRuslan Bukin 
35174fe6c29SRuslan Bukin 	return ptu_passed();
35274fe6c29SRuslan Bukin }
35374fe6c29SRuslan Bukin 
cache_null(void)35474fe6c29SRuslan Bukin static struct ptunit_result cache_null(void)
35574fe6c29SRuslan Bukin {
35674fe6c29SRuslan Bukin 	struct pt_block_cache *bcache;
35774fe6c29SRuslan Bukin 
35874fe6c29SRuslan Bukin 	bcache = pt_section_bcache(NULL);
35974fe6c29SRuslan Bukin 	ptu_null(bcache);
36074fe6c29SRuslan Bukin 
36174fe6c29SRuslan Bukin 	return ptu_passed();
36274fe6c29SRuslan Bukin }
36374fe6c29SRuslan Bukin 
get_overflow(struct section_fixture * sfix)36474fe6c29SRuslan Bukin static struct ptunit_result get_overflow(struct section_fixture *sfix)
36574fe6c29SRuslan Bukin {
36674fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
36774fe6c29SRuslan Bukin 	int errcode;
36874fe6c29SRuslan Bukin 
36974fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
37074fe6c29SRuslan Bukin 
371*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
372*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
37374fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
37474fe6c29SRuslan Bukin 
37574fe6c29SRuslan Bukin 	sfix->section->ucount = UINT16_MAX;
37674fe6c29SRuslan Bukin 
37774fe6c29SRuslan Bukin 	errcode = pt_section_get(sfix->section);
37874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_overflow);
37974fe6c29SRuslan Bukin 
38074fe6c29SRuslan Bukin 	sfix->section->ucount = 1;
38174fe6c29SRuslan Bukin 
38274fe6c29SRuslan Bukin 	return ptu_passed();
38374fe6c29SRuslan Bukin }
38474fe6c29SRuslan Bukin 
attach_overflow(struct section_fixture * sfix)38574fe6c29SRuslan Bukin static struct ptunit_result attach_overflow(struct section_fixture *sfix)
38674fe6c29SRuslan Bukin {
38774fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
38874fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
38974fe6c29SRuslan Bukin 	int errcode;
39074fe6c29SRuslan Bukin 
39174fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
39274fe6c29SRuslan Bukin 
393*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
394*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
39574fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
39674fe6c29SRuslan Bukin 
39774fe6c29SRuslan Bukin 	sfix->section->acount = UINT16_MAX;
39874fe6c29SRuslan Bukin 
39974fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
40074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_overflow);
40174fe6c29SRuslan Bukin 
40274fe6c29SRuslan Bukin 	sfix->section->acount = 0;
40374fe6c29SRuslan Bukin 
40474fe6c29SRuslan Bukin 	return ptu_passed();
40574fe6c29SRuslan Bukin }
40674fe6c29SRuslan Bukin 
attach_bad_ucount(struct section_fixture * sfix)40774fe6c29SRuslan Bukin static struct ptunit_result attach_bad_ucount(struct section_fixture *sfix)
40874fe6c29SRuslan Bukin {
40974fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
41074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
41174fe6c29SRuslan Bukin 	int errcode;
41274fe6c29SRuslan Bukin 
41374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
41474fe6c29SRuslan Bukin 
415*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
416*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
41774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
41874fe6c29SRuslan Bukin 
41974fe6c29SRuslan Bukin 	sfix->section->acount = 2;
42074fe6c29SRuslan Bukin 
42174fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
42274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
42374fe6c29SRuslan Bukin 
42474fe6c29SRuslan Bukin 	sfix->section->acount = 0;
42574fe6c29SRuslan Bukin 
42674fe6c29SRuslan Bukin 	return ptu_passed();
42774fe6c29SRuslan Bukin }
42874fe6c29SRuslan Bukin 
map_change(struct section_fixture * sfix)42974fe6c29SRuslan Bukin static struct ptunit_result map_change(struct section_fixture *sfix)
43074fe6c29SRuslan Bukin {
43174fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
43274fe6c29SRuslan Bukin 	int errcode;
43374fe6c29SRuslan Bukin 
43474fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
43574fe6c29SRuslan Bukin 
436*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
437*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
43874fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
43974fe6c29SRuslan Bukin 
44074fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
44174fe6c29SRuslan Bukin 
44274fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
44374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_image);
44474fe6c29SRuslan Bukin 
44574fe6c29SRuslan Bukin 	return ptu_passed();
44674fe6c29SRuslan Bukin }
44774fe6c29SRuslan Bukin 
map_put(struct section_fixture * sfix)44874fe6c29SRuslan Bukin static struct ptunit_result map_put(struct section_fixture *sfix)
44974fe6c29SRuslan Bukin {
45074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
45174fe6c29SRuslan Bukin 	int errcode;
45274fe6c29SRuslan Bukin 
45374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
45474fe6c29SRuslan Bukin 
455*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
456*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
45774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
45874fe6c29SRuslan Bukin 
45974fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
46074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
46174fe6c29SRuslan Bukin 
46274fe6c29SRuslan Bukin 	errcode = pt_section_put(sfix->section);
46374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
46474fe6c29SRuslan Bukin 
46574fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
46674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
46774fe6c29SRuslan Bukin 
46874fe6c29SRuslan Bukin 	return ptu_passed();
46974fe6c29SRuslan Bukin }
47074fe6c29SRuslan Bukin 
unmap_nomap(struct section_fixture * sfix)47174fe6c29SRuslan Bukin static struct ptunit_result unmap_nomap(struct section_fixture *sfix)
47274fe6c29SRuslan Bukin {
47374fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
47474fe6c29SRuslan Bukin 	int errcode;
47574fe6c29SRuslan Bukin 
47674fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
47774fe6c29SRuslan Bukin 
478*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
479*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
48074fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
48174fe6c29SRuslan Bukin 
48274fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
48374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_nomap);
48474fe6c29SRuslan Bukin 
48574fe6c29SRuslan Bukin 	return ptu_passed();
48674fe6c29SRuslan Bukin }
48774fe6c29SRuslan Bukin 
map_overflow(struct section_fixture * sfix)48874fe6c29SRuslan Bukin static struct ptunit_result map_overflow(struct section_fixture *sfix)
48974fe6c29SRuslan Bukin {
49074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
49174fe6c29SRuslan Bukin 	int errcode;
49274fe6c29SRuslan Bukin 
49374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
49474fe6c29SRuslan Bukin 
495*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
496*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
49774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
49874fe6c29SRuslan Bukin 
49974fe6c29SRuslan Bukin 	sfix->section->mcount = UINT16_MAX;
50074fe6c29SRuslan Bukin 
50174fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
50274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_overflow);
50374fe6c29SRuslan Bukin 
50474fe6c29SRuslan Bukin 	sfix->section->mcount = 0;
50574fe6c29SRuslan Bukin 
50674fe6c29SRuslan Bukin 	return ptu_passed();
50774fe6c29SRuslan Bukin }
50874fe6c29SRuslan Bukin 
get_put(struct section_fixture * sfix)50974fe6c29SRuslan Bukin static struct ptunit_result get_put(struct section_fixture *sfix)
51074fe6c29SRuslan Bukin {
51174fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
51274fe6c29SRuslan Bukin 	int errcode;
51374fe6c29SRuslan Bukin 
51474fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
51574fe6c29SRuslan Bukin 
516*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
517*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
51874fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
51974fe6c29SRuslan Bukin 
52074fe6c29SRuslan Bukin 	errcode = pt_section_get(sfix->section);
52174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
52274fe6c29SRuslan Bukin 
52374fe6c29SRuslan Bukin 	errcode = pt_section_get(sfix->section);
52474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
52574fe6c29SRuslan Bukin 
52674fe6c29SRuslan Bukin 	errcode = pt_section_put(sfix->section);
52774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
52874fe6c29SRuslan Bukin 
52974fe6c29SRuslan Bukin 	errcode = pt_section_put(sfix->section);
53074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
53174fe6c29SRuslan Bukin 
53274fe6c29SRuslan Bukin 	return ptu_passed();
53374fe6c29SRuslan Bukin }
53474fe6c29SRuslan Bukin 
attach_detach(struct section_fixture * sfix)53574fe6c29SRuslan Bukin static struct ptunit_result attach_detach(struct section_fixture *sfix)
53674fe6c29SRuslan Bukin {
53774fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
53874fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
53974fe6c29SRuslan Bukin 	int errcode;
54074fe6c29SRuslan Bukin 
54174fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
54274fe6c29SRuslan Bukin 
543*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
544*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
54574fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
54674fe6c29SRuslan Bukin 
54774fe6c29SRuslan Bukin 	sfix->section->ucount += 2;
54874fe6c29SRuslan Bukin 
54974fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
55074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
55174fe6c29SRuslan Bukin 
55274fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
55374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
55474fe6c29SRuslan Bukin 
55574fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
55674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
55774fe6c29SRuslan Bukin 
55874fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
55974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
56074fe6c29SRuslan Bukin 
56174fe6c29SRuslan Bukin 	sfix->section->ucount -= 2;
56274fe6c29SRuslan Bukin 
56374fe6c29SRuslan Bukin 	return ptu_passed();
56474fe6c29SRuslan Bukin }
56574fe6c29SRuslan Bukin 
attach_bad_iscache(struct section_fixture * sfix)56674fe6c29SRuslan Bukin static struct ptunit_result attach_bad_iscache(struct section_fixture *sfix)
56774fe6c29SRuslan Bukin {
56874fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache, bad;
56974fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
57074fe6c29SRuslan Bukin 	int errcode;
57174fe6c29SRuslan Bukin 
57274fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
57374fe6c29SRuslan Bukin 
574*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
575*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
57674fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
57774fe6c29SRuslan Bukin 
57874fe6c29SRuslan Bukin 	sfix->section->ucount += 2;
57974fe6c29SRuslan Bukin 
58074fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
58174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
58274fe6c29SRuslan Bukin 
58374fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &bad);
58474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
58574fe6c29SRuslan Bukin 
58674fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
58774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
58874fe6c29SRuslan Bukin 
58974fe6c29SRuslan Bukin 	sfix->section->ucount -= 2;
59074fe6c29SRuslan Bukin 
59174fe6c29SRuslan Bukin 	return ptu_passed();
59274fe6c29SRuslan Bukin }
59374fe6c29SRuslan Bukin 
detach_bad_iscache(struct section_fixture * sfix)59474fe6c29SRuslan Bukin static struct ptunit_result detach_bad_iscache(struct section_fixture *sfix)
59574fe6c29SRuslan Bukin {
59674fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache, bad;
59774fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
59874fe6c29SRuslan Bukin 	int errcode;
59974fe6c29SRuslan Bukin 
60074fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
60174fe6c29SRuslan Bukin 
602*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
603*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
60474fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
60574fe6c29SRuslan Bukin 
60674fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
60774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
60874fe6c29SRuslan Bukin 
60974fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &bad);
61074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
61174fe6c29SRuslan Bukin 
61274fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
61374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
61474fe6c29SRuslan Bukin 
61574fe6c29SRuslan Bukin 	return ptu_passed();
61674fe6c29SRuslan Bukin }
61774fe6c29SRuslan Bukin 
map_unmap(struct section_fixture * sfix)61874fe6c29SRuslan Bukin static struct ptunit_result map_unmap(struct section_fixture *sfix)
61974fe6c29SRuslan Bukin {
62074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
62174fe6c29SRuslan Bukin 	int errcode;
62274fe6c29SRuslan Bukin 
62374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
62474fe6c29SRuslan Bukin 
625*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
626*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
62774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
62874fe6c29SRuslan Bukin 
62974fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
63074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
63174fe6c29SRuslan Bukin 
63274fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
63374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
63474fe6c29SRuslan Bukin 
63574fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
63674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
63774fe6c29SRuslan Bukin 
63874fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
63974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
64074fe6c29SRuslan Bukin 
64174fe6c29SRuslan Bukin 	return ptu_passed();
64274fe6c29SRuslan Bukin }
64374fe6c29SRuslan Bukin 
attach_map(struct section_fixture * sfix)64474fe6c29SRuslan Bukin static struct ptunit_result attach_map(struct section_fixture *sfix)
64574fe6c29SRuslan Bukin {
64674fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
64774fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
64874fe6c29SRuslan Bukin 	int errcode;
64974fe6c29SRuslan Bukin 
65074fe6c29SRuslan Bukin 	iscache.map = 0;
65174fe6c29SRuslan Bukin 
65274fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
65374fe6c29SRuslan Bukin 
654*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
655*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
65674fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
65774fe6c29SRuslan Bukin 
65874fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
65974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
66074fe6c29SRuslan Bukin 
66174fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
66274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
66374fe6c29SRuslan Bukin 
66474fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
66574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
66674fe6c29SRuslan Bukin 
66774fe6c29SRuslan Bukin 	ptu_uint_eq(sfix->section->mcount, 2);
66874fe6c29SRuslan Bukin 
66974fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
67074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
67174fe6c29SRuslan Bukin 
67274fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
67374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
67474fe6c29SRuslan Bukin 
67574fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
67674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
67774fe6c29SRuslan Bukin 
67874fe6c29SRuslan Bukin 	return ptu_passed();
67974fe6c29SRuslan Bukin }
68074fe6c29SRuslan Bukin 
attach_bad_map(struct section_fixture * sfix)68174fe6c29SRuslan Bukin static struct ptunit_result attach_bad_map(struct section_fixture *sfix)
68274fe6c29SRuslan Bukin {
68374fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
68474fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
68574fe6c29SRuslan Bukin 	int errcode;
68674fe6c29SRuslan Bukin 
68774fe6c29SRuslan Bukin 	iscache.map = -pte_eos;
68874fe6c29SRuslan Bukin 
68974fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
69074fe6c29SRuslan Bukin 
691*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
692*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
69374fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
69474fe6c29SRuslan Bukin 
69574fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
69674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
69774fe6c29SRuslan Bukin 
69874fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
69974fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
70074fe6c29SRuslan Bukin 
70174fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
70274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
70374fe6c29SRuslan Bukin 
70474fe6c29SRuslan Bukin 	return ptu_passed();
70574fe6c29SRuslan Bukin }
70674fe6c29SRuslan Bukin 
attach_map_overflow(struct section_fixture * sfix)70774fe6c29SRuslan Bukin static struct ptunit_result attach_map_overflow(struct section_fixture *sfix)
70874fe6c29SRuslan Bukin {
70974fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
71074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
71174fe6c29SRuslan Bukin 	int errcode;
71274fe6c29SRuslan Bukin 
71374fe6c29SRuslan Bukin 	iscache.map = 1;
71474fe6c29SRuslan Bukin 
71574fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
71674fe6c29SRuslan Bukin 
717*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
718*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
71974fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
72074fe6c29SRuslan Bukin 
72174fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
72274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
72374fe6c29SRuslan Bukin 
72474fe6c29SRuslan Bukin 	sfix->section->mcount = UINT16_MAX - 1;
72574fe6c29SRuslan Bukin 
72674fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
72774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_overflow);
72874fe6c29SRuslan Bukin 
72974fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
73074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
73174fe6c29SRuslan Bukin 
73274fe6c29SRuslan Bukin 	return ptu_passed();
73374fe6c29SRuslan Bukin }
73474fe6c29SRuslan Bukin 
read(struct section_fixture * sfix)73574fe6c29SRuslan Bukin static struct ptunit_result read(struct section_fixture *sfix)
73674fe6c29SRuslan Bukin {
73774fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
73874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
73974fe6c29SRuslan Bukin 	int status;
74074fe6c29SRuslan Bukin 
74174fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
74274fe6c29SRuslan Bukin 
743*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
744*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
74574fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
74674fe6c29SRuslan Bukin 
74774fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
74874fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
74974fe6c29SRuslan Bukin 
75074fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
75174fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
75274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[1]);
75374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], bytes[2]);
75474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
75574fe6c29SRuslan Bukin 
75674fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
75774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
75874fe6c29SRuslan Bukin 
75974fe6c29SRuslan Bukin 	return ptu_passed();
76074fe6c29SRuslan Bukin }
76174fe6c29SRuslan Bukin 
read_null(struct section_fixture * sfix)76274fe6c29SRuslan Bukin static struct ptunit_result read_null(struct section_fixture *sfix)
76374fe6c29SRuslan Bukin {
76474fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
76574fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc };
76674fe6c29SRuslan Bukin 	int status;
76774fe6c29SRuslan Bukin 
76874fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
76974fe6c29SRuslan Bukin 
770*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
771*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
77274fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
77374fe6c29SRuslan Bukin 
77474fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
77574fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
77674fe6c29SRuslan Bukin 
77774fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, NULL, 1, 0x0ull);
77874fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
77974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
78074fe6c29SRuslan Bukin 
78174fe6c29SRuslan Bukin 	status = pt_section_read(NULL, buffer, 1, 0x0ull);
78274fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
78374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
78474fe6c29SRuslan Bukin 
78574fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
78674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
78774fe6c29SRuslan Bukin 
78874fe6c29SRuslan Bukin 	return ptu_passed();
78974fe6c29SRuslan Bukin }
79074fe6c29SRuslan Bukin 
read_offset(struct section_fixture * sfix)79174fe6c29SRuslan Bukin static struct ptunit_result read_offset(struct section_fixture *sfix)
79274fe6c29SRuslan Bukin {
79374fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
79474fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
79574fe6c29SRuslan Bukin 	int status;
79674fe6c29SRuslan Bukin 
79774fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
79874fe6c29SRuslan Bukin 
799*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
800*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
80174fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
80274fe6c29SRuslan Bukin 
80374fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
80474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
80574fe6c29SRuslan Bukin 
80674fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x1ull);
80774fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
80874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[2]);
80974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], bytes[3]);
81074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
81174fe6c29SRuslan Bukin 
81274fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
81374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
81474fe6c29SRuslan Bukin 
81574fe6c29SRuslan Bukin 	return ptu_passed();
81674fe6c29SRuslan Bukin }
81774fe6c29SRuslan Bukin 
read_truncated(struct section_fixture * sfix)81874fe6c29SRuslan Bukin static struct ptunit_result read_truncated(struct section_fixture *sfix)
81974fe6c29SRuslan Bukin {
82074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc, 0xcc };
82174fe6c29SRuslan Bukin 	int status;
82274fe6c29SRuslan Bukin 
82374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
82474fe6c29SRuslan Bukin 
825*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
826*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
82774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
82874fe6c29SRuslan Bukin 
82974fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
83074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
83174fe6c29SRuslan Bukin 
83274fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x2ull);
83374fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
83474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[3]);
83574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
83674fe6c29SRuslan Bukin 
83774fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
83874fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
83974fe6c29SRuslan Bukin 
84074fe6c29SRuslan Bukin 	return ptu_passed();
84174fe6c29SRuslan Bukin }
84274fe6c29SRuslan Bukin 
read_from_truncated(struct section_fixture * sfix)84374fe6c29SRuslan Bukin static struct ptunit_result read_from_truncated(struct section_fixture *sfix)
84474fe6c29SRuslan Bukin {
84574fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc, 0xcc };
84674fe6c29SRuslan Bukin 	int status;
84774fe6c29SRuslan Bukin 
84874fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
84974fe6c29SRuslan Bukin 
850*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x2ull, 0x10ull);
851*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
85274fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
85374fe6c29SRuslan Bukin 
85474fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
85574fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
85674fe6c29SRuslan Bukin 
85774fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x1ull);
85874fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
85974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[3]);
86074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
86174fe6c29SRuslan Bukin 
86274fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
86374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
86474fe6c29SRuslan Bukin 
86574fe6c29SRuslan Bukin 	return ptu_passed();
86674fe6c29SRuslan Bukin }
86774fe6c29SRuslan Bukin 
read_nomem(struct section_fixture * sfix)86874fe6c29SRuslan Bukin static struct ptunit_result read_nomem(struct section_fixture *sfix)
86974fe6c29SRuslan Bukin {
87074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
87174fe6c29SRuslan Bukin 	int status;
87274fe6c29SRuslan Bukin 
87374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
87474fe6c29SRuslan Bukin 
875*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
876*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
87774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
87874fe6c29SRuslan Bukin 
87974fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
88074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
88174fe6c29SRuslan Bukin 
88274fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 1, 0x3ull);
88374fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
88474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
88574fe6c29SRuslan Bukin 
88674fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
88774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
88874fe6c29SRuslan Bukin 
88974fe6c29SRuslan Bukin 	return ptu_passed();
89074fe6c29SRuslan Bukin }
89174fe6c29SRuslan Bukin 
read_overflow(struct section_fixture * sfix)89274fe6c29SRuslan Bukin static struct ptunit_result read_overflow(struct section_fixture *sfix)
89374fe6c29SRuslan Bukin {
89474fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
89574fe6c29SRuslan Bukin 	int status;
89674fe6c29SRuslan Bukin 
89774fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
89874fe6c29SRuslan Bukin 
899*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
900*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
90174fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
90274fe6c29SRuslan Bukin 
90374fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
90474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
90574fe6c29SRuslan Bukin 
90674fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 1,
90774fe6c29SRuslan Bukin 				 0xffffffffffff0000ull);
90874fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
90974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
91074fe6c29SRuslan Bukin 
91174fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
91274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
91374fe6c29SRuslan Bukin 
91474fe6c29SRuslan Bukin 	return ptu_passed();
91574fe6c29SRuslan Bukin }
91674fe6c29SRuslan Bukin 
read_overflow_32bit(struct section_fixture * sfix)91774fe6c29SRuslan Bukin static struct ptunit_result read_overflow_32bit(struct section_fixture *sfix)
91874fe6c29SRuslan Bukin {
91974fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
92074fe6c29SRuslan Bukin 	int status;
92174fe6c29SRuslan Bukin 
92274fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
92374fe6c29SRuslan Bukin 
924*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
925*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
92674fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
92774fe6c29SRuslan Bukin 
92874fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
92974fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
93074fe6c29SRuslan Bukin 
93174fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 1,
93274fe6c29SRuslan Bukin 				 0xff00000000ull);
93374fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
93474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
93574fe6c29SRuslan Bukin 
93674fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
93774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
93874fe6c29SRuslan Bukin 
93974fe6c29SRuslan Bukin 	return ptu_passed();
94074fe6c29SRuslan Bukin }
94174fe6c29SRuslan Bukin 
read_nomap(struct section_fixture * sfix)94274fe6c29SRuslan Bukin static struct ptunit_result read_nomap(struct section_fixture *sfix)
94374fe6c29SRuslan Bukin {
94474fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
94574fe6c29SRuslan Bukin 	int status;
94674fe6c29SRuslan Bukin 
94774fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
94874fe6c29SRuslan Bukin 
949*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
950*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
95174fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
95274fe6c29SRuslan Bukin 
95374fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 1, 0x0ull);
95474fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
95574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
95674fe6c29SRuslan Bukin 
95774fe6c29SRuslan Bukin 	return ptu_passed();
95874fe6c29SRuslan Bukin }
95974fe6c29SRuslan Bukin 
read_unmap_map(struct section_fixture * sfix)96074fe6c29SRuslan Bukin static struct ptunit_result read_unmap_map(struct section_fixture *sfix)
96174fe6c29SRuslan Bukin {
96274fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
96374fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
96474fe6c29SRuslan Bukin 	int status;
96574fe6c29SRuslan Bukin 
96674fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
96774fe6c29SRuslan Bukin 
968*85f87cf4SRuslan Bukin 	status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
969*85f87cf4SRuslan Bukin 	ptu_int_eq(status, 0);
97074fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
97174fe6c29SRuslan Bukin 
97274fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
97374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
97474fe6c29SRuslan Bukin 
97574fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
97674fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
97774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[1]);
97874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], bytes[2]);
97974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
98074fe6c29SRuslan Bukin 
98174fe6c29SRuslan Bukin 	memset(buffer, 0xcc, sizeof(buffer));
98274fe6c29SRuslan Bukin 
98374fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
98474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
98574fe6c29SRuslan Bukin 
98674fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
98774fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
98874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
98974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
99074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
99174fe6c29SRuslan Bukin 
99274fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
99374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
99474fe6c29SRuslan Bukin 
99574fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
99674fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
99774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[1]);
99874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], bytes[2]);
99974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
100074fe6c29SRuslan Bukin 
100174fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
100274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
100374fe6c29SRuslan Bukin 
100474fe6c29SRuslan Bukin 	return ptu_passed();
100574fe6c29SRuslan Bukin }
100674fe6c29SRuslan Bukin 
worker_read(void * arg)100774fe6c29SRuslan Bukin static int worker_read(void *arg)
100874fe6c29SRuslan Bukin {
100974fe6c29SRuslan Bukin 	struct section_fixture *sfix;
101074fe6c29SRuslan Bukin 	int it, errcode;
101174fe6c29SRuslan Bukin 
101274fe6c29SRuslan Bukin 	sfix = arg;
101374fe6c29SRuslan Bukin 	if (!sfix)
101474fe6c29SRuslan Bukin 		return -pte_internal;
101574fe6c29SRuslan Bukin 
101674fe6c29SRuslan Bukin 	for (it = 0; it < num_work; ++it) {
101774fe6c29SRuslan Bukin 		uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
101874fe6c29SRuslan Bukin 		int read;
101974fe6c29SRuslan Bukin 
102074fe6c29SRuslan Bukin 		errcode = pt_section_get(sfix->section);
102174fe6c29SRuslan Bukin 		if (errcode < 0)
102274fe6c29SRuslan Bukin 			return errcode;
102374fe6c29SRuslan Bukin 
102474fe6c29SRuslan Bukin 		errcode = pt_section_map(sfix->section);
102574fe6c29SRuslan Bukin 		if (errcode < 0)
102674fe6c29SRuslan Bukin 			goto out_put;
102774fe6c29SRuslan Bukin 
102874fe6c29SRuslan Bukin 		read = pt_section_read(sfix->section, buffer, 2, 0x0ull);
102974fe6c29SRuslan Bukin 		if (read < 0)
103074fe6c29SRuslan Bukin 			goto out_unmap;
103174fe6c29SRuslan Bukin 
103274fe6c29SRuslan Bukin 		errcode = -pte_invalid;
103374fe6c29SRuslan Bukin 		if ((read != 2) || (buffer[0] != 0x2) || (buffer[1] != 0x4))
103474fe6c29SRuslan Bukin 			goto out_unmap;
103574fe6c29SRuslan Bukin 
103674fe6c29SRuslan Bukin 		errcode = pt_section_unmap(sfix->section);
103774fe6c29SRuslan Bukin 		if (errcode < 0)
103874fe6c29SRuslan Bukin 			goto out_put;
103974fe6c29SRuslan Bukin 
104074fe6c29SRuslan Bukin 		errcode = pt_section_put(sfix->section);
104174fe6c29SRuslan Bukin 		if (errcode < 0)
104274fe6c29SRuslan Bukin 			return errcode;
104374fe6c29SRuslan Bukin 	}
104474fe6c29SRuslan Bukin 
104574fe6c29SRuslan Bukin 	return 0;
104674fe6c29SRuslan Bukin 
104774fe6c29SRuslan Bukin out_unmap:
104874fe6c29SRuslan Bukin 	(void) pt_section_unmap(sfix->section);
104974fe6c29SRuslan Bukin 
105074fe6c29SRuslan Bukin out_put:
105174fe6c29SRuslan Bukin 	(void) pt_section_put(sfix->section);
105274fe6c29SRuslan Bukin 	return errcode;
105374fe6c29SRuslan Bukin }
105474fe6c29SRuslan Bukin 
worker_bcache(void * arg)105574fe6c29SRuslan Bukin static int worker_bcache(void *arg)
105674fe6c29SRuslan Bukin {
105774fe6c29SRuslan Bukin 	struct section_fixture *sfix;
105874fe6c29SRuslan Bukin 	int it, errcode;
105974fe6c29SRuslan Bukin 
106074fe6c29SRuslan Bukin 	sfix = arg;
106174fe6c29SRuslan Bukin 	if (!sfix)
106274fe6c29SRuslan Bukin 		return -pte_internal;
106374fe6c29SRuslan Bukin 
106474fe6c29SRuslan Bukin 	errcode = pt_section_get(sfix->section);
106574fe6c29SRuslan Bukin 	if (errcode < 0)
106674fe6c29SRuslan Bukin 		return errcode;
106774fe6c29SRuslan Bukin 
106874fe6c29SRuslan Bukin 	for (it = 0; it < num_work; ++it) {
106974fe6c29SRuslan Bukin 		struct pt_block_cache *bcache;
107074fe6c29SRuslan Bukin 
107174fe6c29SRuslan Bukin 		errcode = pt_section_map(sfix->section);
107274fe6c29SRuslan Bukin 		if (errcode < 0)
107374fe6c29SRuslan Bukin 			goto out_put;
107474fe6c29SRuslan Bukin 
107574fe6c29SRuslan Bukin 		errcode = pt_section_request_bcache(sfix->section);
107674fe6c29SRuslan Bukin 		if (errcode < 0)
107774fe6c29SRuslan Bukin 			goto out_unmap;
107874fe6c29SRuslan Bukin 
107974fe6c29SRuslan Bukin 		bcache = pt_section_bcache(sfix->section);
108074fe6c29SRuslan Bukin 		if (!bcache) {
108174fe6c29SRuslan Bukin 			errcode = -pte_nomem;
108274fe6c29SRuslan Bukin 			goto out_unmap;
108374fe6c29SRuslan Bukin 		}
108474fe6c29SRuslan Bukin 
108574fe6c29SRuslan Bukin 		errcode = pt_section_unmap(sfix->section);
108674fe6c29SRuslan Bukin 		if (errcode < 0)
108774fe6c29SRuslan Bukin 			goto out_put;
108874fe6c29SRuslan Bukin 	}
108974fe6c29SRuslan Bukin 
109074fe6c29SRuslan Bukin 	return pt_section_put(sfix->section);
109174fe6c29SRuslan Bukin 
109274fe6c29SRuslan Bukin out_unmap:
109374fe6c29SRuslan Bukin 	(void) pt_section_unmap(sfix->section);
109474fe6c29SRuslan Bukin 
109574fe6c29SRuslan Bukin out_put:
109674fe6c29SRuslan Bukin 	(void) pt_section_put(sfix->section);
109774fe6c29SRuslan Bukin 	return errcode;
109874fe6c29SRuslan Bukin }
109974fe6c29SRuslan Bukin 
stress(struct section_fixture * sfix,int (* worker)(void *))110074fe6c29SRuslan Bukin static struct ptunit_result stress(struct section_fixture *sfix,
110174fe6c29SRuslan Bukin 				   int (*worker)(void *))
110274fe6c29SRuslan Bukin {
110374fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
110474fe6c29SRuslan Bukin 	int errcode;
110574fe6c29SRuslan Bukin 
110674fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
110774fe6c29SRuslan Bukin 
1108*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1109*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
111074fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
111174fe6c29SRuslan Bukin 
111274fe6c29SRuslan Bukin #if defined(FEATURE_THREADS)
111374fe6c29SRuslan Bukin 	{
111474fe6c29SRuslan Bukin 		int thrd;
111574fe6c29SRuslan Bukin 
111674fe6c29SRuslan Bukin 		for (thrd = 0; thrd < num_threads; ++thrd)
111774fe6c29SRuslan Bukin 			ptu_test(ptunit_thrd_create, &sfix->thrd, worker, sfix);
111874fe6c29SRuslan Bukin 	}
111974fe6c29SRuslan Bukin #endif /* defined(FEATURE_THREADS) */
112074fe6c29SRuslan Bukin 
112174fe6c29SRuslan Bukin 	errcode = worker(sfix);
112274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
112374fe6c29SRuslan Bukin 
112474fe6c29SRuslan Bukin 	return ptu_passed();
112574fe6c29SRuslan Bukin }
112674fe6c29SRuslan Bukin 
init_no_bcache(struct section_fixture * sfix)112774fe6c29SRuslan Bukin static struct ptunit_result init_no_bcache(struct section_fixture *sfix)
112874fe6c29SRuslan Bukin {
112974fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
113074fe6c29SRuslan Bukin 	struct pt_block_cache *bcache;
113174fe6c29SRuslan Bukin 	int errcode;
113274fe6c29SRuslan Bukin 
113374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
113474fe6c29SRuslan Bukin 
1135*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1136*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
113774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
113874fe6c29SRuslan Bukin 
113974fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
114074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
114174fe6c29SRuslan Bukin 
114274fe6c29SRuslan Bukin 	bcache = pt_section_bcache(sfix->section);
114374fe6c29SRuslan Bukin 	ptu_null(bcache);
114474fe6c29SRuslan Bukin 
114574fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
114674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
114774fe6c29SRuslan Bukin 
114874fe6c29SRuslan Bukin 	return ptu_passed();
114974fe6c29SRuslan Bukin }
115074fe6c29SRuslan Bukin 
bcache_alloc_free(struct section_fixture * sfix)115174fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_free(struct section_fixture *sfix)
115274fe6c29SRuslan Bukin {
115374fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
115474fe6c29SRuslan Bukin 	struct pt_block_cache *bcache;
115574fe6c29SRuslan Bukin 	int errcode;
115674fe6c29SRuslan Bukin 
115774fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
115874fe6c29SRuslan Bukin 
1159*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1160*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
116174fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
116274fe6c29SRuslan Bukin 
116374fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
116474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
116574fe6c29SRuslan Bukin 
116674fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
116774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
116874fe6c29SRuslan Bukin 
116974fe6c29SRuslan Bukin 	bcache = pt_section_bcache(sfix->section);
117074fe6c29SRuslan Bukin 	ptu_ptr(bcache);
117174fe6c29SRuslan Bukin 	ptu_uint_eq(bcache->nentries, sfix->section->size);
117274fe6c29SRuslan Bukin 
117374fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
117474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
117574fe6c29SRuslan Bukin 
117674fe6c29SRuslan Bukin 	bcache = pt_section_bcache(sfix->section);
117774fe6c29SRuslan Bukin 	ptu_null(bcache);
117874fe6c29SRuslan Bukin 
117974fe6c29SRuslan Bukin 	return ptu_passed();
118074fe6c29SRuslan Bukin }
118174fe6c29SRuslan Bukin 
bcache_alloc_twice(struct section_fixture * sfix)118274fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_twice(struct section_fixture *sfix)
118374fe6c29SRuslan Bukin {
118474fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
118574fe6c29SRuslan Bukin 	int errcode;
118674fe6c29SRuslan Bukin 
118774fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
118874fe6c29SRuslan Bukin 
1189*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1190*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
119174fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
119274fe6c29SRuslan Bukin 
119374fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
119474fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
119574fe6c29SRuslan Bukin 
119674fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
119774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
119874fe6c29SRuslan Bukin 
119974fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
120074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
120174fe6c29SRuslan Bukin 
120274fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
120374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
120474fe6c29SRuslan Bukin 
120574fe6c29SRuslan Bukin 	return ptu_passed();
120674fe6c29SRuslan Bukin }
120774fe6c29SRuslan Bukin 
bcache_alloc_nomap(struct section_fixture * sfix)120874fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_nomap(struct section_fixture *sfix)
120974fe6c29SRuslan Bukin {
121074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
121174fe6c29SRuslan Bukin 	int errcode;
121274fe6c29SRuslan Bukin 
121374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
121474fe6c29SRuslan Bukin 
1215*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1216*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
121774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
121874fe6c29SRuslan Bukin 
121974fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
122074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
122174fe6c29SRuslan Bukin 
122274fe6c29SRuslan Bukin 	return ptu_passed();
122374fe6c29SRuslan Bukin }
122474fe6c29SRuslan Bukin 
memsize_nomap(struct section_fixture * sfix)122574fe6c29SRuslan Bukin static struct ptunit_result memsize_nomap(struct section_fixture *sfix)
122674fe6c29SRuslan Bukin {
122774fe6c29SRuslan Bukin 	uint64_t memsize;
122874fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
122974fe6c29SRuslan Bukin 	int errcode;
123074fe6c29SRuslan Bukin 
123174fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
123274fe6c29SRuslan Bukin 
1233*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1234*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
123574fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
123674fe6c29SRuslan Bukin 
123774fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, &memsize);
123874fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
123974fe6c29SRuslan Bukin 	ptu_uint_eq(memsize, 0ull);
124074fe6c29SRuslan Bukin 
124174fe6c29SRuslan Bukin 	return ptu_passed();
124274fe6c29SRuslan Bukin }
124374fe6c29SRuslan Bukin 
memsize_unmap(struct section_fixture * sfix)124474fe6c29SRuslan Bukin static struct ptunit_result memsize_unmap(struct section_fixture *sfix)
124574fe6c29SRuslan Bukin {
124674fe6c29SRuslan Bukin 	uint64_t memsize;
124774fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
124874fe6c29SRuslan Bukin 	int errcode;
124974fe6c29SRuslan Bukin 
125074fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
125174fe6c29SRuslan Bukin 
1252*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1253*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
125474fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
125574fe6c29SRuslan Bukin 
125674fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
125774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
125874fe6c29SRuslan Bukin 
125974fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
126074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
126174fe6c29SRuslan Bukin 
126274fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, &memsize);
126374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
126474fe6c29SRuslan Bukin 	ptu_uint_eq(memsize, 0ull);
126574fe6c29SRuslan Bukin 
126674fe6c29SRuslan Bukin 	return ptu_passed();
126774fe6c29SRuslan Bukin }
126874fe6c29SRuslan Bukin 
memsize_map_nobcache(struct section_fixture * sfix)126974fe6c29SRuslan Bukin static struct ptunit_result memsize_map_nobcache(struct section_fixture *sfix)
127074fe6c29SRuslan Bukin {
127174fe6c29SRuslan Bukin 	uint64_t memsize;
127274fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
127374fe6c29SRuslan Bukin 	int errcode;
127474fe6c29SRuslan Bukin 
127574fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
127674fe6c29SRuslan Bukin 
1277*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1278*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
127974fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
128074fe6c29SRuslan Bukin 
128174fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
128274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
128374fe6c29SRuslan Bukin 
128474fe6c29SRuslan Bukin 	memsize = 0xfefefefefefefefeull;
128574fe6c29SRuslan Bukin 
128674fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, &memsize);
128774fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
128874fe6c29SRuslan Bukin 	ptu_uint_ge(memsize, 0ull);
128974fe6c29SRuslan Bukin 	ptu_uint_le(memsize, 0x2000ull);
129074fe6c29SRuslan Bukin 
129174fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
129274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
129374fe6c29SRuslan Bukin 
129474fe6c29SRuslan Bukin 	return ptu_passed();
129574fe6c29SRuslan Bukin }
129674fe6c29SRuslan Bukin 
memsize_map_bcache(struct section_fixture * sfix)129774fe6c29SRuslan Bukin static struct ptunit_result memsize_map_bcache(struct section_fixture *sfix)
129874fe6c29SRuslan Bukin {
129974fe6c29SRuslan Bukin 	uint64_t memsize;
130074fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
130174fe6c29SRuslan Bukin 	int errcode;
130274fe6c29SRuslan Bukin 
130374fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
130474fe6c29SRuslan Bukin 
1305*85f87cf4SRuslan Bukin 	errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
1306*85f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
130774fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
130874fe6c29SRuslan Bukin 
130974fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
131074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
131174fe6c29SRuslan Bukin 
131274fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
131374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
131474fe6c29SRuslan Bukin 
131574fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, &memsize);
131674fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
131774fe6c29SRuslan Bukin 	ptu_uint_ge(memsize,
131874fe6c29SRuslan Bukin 		    sfix->section->size * sizeof(struct pt_bcache_entry));
131974fe6c29SRuslan Bukin 
132074fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
132174fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
132274fe6c29SRuslan Bukin 
132374fe6c29SRuslan Bukin 	return ptu_passed();
132474fe6c29SRuslan Bukin }
132574fe6c29SRuslan Bukin 
sfix_init(struct section_fixture * sfix)132674fe6c29SRuslan Bukin static struct ptunit_result sfix_init(struct section_fixture *sfix)
132774fe6c29SRuslan Bukin {
132874fe6c29SRuslan Bukin 	int errcode;
132974fe6c29SRuslan Bukin 
133074fe6c29SRuslan Bukin 	sfix->section = NULL;
133174fe6c29SRuslan Bukin 	sfix->file = NULL;
133274fe6c29SRuslan Bukin 	sfix->name = NULL;
133374fe6c29SRuslan Bukin 
133474fe6c29SRuslan Bukin 	errcode = ptunit_mkfile(&sfix->file, &sfix->name, "wb");
133574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
133674fe6c29SRuslan Bukin 
133774fe6c29SRuslan Bukin 	ptu_test(ptunit_thrd_init, &sfix->thrd);
133874fe6c29SRuslan Bukin 
133974fe6c29SRuslan Bukin 	return ptu_passed();
134074fe6c29SRuslan Bukin }
134174fe6c29SRuslan Bukin 
sfix_fini(struct section_fixture * sfix)134274fe6c29SRuslan Bukin static struct ptunit_result sfix_fini(struct section_fixture *sfix)
134374fe6c29SRuslan Bukin {
1344*85f87cf4SRuslan Bukin 	char *filename;
1345*85f87cf4SRuslan Bukin 	FILE *file;
1346*85f87cf4SRuslan Bukin 	int thrd, errcode;
134774fe6c29SRuslan Bukin 
134874fe6c29SRuslan Bukin 	ptu_test(ptunit_thrd_fini, &sfix->thrd);
134974fe6c29SRuslan Bukin 
135074fe6c29SRuslan Bukin 	if (sfix->section) {
135174fe6c29SRuslan Bukin 		pt_section_put(sfix->section);
135274fe6c29SRuslan Bukin 		sfix->section = NULL;
135374fe6c29SRuslan Bukin 	}
135474fe6c29SRuslan Bukin 
1355*85f87cf4SRuslan Bukin 	filename = sfix->name;
1356*85f87cf4SRuslan Bukin 	file = sfix->file;
1357*85f87cf4SRuslan Bukin 	sfix->name = NULL;
135874fe6c29SRuslan Bukin 	sfix->file = NULL;
135974fe6c29SRuslan Bukin 
1360*85f87cf4SRuslan Bukin 	/* Try removing the file while we still have it open to avoid races
1361*85f87cf4SRuslan Bukin 	 * with others re-using the temporary filename.
1362*85f87cf4SRuslan Bukin 	 *
1363*85f87cf4SRuslan Bukin 	 * On some systems that may not be possible and we can choose between:
1364*85f87cf4SRuslan Bukin 	 *
1365*85f87cf4SRuslan Bukin 	 *   - guaranteed leaking files or
1366*85f87cf4SRuslan Bukin 	 *   - running the risk of removing someone elses file
1367*85f87cf4SRuslan Bukin 	 *
1368*85f87cf4SRuslan Bukin 	 * We choose the latter.  Assuming those systems behave consistently,
1369*85f87cf4SRuslan Bukin 	 * removing someone elses file should only succeed if it isn't open at
1370*85f87cf4SRuslan Bukin 	 * the moment we try removing it.  Given that this is a temporary file,
1371*85f87cf4SRuslan Bukin 	 * we should be able to rule out accidental name clashes with
1372*85f87cf4SRuslan Bukin 	 * non-termporary files.
1373*85f87cf4SRuslan Bukin 	 */
1374*85f87cf4SRuslan Bukin 	if (filename && file) {
1375*85f87cf4SRuslan Bukin 		errcode = remove(filename);
1376*85f87cf4SRuslan Bukin 		if (!errcode) {
1377*85f87cf4SRuslan Bukin 			free(filename);
1378*85f87cf4SRuslan Bukin 			filename = NULL;
1379*85f87cf4SRuslan Bukin 		}
138074fe6c29SRuslan Bukin 	}
138174fe6c29SRuslan Bukin 
1382*85f87cf4SRuslan Bukin 	if (file)
1383*85f87cf4SRuslan Bukin 		fclose(file);
1384*85f87cf4SRuslan Bukin 
1385*85f87cf4SRuslan Bukin 	if (filename) {
1386*85f87cf4SRuslan Bukin 		(void) remove(filename);
1387*85f87cf4SRuslan Bukin 		free(filename);
138874fe6c29SRuslan Bukin 	}
138974fe6c29SRuslan Bukin 
1390*85f87cf4SRuslan Bukin 	for (thrd = 0; thrd < sfix->thrd.nthreads; ++thrd)
1391*85f87cf4SRuslan Bukin 		ptu_int_eq(sfix->thrd.result[thrd], 0);
1392*85f87cf4SRuslan Bukin 
139374fe6c29SRuslan Bukin 	return ptu_passed();
139474fe6c29SRuslan Bukin }
139574fe6c29SRuslan Bukin 
main(int argc,char ** argv)139674fe6c29SRuslan Bukin int main(int argc, char **argv)
139774fe6c29SRuslan Bukin {
139874fe6c29SRuslan Bukin 	struct section_fixture sfix;
139974fe6c29SRuslan Bukin 	struct ptunit_suite suite;
140074fe6c29SRuslan Bukin 
140174fe6c29SRuslan Bukin 	sfix.init = sfix_init;
140274fe6c29SRuslan Bukin 	sfix.fini = sfix_fini;
140374fe6c29SRuslan Bukin 
140474fe6c29SRuslan Bukin 	suite = ptunit_mk_suite(argc, argv);
140574fe6c29SRuslan Bukin 
140674fe6c29SRuslan Bukin 	ptu_run_f(suite, create, sfix);
140774fe6c29SRuslan Bukin 	ptu_run_f(suite, create_bad_offset, sfix);
140874fe6c29SRuslan Bukin 	ptu_run_f(suite, create_truncated, sfix);
140974fe6c29SRuslan Bukin 	ptu_run_f(suite, create_empty, sfix);
141074fe6c29SRuslan Bukin 
141174fe6c29SRuslan Bukin 	ptu_run(suite, filename_null);
141274fe6c29SRuslan Bukin 	ptu_run(suite, offset_null);
141374fe6c29SRuslan Bukin 	ptu_run(suite, size_null);
141474fe6c29SRuslan Bukin 	ptu_run(suite, get_null);
141574fe6c29SRuslan Bukin 	ptu_run(suite, put_null);
141674fe6c29SRuslan Bukin 	ptu_run(suite, attach_null);
141774fe6c29SRuslan Bukin 	ptu_run(suite, detach_null);
141874fe6c29SRuslan Bukin 	ptu_run(suite, map_null);
141974fe6c29SRuslan Bukin 	ptu_run(suite, unmap_null);
142074fe6c29SRuslan Bukin 	ptu_run(suite, cache_null);
142174fe6c29SRuslan Bukin 
142274fe6c29SRuslan Bukin 	ptu_run_f(suite, get_overflow, sfix);
142374fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_overflow, sfix);
142474fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_bad_ucount, sfix);
142574fe6c29SRuslan Bukin 	ptu_run_f(suite, map_change, sfix);
142674fe6c29SRuslan Bukin 	ptu_run_f(suite, map_put, sfix);
142774fe6c29SRuslan Bukin 	ptu_run_f(suite, unmap_nomap, sfix);
142874fe6c29SRuslan Bukin 	ptu_run_f(suite, map_overflow, sfix);
142974fe6c29SRuslan Bukin 	ptu_run_f(suite, get_put, sfix);
143074fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_detach, sfix);
143174fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_bad_iscache, sfix);
143274fe6c29SRuslan Bukin 	ptu_run_f(suite, detach_bad_iscache, sfix);
143374fe6c29SRuslan Bukin 	ptu_run_f(suite, map_unmap, sfix);
143474fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_map, sfix);
143574fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_bad_map, sfix);
143674fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_map_overflow, sfix);
143774fe6c29SRuslan Bukin 	ptu_run_f(suite, read, sfix);
143874fe6c29SRuslan Bukin 	ptu_run_f(suite, read_null, sfix);
143974fe6c29SRuslan Bukin 	ptu_run_f(suite, read_offset, sfix);
144074fe6c29SRuslan Bukin 	ptu_run_f(suite, read_truncated, sfix);
144174fe6c29SRuslan Bukin 	ptu_run_f(suite, read_from_truncated, sfix);
144274fe6c29SRuslan Bukin 	ptu_run_f(suite, read_nomem, sfix);
144374fe6c29SRuslan Bukin 	ptu_run_f(suite, read_overflow, sfix);
144474fe6c29SRuslan Bukin 	ptu_run_f(suite, read_overflow_32bit, sfix);
144574fe6c29SRuslan Bukin 	ptu_run_f(suite, read_nomap, sfix);
144674fe6c29SRuslan Bukin 	ptu_run_f(suite, read_unmap_map, sfix);
144774fe6c29SRuslan Bukin 
144874fe6c29SRuslan Bukin 	ptu_run_f(suite, init_no_bcache, sfix);
144974fe6c29SRuslan Bukin 	ptu_run_f(suite, bcache_alloc_free, sfix);
145074fe6c29SRuslan Bukin 	ptu_run_f(suite, bcache_alloc_twice, sfix);
145174fe6c29SRuslan Bukin 	ptu_run_f(suite, bcache_alloc_nomap, sfix);
145274fe6c29SRuslan Bukin 
145374fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_null, sfix);
145474fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_nomap, sfix);
145574fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_unmap, sfix);
145674fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_map_nobcache, sfix);
145774fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_map_bcache, sfix);
145874fe6c29SRuslan Bukin 
145974fe6c29SRuslan Bukin 	ptu_run_fp(suite, stress, sfix, worker_bcache);
146074fe6c29SRuslan Bukin 	ptu_run_fp(suite, stress, sfix, worker_read);
146174fe6c29SRuslan Bukin 
146274fe6c29SRuslan Bukin 	return ptunit_report(&suite);
146374fe6c29SRuslan Bukin }
1464