xref: /freebsd/contrib/processor-trace/libipt/test/src/ptunit-section.c (revision 74fe6c29fb7eef3418d7919dcd41dc1a04a982a1)
1*74fe6c29SRuslan Bukin /*
2*74fe6c29SRuslan Bukin  * Copyright (c) 2013-2018, Intel Corporation
3*74fe6c29SRuslan Bukin  *
4*74fe6c29SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
5*74fe6c29SRuslan Bukin  * modification, are permitted provided that the following conditions are met:
6*74fe6c29SRuslan Bukin  *
7*74fe6c29SRuslan Bukin  *  * Redistributions of source code must retain the above copyright notice,
8*74fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer.
9*74fe6c29SRuslan Bukin  *  * Redistributions in binary form must reproduce the above copyright notice,
10*74fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer in the documentation
11*74fe6c29SRuslan Bukin  *    and/or other materials provided with the distribution.
12*74fe6c29SRuslan Bukin  *  * Neither the name of Intel Corporation nor the names of its contributors
13*74fe6c29SRuslan Bukin  *    may be used to endorse or promote products derived from this software
14*74fe6c29SRuslan Bukin  *    without specific prior written permission.
15*74fe6c29SRuslan Bukin  *
16*74fe6c29SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*74fe6c29SRuslan Bukin  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*74fe6c29SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*74fe6c29SRuslan Bukin  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20*74fe6c29SRuslan Bukin  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*74fe6c29SRuslan Bukin  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*74fe6c29SRuslan Bukin  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*74fe6c29SRuslan Bukin  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*74fe6c29SRuslan Bukin  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*74fe6c29SRuslan Bukin  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*74fe6c29SRuslan Bukin  * POSSIBILITY OF SUCH DAMAGE.
27*74fe6c29SRuslan Bukin  */
28*74fe6c29SRuslan Bukin 
29*74fe6c29SRuslan Bukin #include "ptunit_threads.h"
30*74fe6c29SRuslan Bukin #include "ptunit_mkfile.h"
31*74fe6c29SRuslan Bukin 
32*74fe6c29SRuslan Bukin #include "pt_section.h"
33*74fe6c29SRuslan Bukin #include "pt_block_cache.h"
34*74fe6c29SRuslan Bukin 
35*74fe6c29SRuslan Bukin #include "intel-pt.h"
36*74fe6c29SRuslan Bukin 
37*74fe6c29SRuslan Bukin #include <stdlib.h>
38*74fe6c29SRuslan Bukin #include <stdio.h>
39*74fe6c29SRuslan Bukin 
40*74fe6c29SRuslan Bukin 
41*74fe6c29SRuslan Bukin 
42*74fe6c29SRuslan Bukin struct pt_image_section_cache {
43*74fe6c29SRuslan Bukin 	int map;
44*74fe6c29SRuslan Bukin };
45*74fe6c29SRuslan Bukin 
46*74fe6c29SRuslan Bukin extern int pt_iscache_notify_map(struct pt_image_section_cache *iscache,
47*74fe6c29SRuslan Bukin 				 struct pt_section *section);
48*74fe6c29SRuslan Bukin extern int pt_iscache_notify_resize(struct pt_image_section_cache *iscache,
49*74fe6c29SRuslan Bukin 				    struct pt_section *section, uint64_t size);
50*74fe6c29SRuslan Bukin 
51*74fe6c29SRuslan Bukin int pt_iscache_notify_map(struct pt_image_section_cache *iscache,
52*74fe6c29SRuslan Bukin 			  struct pt_section *section)
53*74fe6c29SRuslan Bukin {
54*74fe6c29SRuslan Bukin 	if (!iscache)
55*74fe6c29SRuslan Bukin 		return -pte_internal;
56*74fe6c29SRuslan Bukin 
57*74fe6c29SRuslan Bukin 	if (iscache->map <= 0)
58*74fe6c29SRuslan Bukin 		return iscache->map;
59*74fe6c29SRuslan Bukin 
60*74fe6c29SRuslan Bukin 	/* Avoid recursion. */
61*74fe6c29SRuslan Bukin 	iscache->map = 0;
62*74fe6c29SRuslan Bukin 
63*74fe6c29SRuslan Bukin 	return pt_section_map_share(section);
64*74fe6c29SRuslan Bukin }
65*74fe6c29SRuslan Bukin 
66*74fe6c29SRuslan Bukin int pt_iscache_notify_resize(struct pt_image_section_cache *iscache,
67*74fe6c29SRuslan Bukin 			     struct pt_section *section, uint64_t size)
68*74fe6c29SRuslan Bukin {
69*74fe6c29SRuslan Bukin 	uint64_t memsize;
70*74fe6c29SRuslan Bukin 	int errcode;
71*74fe6c29SRuslan Bukin 
72*74fe6c29SRuslan Bukin 	if (!iscache)
73*74fe6c29SRuslan Bukin 		return -pte_internal;
74*74fe6c29SRuslan Bukin 
75*74fe6c29SRuslan Bukin 	if (iscache->map <= 0)
76*74fe6c29SRuslan Bukin 		return iscache->map;
77*74fe6c29SRuslan Bukin 
78*74fe6c29SRuslan Bukin 	/* Avoid recursion. */
79*74fe6c29SRuslan Bukin 	iscache->map = 0;
80*74fe6c29SRuslan Bukin 
81*74fe6c29SRuslan Bukin 	errcode = pt_section_memsize(section, &memsize);
82*74fe6c29SRuslan Bukin 	if (errcode < 0)
83*74fe6c29SRuslan Bukin 		return errcode;
84*74fe6c29SRuslan Bukin 
85*74fe6c29SRuslan Bukin 	if (size != memsize)
86*74fe6c29SRuslan Bukin 		return -pte_internal;
87*74fe6c29SRuslan Bukin 
88*74fe6c29SRuslan Bukin 	return pt_section_map_share(section);
89*74fe6c29SRuslan Bukin }
90*74fe6c29SRuslan Bukin 
91*74fe6c29SRuslan Bukin struct pt_block_cache *pt_bcache_alloc(uint64_t nentries)
92*74fe6c29SRuslan Bukin {
93*74fe6c29SRuslan Bukin 	struct pt_block_cache *bcache;
94*74fe6c29SRuslan Bukin 
95*74fe6c29SRuslan Bukin 	if (!nentries || (UINT32_MAX < nentries))
96*74fe6c29SRuslan Bukin 		return NULL;
97*74fe6c29SRuslan Bukin 
98*74fe6c29SRuslan Bukin 	/* The cache is not really used by tests.  It suffices to allocate only
99*74fe6c29SRuslan Bukin 	 * the cache struct with the single default entry.
100*74fe6c29SRuslan Bukin 	 *
101*74fe6c29SRuslan Bukin 	 * We still set the number of entries to the requested size.
102*74fe6c29SRuslan Bukin 	 */
103*74fe6c29SRuslan Bukin 	bcache = malloc(sizeof(*bcache));
104*74fe6c29SRuslan Bukin 	if (bcache)
105*74fe6c29SRuslan Bukin 		bcache->nentries = (uint32_t) nentries;
106*74fe6c29SRuslan Bukin 
107*74fe6c29SRuslan Bukin 	return bcache;
108*74fe6c29SRuslan Bukin }
109*74fe6c29SRuslan Bukin 
110*74fe6c29SRuslan Bukin void pt_bcache_free(struct pt_block_cache *bcache)
111*74fe6c29SRuslan Bukin {
112*74fe6c29SRuslan Bukin 	free(bcache);
113*74fe6c29SRuslan Bukin }
114*74fe6c29SRuslan Bukin 
115*74fe6c29SRuslan Bukin /* A test fixture providing a temporary file and an initially NULL section. */
116*74fe6c29SRuslan Bukin struct section_fixture {
117*74fe6c29SRuslan Bukin 	/* Threading support. */
118*74fe6c29SRuslan Bukin 	struct ptunit_thrd_fixture thrd;
119*74fe6c29SRuslan Bukin 
120*74fe6c29SRuslan Bukin 	/* A temporary file name. */
121*74fe6c29SRuslan Bukin 	char *name;
122*74fe6c29SRuslan Bukin 
123*74fe6c29SRuslan Bukin 	/* That file opened for writing. */
124*74fe6c29SRuslan Bukin 	FILE *file;
125*74fe6c29SRuslan Bukin 
126*74fe6c29SRuslan Bukin 	/* The section. */
127*74fe6c29SRuslan Bukin 	struct pt_section *section;
128*74fe6c29SRuslan Bukin 
129*74fe6c29SRuslan Bukin 	/* The test fixture initialization and finalization functions. */
130*74fe6c29SRuslan Bukin 	struct ptunit_result (*init)(struct section_fixture *);
131*74fe6c29SRuslan Bukin 	struct ptunit_result (*fini)(struct section_fixture *);
132*74fe6c29SRuslan Bukin };
133*74fe6c29SRuslan Bukin 
134*74fe6c29SRuslan Bukin enum {
135*74fe6c29SRuslan Bukin #if defined(FEATURE_THREADS)
136*74fe6c29SRuslan Bukin 
137*74fe6c29SRuslan Bukin 	num_threads	= 4,
138*74fe6c29SRuslan Bukin 
139*74fe6c29SRuslan Bukin #endif /* defined(FEATURE_THREADS) */
140*74fe6c29SRuslan Bukin 
141*74fe6c29SRuslan Bukin 	num_work	= 0x4000
142*74fe6c29SRuslan Bukin };
143*74fe6c29SRuslan Bukin 
144*74fe6c29SRuslan Bukin static struct ptunit_result sfix_write_aux(struct section_fixture *sfix,
145*74fe6c29SRuslan Bukin 					   const uint8_t *buffer, size_t size)
146*74fe6c29SRuslan Bukin {
147*74fe6c29SRuslan Bukin 	size_t written;
148*74fe6c29SRuslan Bukin 
149*74fe6c29SRuslan Bukin 	written = fwrite(buffer, 1, size, sfix->file);
150*74fe6c29SRuslan Bukin 	ptu_uint_eq(written, size);
151*74fe6c29SRuslan Bukin 
152*74fe6c29SRuslan Bukin 	fflush(sfix->file);
153*74fe6c29SRuslan Bukin 
154*74fe6c29SRuslan Bukin 	return ptu_passed();
155*74fe6c29SRuslan Bukin }
156*74fe6c29SRuslan Bukin 
157*74fe6c29SRuslan Bukin #define sfix_write(sfix, buffer)				\
158*74fe6c29SRuslan Bukin 	ptu_check(sfix_write_aux, sfix, buffer, sizeof(buffer))
159*74fe6c29SRuslan Bukin 
160*74fe6c29SRuslan Bukin static struct ptunit_result create(struct section_fixture *sfix)
161*74fe6c29SRuslan Bukin {
162*74fe6c29SRuslan Bukin 	const char *name;
163*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
164*74fe6c29SRuslan Bukin 	uint64_t offset, size;
165*74fe6c29SRuslan Bukin 
166*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
167*74fe6c29SRuslan Bukin 
168*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
169*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
170*74fe6c29SRuslan Bukin 
171*74fe6c29SRuslan Bukin 	name = pt_section_filename(sfix->section);
172*74fe6c29SRuslan Bukin 	ptu_str_eq(name, sfix->name);
173*74fe6c29SRuslan Bukin 
174*74fe6c29SRuslan Bukin 	offset = pt_section_offset(sfix->section);
175*74fe6c29SRuslan Bukin 	ptu_uint_eq(offset, 0x1ull);
176*74fe6c29SRuslan Bukin 
177*74fe6c29SRuslan Bukin 	size = pt_section_size(sfix->section);
178*74fe6c29SRuslan Bukin 	ptu_uint_eq(size, 0x3ull);
179*74fe6c29SRuslan Bukin 
180*74fe6c29SRuslan Bukin 	return ptu_passed();
181*74fe6c29SRuslan Bukin }
182*74fe6c29SRuslan Bukin 
183*74fe6c29SRuslan Bukin static struct ptunit_result create_bad_offset(struct section_fixture *sfix)
184*74fe6c29SRuslan Bukin {
185*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x10ull, 0x0ull);
186*74fe6c29SRuslan Bukin 	ptu_null(sfix->section);
187*74fe6c29SRuslan Bukin 
188*74fe6c29SRuslan Bukin 	return ptu_passed();
189*74fe6c29SRuslan Bukin }
190*74fe6c29SRuslan Bukin 
191*74fe6c29SRuslan Bukin static struct ptunit_result create_truncated(struct section_fixture *sfix)
192*74fe6c29SRuslan Bukin {
193*74fe6c29SRuslan Bukin 	const char *name;
194*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
195*74fe6c29SRuslan Bukin 	uint64_t offset, size;
196*74fe6c29SRuslan Bukin 
197*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
198*74fe6c29SRuslan Bukin 
199*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, UINT64_MAX);
200*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
201*74fe6c29SRuslan Bukin 
202*74fe6c29SRuslan Bukin 	name = pt_section_filename(sfix->section);
203*74fe6c29SRuslan Bukin 	ptu_str_eq(name, sfix->name);
204*74fe6c29SRuslan Bukin 
205*74fe6c29SRuslan Bukin 	offset = pt_section_offset(sfix->section);
206*74fe6c29SRuslan Bukin 	ptu_uint_eq(offset, 0x1ull);
207*74fe6c29SRuslan Bukin 
208*74fe6c29SRuslan Bukin 	size = pt_section_size(sfix->section);
209*74fe6c29SRuslan Bukin 	ptu_uint_eq(size, sizeof(bytes) - 1);
210*74fe6c29SRuslan Bukin 
211*74fe6c29SRuslan Bukin 	return ptu_passed();
212*74fe6c29SRuslan Bukin }
213*74fe6c29SRuslan Bukin 
214*74fe6c29SRuslan Bukin static struct ptunit_result create_empty(struct section_fixture *sfix)
215*74fe6c29SRuslan Bukin {
216*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x0ull, 0x10ull);
217*74fe6c29SRuslan Bukin 	ptu_null(sfix->section);
218*74fe6c29SRuslan Bukin 
219*74fe6c29SRuslan Bukin 	return ptu_passed();
220*74fe6c29SRuslan Bukin }
221*74fe6c29SRuslan Bukin 
222*74fe6c29SRuslan Bukin static struct ptunit_result filename_null(void)
223*74fe6c29SRuslan Bukin {
224*74fe6c29SRuslan Bukin 	const char *name;
225*74fe6c29SRuslan Bukin 
226*74fe6c29SRuslan Bukin 	name = pt_section_filename(NULL);
227*74fe6c29SRuslan Bukin 	ptu_null(name);
228*74fe6c29SRuslan Bukin 
229*74fe6c29SRuslan Bukin 	return ptu_passed();
230*74fe6c29SRuslan Bukin }
231*74fe6c29SRuslan Bukin 
232*74fe6c29SRuslan Bukin static struct ptunit_result size_null(void)
233*74fe6c29SRuslan Bukin {
234*74fe6c29SRuslan Bukin 	uint64_t size;
235*74fe6c29SRuslan Bukin 
236*74fe6c29SRuslan Bukin 	size = pt_section_size(NULL);
237*74fe6c29SRuslan Bukin 	ptu_uint_eq(size, 0ull);
238*74fe6c29SRuslan Bukin 
239*74fe6c29SRuslan Bukin 	return ptu_passed();
240*74fe6c29SRuslan Bukin }
241*74fe6c29SRuslan Bukin 
242*74fe6c29SRuslan Bukin static struct ptunit_result memsize_null(struct section_fixture *sfix)
243*74fe6c29SRuslan Bukin {
244*74fe6c29SRuslan Bukin 	uint64_t size;
245*74fe6c29SRuslan Bukin 	int errcode;
246*74fe6c29SRuslan Bukin 
247*74fe6c29SRuslan Bukin 	errcode = pt_section_memsize(NULL, &size);
248*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
249*74fe6c29SRuslan Bukin 
250*74fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, NULL);
251*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
252*74fe6c29SRuslan Bukin 
253*74fe6c29SRuslan Bukin 	errcode = pt_section_memsize(NULL, NULL);
254*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
255*74fe6c29SRuslan Bukin 
256*74fe6c29SRuslan Bukin 	return ptu_passed();
257*74fe6c29SRuslan Bukin }
258*74fe6c29SRuslan Bukin 
259*74fe6c29SRuslan Bukin static struct ptunit_result offset_null(void)
260*74fe6c29SRuslan Bukin {
261*74fe6c29SRuslan Bukin 	uint64_t offset;
262*74fe6c29SRuslan Bukin 
263*74fe6c29SRuslan Bukin 	offset = pt_section_offset(NULL);
264*74fe6c29SRuslan Bukin 	ptu_uint_eq(offset, 0ull);
265*74fe6c29SRuslan Bukin 
266*74fe6c29SRuslan Bukin 	return ptu_passed();
267*74fe6c29SRuslan Bukin }
268*74fe6c29SRuslan Bukin 
269*74fe6c29SRuslan Bukin static struct ptunit_result get_null(void)
270*74fe6c29SRuslan Bukin {
271*74fe6c29SRuslan Bukin 	int errcode;
272*74fe6c29SRuslan Bukin 
273*74fe6c29SRuslan Bukin 	errcode = pt_section_get(NULL);
274*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
275*74fe6c29SRuslan Bukin 
276*74fe6c29SRuslan Bukin 	return ptu_passed();
277*74fe6c29SRuslan Bukin }
278*74fe6c29SRuslan Bukin 
279*74fe6c29SRuslan Bukin static struct ptunit_result put_null(void)
280*74fe6c29SRuslan Bukin {
281*74fe6c29SRuslan Bukin 	int errcode;
282*74fe6c29SRuslan Bukin 
283*74fe6c29SRuslan Bukin 	errcode = pt_section_put(NULL);
284*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
285*74fe6c29SRuslan Bukin 
286*74fe6c29SRuslan Bukin 	return ptu_passed();
287*74fe6c29SRuslan Bukin }
288*74fe6c29SRuslan Bukin 
289*74fe6c29SRuslan Bukin static struct ptunit_result attach_null(void)
290*74fe6c29SRuslan Bukin {
291*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
292*74fe6c29SRuslan Bukin 	struct pt_section section;
293*74fe6c29SRuslan Bukin 	int errcode;
294*74fe6c29SRuslan Bukin 
295*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(NULL, &iscache);
296*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
297*74fe6c29SRuslan Bukin 
298*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(&section, NULL);
299*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
300*74fe6c29SRuslan Bukin 
301*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(NULL, NULL);
302*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
303*74fe6c29SRuslan Bukin 
304*74fe6c29SRuslan Bukin 	return ptu_passed();
305*74fe6c29SRuslan Bukin }
306*74fe6c29SRuslan Bukin 
307*74fe6c29SRuslan Bukin static struct ptunit_result detach_null(void)
308*74fe6c29SRuslan Bukin {
309*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
310*74fe6c29SRuslan Bukin 	struct pt_section section;
311*74fe6c29SRuslan Bukin 	int errcode;
312*74fe6c29SRuslan Bukin 
313*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(NULL, &iscache);
314*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
315*74fe6c29SRuslan Bukin 
316*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(&section, NULL);
317*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
318*74fe6c29SRuslan Bukin 
319*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(NULL, NULL);
320*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
321*74fe6c29SRuslan Bukin 
322*74fe6c29SRuslan Bukin 	return ptu_passed();
323*74fe6c29SRuslan Bukin }
324*74fe6c29SRuslan Bukin 
325*74fe6c29SRuslan Bukin static struct ptunit_result map_null(void)
326*74fe6c29SRuslan Bukin {
327*74fe6c29SRuslan Bukin 	int errcode;
328*74fe6c29SRuslan Bukin 
329*74fe6c29SRuslan Bukin 	errcode = pt_section_map(NULL);
330*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
331*74fe6c29SRuslan Bukin 
332*74fe6c29SRuslan Bukin 	return ptu_passed();
333*74fe6c29SRuslan Bukin }
334*74fe6c29SRuslan Bukin 
335*74fe6c29SRuslan Bukin static struct ptunit_result unmap_null(void)
336*74fe6c29SRuslan Bukin {
337*74fe6c29SRuslan Bukin 	int errcode;
338*74fe6c29SRuslan Bukin 
339*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(NULL);
340*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
341*74fe6c29SRuslan Bukin 
342*74fe6c29SRuslan Bukin 	return ptu_passed();
343*74fe6c29SRuslan Bukin }
344*74fe6c29SRuslan Bukin 
345*74fe6c29SRuslan Bukin static struct ptunit_result cache_null(void)
346*74fe6c29SRuslan Bukin {
347*74fe6c29SRuslan Bukin 	struct pt_block_cache *bcache;
348*74fe6c29SRuslan Bukin 
349*74fe6c29SRuslan Bukin 	bcache = pt_section_bcache(NULL);
350*74fe6c29SRuslan Bukin 	ptu_null(bcache);
351*74fe6c29SRuslan Bukin 
352*74fe6c29SRuslan Bukin 	return ptu_passed();
353*74fe6c29SRuslan Bukin }
354*74fe6c29SRuslan Bukin 
355*74fe6c29SRuslan Bukin static struct ptunit_result get_overflow(struct section_fixture *sfix)
356*74fe6c29SRuslan Bukin {
357*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
358*74fe6c29SRuslan Bukin 	int errcode;
359*74fe6c29SRuslan Bukin 
360*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
361*74fe6c29SRuslan Bukin 
362*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
363*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
364*74fe6c29SRuslan Bukin 
365*74fe6c29SRuslan Bukin 	sfix->section->ucount = UINT16_MAX;
366*74fe6c29SRuslan Bukin 
367*74fe6c29SRuslan Bukin 	errcode = pt_section_get(sfix->section);
368*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_overflow);
369*74fe6c29SRuslan Bukin 
370*74fe6c29SRuslan Bukin 	sfix->section->ucount = 1;
371*74fe6c29SRuslan Bukin 
372*74fe6c29SRuslan Bukin 	return ptu_passed();
373*74fe6c29SRuslan Bukin }
374*74fe6c29SRuslan Bukin 
375*74fe6c29SRuslan Bukin static struct ptunit_result attach_overflow(struct section_fixture *sfix)
376*74fe6c29SRuslan Bukin {
377*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
378*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
379*74fe6c29SRuslan Bukin 	int errcode;
380*74fe6c29SRuslan Bukin 
381*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
382*74fe6c29SRuslan Bukin 
383*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
384*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
385*74fe6c29SRuslan Bukin 
386*74fe6c29SRuslan Bukin 	sfix->section->acount = UINT16_MAX;
387*74fe6c29SRuslan Bukin 
388*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
389*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_overflow);
390*74fe6c29SRuslan Bukin 
391*74fe6c29SRuslan Bukin 	sfix->section->acount = 0;
392*74fe6c29SRuslan Bukin 
393*74fe6c29SRuslan Bukin 	return ptu_passed();
394*74fe6c29SRuslan Bukin }
395*74fe6c29SRuslan Bukin 
396*74fe6c29SRuslan Bukin static struct ptunit_result attach_bad_ucount(struct section_fixture *sfix)
397*74fe6c29SRuslan Bukin {
398*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
399*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
400*74fe6c29SRuslan Bukin 	int errcode;
401*74fe6c29SRuslan Bukin 
402*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
403*74fe6c29SRuslan Bukin 
404*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
405*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
406*74fe6c29SRuslan Bukin 
407*74fe6c29SRuslan Bukin 	sfix->section->acount = 2;
408*74fe6c29SRuslan Bukin 
409*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
410*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
411*74fe6c29SRuslan Bukin 
412*74fe6c29SRuslan Bukin 	sfix->section->acount = 0;
413*74fe6c29SRuslan Bukin 
414*74fe6c29SRuslan Bukin 	return ptu_passed();
415*74fe6c29SRuslan Bukin }
416*74fe6c29SRuslan Bukin 
417*74fe6c29SRuslan Bukin static struct ptunit_result map_change(struct section_fixture *sfix)
418*74fe6c29SRuslan Bukin {
419*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
420*74fe6c29SRuslan Bukin 	int errcode;
421*74fe6c29SRuslan Bukin 
422*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
423*74fe6c29SRuslan Bukin 
424*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
425*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
426*74fe6c29SRuslan Bukin 
427*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
428*74fe6c29SRuslan Bukin 
429*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
430*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_bad_image);
431*74fe6c29SRuslan Bukin 
432*74fe6c29SRuslan Bukin 	return ptu_passed();
433*74fe6c29SRuslan Bukin }
434*74fe6c29SRuslan Bukin 
435*74fe6c29SRuslan Bukin static struct ptunit_result map_put(struct section_fixture *sfix)
436*74fe6c29SRuslan Bukin {
437*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
438*74fe6c29SRuslan Bukin 	int errcode;
439*74fe6c29SRuslan Bukin 
440*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
441*74fe6c29SRuslan Bukin 
442*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
443*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
444*74fe6c29SRuslan Bukin 
445*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
446*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
447*74fe6c29SRuslan Bukin 
448*74fe6c29SRuslan Bukin 	errcode = pt_section_put(sfix->section);
449*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
450*74fe6c29SRuslan Bukin 
451*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
452*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
453*74fe6c29SRuslan Bukin 
454*74fe6c29SRuslan Bukin 	return ptu_passed();
455*74fe6c29SRuslan Bukin }
456*74fe6c29SRuslan Bukin 
457*74fe6c29SRuslan Bukin static struct ptunit_result unmap_nomap(struct section_fixture *sfix)
458*74fe6c29SRuslan Bukin {
459*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
460*74fe6c29SRuslan Bukin 	int errcode;
461*74fe6c29SRuslan Bukin 
462*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
463*74fe6c29SRuslan Bukin 
464*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
465*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
466*74fe6c29SRuslan Bukin 
467*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
468*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_nomap);
469*74fe6c29SRuslan Bukin 
470*74fe6c29SRuslan Bukin 	return ptu_passed();
471*74fe6c29SRuslan Bukin }
472*74fe6c29SRuslan Bukin 
473*74fe6c29SRuslan Bukin static struct ptunit_result map_overflow(struct section_fixture *sfix)
474*74fe6c29SRuslan Bukin {
475*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
476*74fe6c29SRuslan Bukin 	int errcode;
477*74fe6c29SRuslan Bukin 
478*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
479*74fe6c29SRuslan Bukin 
480*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
481*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
482*74fe6c29SRuslan Bukin 
483*74fe6c29SRuslan Bukin 	sfix->section->mcount = UINT16_MAX;
484*74fe6c29SRuslan Bukin 
485*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
486*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_overflow);
487*74fe6c29SRuslan Bukin 
488*74fe6c29SRuslan Bukin 	sfix->section->mcount = 0;
489*74fe6c29SRuslan Bukin 
490*74fe6c29SRuslan Bukin 	return ptu_passed();
491*74fe6c29SRuslan Bukin }
492*74fe6c29SRuslan Bukin 
493*74fe6c29SRuslan Bukin static struct ptunit_result get_put(struct section_fixture *sfix)
494*74fe6c29SRuslan Bukin {
495*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
496*74fe6c29SRuslan Bukin 	int errcode;
497*74fe6c29SRuslan Bukin 
498*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
499*74fe6c29SRuslan Bukin 
500*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
501*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
502*74fe6c29SRuslan Bukin 
503*74fe6c29SRuslan Bukin 	errcode = pt_section_get(sfix->section);
504*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
505*74fe6c29SRuslan Bukin 
506*74fe6c29SRuslan Bukin 	errcode = pt_section_get(sfix->section);
507*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
508*74fe6c29SRuslan Bukin 
509*74fe6c29SRuslan Bukin 	errcode = pt_section_put(sfix->section);
510*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
511*74fe6c29SRuslan Bukin 
512*74fe6c29SRuslan Bukin 	errcode = pt_section_put(sfix->section);
513*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
514*74fe6c29SRuslan Bukin 
515*74fe6c29SRuslan Bukin 	return ptu_passed();
516*74fe6c29SRuslan Bukin }
517*74fe6c29SRuslan Bukin 
518*74fe6c29SRuslan Bukin static struct ptunit_result attach_detach(struct section_fixture *sfix)
519*74fe6c29SRuslan Bukin {
520*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
521*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
522*74fe6c29SRuslan Bukin 	int errcode;
523*74fe6c29SRuslan Bukin 
524*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
525*74fe6c29SRuslan Bukin 
526*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
527*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
528*74fe6c29SRuslan Bukin 
529*74fe6c29SRuslan Bukin 	sfix->section->ucount += 2;
530*74fe6c29SRuslan Bukin 
531*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
532*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
533*74fe6c29SRuslan Bukin 
534*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
535*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
536*74fe6c29SRuslan Bukin 
537*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
538*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
539*74fe6c29SRuslan Bukin 
540*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
541*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
542*74fe6c29SRuslan Bukin 
543*74fe6c29SRuslan Bukin 	sfix->section->ucount -= 2;
544*74fe6c29SRuslan Bukin 
545*74fe6c29SRuslan Bukin 	return ptu_passed();
546*74fe6c29SRuslan Bukin }
547*74fe6c29SRuslan Bukin 
548*74fe6c29SRuslan Bukin static struct ptunit_result attach_bad_iscache(struct section_fixture *sfix)
549*74fe6c29SRuslan Bukin {
550*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache, bad;
551*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
552*74fe6c29SRuslan Bukin 	int errcode;
553*74fe6c29SRuslan Bukin 
554*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
555*74fe6c29SRuslan Bukin 
556*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
557*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
558*74fe6c29SRuslan Bukin 
559*74fe6c29SRuslan Bukin 	sfix->section->ucount += 2;
560*74fe6c29SRuslan Bukin 
561*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
562*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
563*74fe6c29SRuslan Bukin 
564*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &bad);
565*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
566*74fe6c29SRuslan Bukin 
567*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
568*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
569*74fe6c29SRuslan Bukin 
570*74fe6c29SRuslan Bukin 	sfix->section->ucount -= 2;
571*74fe6c29SRuslan Bukin 
572*74fe6c29SRuslan Bukin 	return ptu_passed();
573*74fe6c29SRuslan Bukin }
574*74fe6c29SRuslan Bukin 
575*74fe6c29SRuslan Bukin static struct ptunit_result detach_bad_iscache(struct section_fixture *sfix)
576*74fe6c29SRuslan Bukin {
577*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache, bad;
578*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
579*74fe6c29SRuslan Bukin 	int errcode;
580*74fe6c29SRuslan Bukin 
581*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
582*74fe6c29SRuslan Bukin 
583*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
584*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
585*74fe6c29SRuslan Bukin 
586*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
587*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
588*74fe6c29SRuslan Bukin 
589*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &bad);
590*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
591*74fe6c29SRuslan Bukin 
592*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
593*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
594*74fe6c29SRuslan Bukin 
595*74fe6c29SRuslan Bukin 	return ptu_passed();
596*74fe6c29SRuslan Bukin }
597*74fe6c29SRuslan Bukin 
598*74fe6c29SRuslan Bukin static struct ptunit_result map_unmap(struct section_fixture *sfix)
599*74fe6c29SRuslan Bukin {
600*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
601*74fe6c29SRuslan Bukin 	int errcode;
602*74fe6c29SRuslan Bukin 
603*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
604*74fe6c29SRuslan Bukin 
605*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
606*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
607*74fe6c29SRuslan Bukin 
608*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
609*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
610*74fe6c29SRuslan Bukin 
611*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
612*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
613*74fe6c29SRuslan Bukin 
614*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
615*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
616*74fe6c29SRuslan Bukin 
617*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
618*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
619*74fe6c29SRuslan Bukin 
620*74fe6c29SRuslan Bukin 	return ptu_passed();
621*74fe6c29SRuslan Bukin }
622*74fe6c29SRuslan Bukin 
623*74fe6c29SRuslan Bukin static struct ptunit_result attach_map(struct section_fixture *sfix)
624*74fe6c29SRuslan Bukin {
625*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
626*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
627*74fe6c29SRuslan Bukin 	int errcode;
628*74fe6c29SRuslan Bukin 
629*74fe6c29SRuslan Bukin 	iscache.map = 0;
630*74fe6c29SRuslan Bukin 
631*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
632*74fe6c29SRuslan Bukin 
633*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
634*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
635*74fe6c29SRuslan Bukin 
636*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
637*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
638*74fe6c29SRuslan Bukin 
639*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
640*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
641*74fe6c29SRuslan Bukin 
642*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
643*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
644*74fe6c29SRuslan Bukin 
645*74fe6c29SRuslan Bukin 	ptu_uint_eq(sfix->section->mcount, 2);
646*74fe6c29SRuslan Bukin 
647*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
648*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
649*74fe6c29SRuslan Bukin 
650*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
651*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
652*74fe6c29SRuslan Bukin 
653*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
654*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
655*74fe6c29SRuslan Bukin 
656*74fe6c29SRuslan Bukin 	return ptu_passed();
657*74fe6c29SRuslan Bukin }
658*74fe6c29SRuslan Bukin 
659*74fe6c29SRuslan Bukin static struct ptunit_result attach_bad_map(struct section_fixture *sfix)
660*74fe6c29SRuslan Bukin {
661*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
662*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
663*74fe6c29SRuslan Bukin 	int errcode;
664*74fe6c29SRuslan Bukin 
665*74fe6c29SRuslan Bukin 	iscache.map = -pte_eos;
666*74fe6c29SRuslan Bukin 
667*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
668*74fe6c29SRuslan Bukin 
669*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
670*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
671*74fe6c29SRuslan Bukin 
672*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
673*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
674*74fe6c29SRuslan Bukin 
675*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
676*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
677*74fe6c29SRuslan Bukin 
678*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
679*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
680*74fe6c29SRuslan Bukin 
681*74fe6c29SRuslan Bukin 	return ptu_passed();
682*74fe6c29SRuslan Bukin }
683*74fe6c29SRuslan Bukin 
684*74fe6c29SRuslan Bukin static struct ptunit_result attach_map_overflow(struct section_fixture *sfix)
685*74fe6c29SRuslan Bukin {
686*74fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
687*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
688*74fe6c29SRuslan Bukin 	int errcode;
689*74fe6c29SRuslan Bukin 
690*74fe6c29SRuslan Bukin 	iscache.map = 1;
691*74fe6c29SRuslan Bukin 
692*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
693*74fe6c29SRuslan Bukin 
694*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
695*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
696*74fe6c29SRuslan Bukin 
697*74fe6c29SRuslan Bukin 	errcode = pt_section_attach(sfix->section, &iscache);
698*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
699*74fe6c29SRuslan Bukin 
700*74fe6c29SRuslan Bukin 	sfix->section->mcount = UINT16_MAX - 1;
701*74fe6c29SRuslan Bukin 
702*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
703*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_overflow);
704*74fe6c29SRuslan Bukin 
705*74fe6c29SRuslan Bukin 	errcode = pt_section_detach(sfix->section, &iscache);
706*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
707*74fe6c29SRuslan Bukin 
708*74fe6c29SRuslan Bukin 	return ptu_passed();
709*74fe6c29SRuslan Bukin }
710*74fe6c29SRuslan Bukin 
711*74fe6c29SRuslan Bukin static struct ptunit_result read(struct section_fixture *sfix)
712*74fe6c29SRuslan Bukin {
713*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
714*74fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
715*74fe6c29SRuslan Bukin 	int status;
716*74fe6c29SRuslan Bukin 
717*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
718*74fe6c29SRuslan Bukin 
719*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
720*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
721*74fe6c29SRuslan Bukin 
722*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
723*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
724*74fe6c29SRuslan Bukin 
725*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
726*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
727*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[1]);
728*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], bytes[2]);
729*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
730*74fe6c29SRuslan Bukin 
731*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
732*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
733*74fe6c29SRuslan Bukin 
734*74fe6c29SRuslan Bukin 	return ptu_passed();
735*74fe6c29SRuslan Bukin }
736*74fe6c29SRuslan Bukin 
737*74fe6c29SRuslan Bukin static struct ptunit_result read_null(struct section_fixture *sfix)
738*74fe6c29SRuslan Bukin {
739*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
740*74fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc };
741*74fe6c29SRuslan Bukin 	int status;
742*74fe6c29SRuslan Bukin 
743*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
744*74fe6c29SRuslan Bukin 
745*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
746*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
747*74fe6c29SRuslan Bukin 
748*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
749*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
750*74fe6c29SRuslan Bukin 
751*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, NULL, 1, 0x0ull);
752*74fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
753*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
754*74fe6c29SRuslan Bukin 
755*74fe6c29SRuslan Bukin 	status = pt_section_read(NULL, buffer, 1, 0x0ull);
756*74fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
757*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
758*74fe6c29SRuslan Bukin 
759*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
760*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
761*74fe6c29SRuslan Bukin 
762*74fe6c29SRuslan Bukin 	return ptu_passed();
763*74fe6c29SRuslan Bukin }
764*74fe6c29SRuslan Bukin 
765*74fe6c29SRuslan Bukin static struct ptunit_result read_offset(struct section_fixture *sfix)
766*74fe6c29SRuslan Bukin {
767*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
768*74fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
769*74fe6c29SRuslan Bukin 	int status;
770*74fe6c29SRuslan Bukin 
771*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
772*74fe6c29SRuslan Bukin 
773*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
774*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
775*74fe6c29SRuslan Bukin 
776*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
777*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
778*74fe6c29SRuslan Bukin 
779*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x1ull);
780*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
781*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[2]);
782*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], bytes[3]);
783*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
784*74fe6c29SRuslan Bukin 
785*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
786*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
787*74fe6c29SRuslan Bukin 
788*74fe6c29SRuslan Bukin 	return ptu_passed();
789*74fe6c29SRuslan Bukin }
790*74fe6c29SRuslan Bukin 
791*74fe6c29SRuslan Bukin static struct ptunit_result read_truncated(struct section_fixture *sfix)
792*74fe6c29SRuslan Bukin {
793*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc, 0xcc };
794*74fe6c29SRuslan Bukin 	int status;
795*74fe6c29SRuslan Bukin 
796*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
797*74fe6c29SRuslan Bukin 
798*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
799*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
800*74fe6c29SRuslan Bukin 
801*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
802*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
803*74fe6c29SRuslan Bukin 
804*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x2ull);
805*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
806*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[3]);
807*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
808*74fe6c29SRuslan Bukin 
809*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
810*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
811*74fe6c29SRuslan Bukin 
812*74fe6c29SRuslan Bukin 	return ptu_passed();
813*74fe6c29SRuslan Bukin }
814*74fe6c29SRuslan Bukin 
815*74fe6c29SRuslan Bukin static struct ptunit_result read_from_truncated(struct section_fixture *sfix)
816*74fe6c29SRuslan Bukin {
817*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc, 0xcc };
818*74fe6c29SRuslan Bukin 	int status;
819*74fe6c29SRuslan Bukin 
820*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
821*74fe6c29SRuslan Bukin 
822*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x2ull, 0x10ull);
823*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
824*74fe6c29SRuslan Bukin 
825*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
826*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
827*74fe6c29SRuslan Bukin 
828*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x1ull);
829*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
830*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[3]);
831*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
832*74fe6c29SRuslan Bukin 
833*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
834*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
835*74fe6c29SRuslan Bukin 
836*74fe6c29SRuslan Bukin 	return ptu_passed();
837*74fe6c29SRuslan Bukin }
838*74fe6c29SRuslan Bukin 
839*74fe6c29SRuslan Bukin static struct ptunit_result read_nomem(struct section_fixture *sfix)
840*74fe6c29SRuslan Bukin {
841*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
842*74fe6c29SRuslan Bukin 	int status;
843*74fe6c29SRuslan Bukin 
844*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
845*74fe6c29SRuslan Bukin 
846*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
847*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
848*74fe6c29SRuslan Bukin 
849*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
850*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
851*74fe6c29SRuslan Bukin 
852*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 1, 0x3ull);
853*74fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
854*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
855*74fe6c29SRuslan Bukin 
856*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
857*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
858*74fe6c29SRuslan Bukin 
859*74fe6c29SRuslan Bukin 	return ptu_passed();
860*74fe6c29SRuslan Bukin }
861*74fe6c29SRuslan Bukin 
862*74fe6c29SRuslan Bukin static struct ptunit_result read_overflow(struct section_fixture *sfix)
863*74fe6c29SRuslan Bukin {
864*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
865*74fe6c29SRuslan Bukin 	int status;
866*74fe6c29SRuslan Bukin 
867*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
868*74fe6c29SRuslan Bukin 
869*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
870*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
871*74fe6c29SRuslan Bukin 
872*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
873*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
874*74fe6c29SRuslan Bukin 
875*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 1,
876*74fe6c29SRuslan Bukin 				 0xffffffffffff0000ull);
877*74fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
878*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
879*74fe6c29SRuslan Bukin 
880*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
881*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
882*74fe6c29SRuslan Bukin 
883*74fe6c29SRuslan Bukin 	return ptu_passed();
884*74fe6c29SRuslan Bukin }
885*74fe6c29SRuslan Bukin 
886*74fe6c29SRuslan Bukin static struct ptunit_result read_overflow_32bit(struct section_fixture *sfix)
887*74fe6c29SRuslan Bukin {
888*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
889*74fe6c29SRuslan Bukin 	int status;
890*74fe6c29SRuslan Bukin 
891*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
892*74fe6c29SRuslan Bukin 
893*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
894*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
895*74fe6c29SRuslan Bukin 
896*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
897*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
898*74fe6c29SRuslan Bukin 
899*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 1,
900*74fe6c29SRuslan Bukin 				 0xff00000000ull);
901*74fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
902*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
903*74fe6c29SRuslan Bukin 
904*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
905*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
906*74fe6c29SRuslan Bukin 
907*74fe6c29SRuslan Bukin 	return ptu_passed();
908*74fe6c29SRuslan Bukin }
909*74fe6c29SRuslan Bukin 
910*74fe6c29SRuslan Bukin static struct ptunit_result read_nomap(struct section_fixture *sfix)
911*74fe6c29SRuslan Bukin {
912*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
913*74fe6c29SRuslan Bukin 	int status;
914*74fe6c29SRuslan Bukin 
915*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
916*74fe6c29SRuslan Bukin 
917*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
918*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
919*74fe6c29SRuslan Bukin 
920*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 1, 0x0ull);
921*74fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
922*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
923*74fe6c29SRuslan Bukin 
924*74fe6c29SRuslan Bukin 	return ptu_passed();
925*74fe6c29SRuslan Bukin }
926*74fe6c29SRuslan Bukin 
927*74fe6c29SRuslan Bukin static struct ptunit_result read_unmap_map(struct section_fixture *sfix)
928*74fe6c29SRuslan Bukin {
929*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
930*74fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
931*74fe6c29SRuslan Bukin 	int status;
932*74fe6c29SRuslan Bukin 
933*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
934*74fe6c29SRuslan Bukin 
935*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
936*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
937*74fe6c29SRuslan Bukin 
938*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
939*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
940*74fe6c29SRuslan Bukin 
941*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
942*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
943*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[1]);
944*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], bytes[2]);
945*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
946*74fe6c29SRuslan Bukin 
947*74fe6c29SRuslan Bukin 	memset(buffer, 0xcc, sizeof(buffer));
948*74fe6c29SRuslan Bukin 
949*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
950*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
951*74fe6c29SRuslan Bukin 
952*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
953*74fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
954*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
955*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
956*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
957*74fe6c29SRuslan Bukin 
958*74fe6c29SRuslan Bukin 	status = pt_section_map(sfix->section);
959*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
960*74fe6c29SRuslan Bukin 
961*74fe6c29SRuslan Bukin 	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
962*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
963*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], bytes[1]);
964*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], bytes[2]);
965*74fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
966*74fe6c29SRuslan Bukin 
967*74fe6c29SRuslan Bukin 	status = pt_section_unmap(sfix->section);
968*74fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
969*74fe6c29SRuslan Bukin 
970*74fe6c29SRuslan Bukin 	return ptu_passed();
971*74fe6c29SRuslan Bukin }
972*74fe6c29SRuslan Bukin 
973*74fe6c29SRuslan Bukin static int worker_read(void *arg)
974*74fe6c29SRuslan Bukin {
975*74fe6c29SRuslan Bukin 	struct section_fixture *sfix;
976*74fe6c29SRuslan Bukin 	int it, errcode;
977*74fe6c29SRuslan Bukin 
978*74fe6c29SRuslan Bukin 	sfix = arg;
979*74fe6c29SRuslan Bukin 	if (!sfix)
980*74fe6c29SRuslan Bukin 		return -pte_internal;
981*74fe6c29SRuslan Bukin 
982*74fe6c29SRuslan Bukin 	for (it = 0; it < num_work; ++it) {
983*74fe6c29SRuslan Bukin 		uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
984*74fe6c29SRuslan Bukin 		int read;
985*74fe6c29SRuslan Bukin 
986*74fe6c29SRuslan Bukin 		errcode = pt_section_get(sfix->section);
987*74fe6c29SRuslan Bukin 		if (errcode < 0)
988*74fe6c29SRuslan Bukin 			return errcode;
989*74fe6c29SRuslan Bukin 
990*74fe6c29SRuslan Bukin 		errcode = pt_section_map(sfix->section);
991*74fe6c29SRuslan Bukin 		if (errcode < 0)
992*74fe6c29SRuslan Bukin 			goto out_put;
993*74fe6c29SRuslan Bukin 
994*74fe6c29SRuslan Bukin 		read = pt_section_read(sfix->section, buffer, 2, 0x0ull);
995*74fe6c29SRuslan Bukin 		if (read < 0)
996*74fe6c29SRuslan Bukin 			goto out_unmap;
997*74fe6c29SRuslan Bukin 
998*74fe6c29SRuslan Bukin 		errcode = -pte_invalid;
999*74fe6c29SRuslan Bukin 		if ((read != 2) || (buffer[0] != 0x2) || (buffer[1] != 0x4))
1000*74fe6c29SRuslan Bukin 			goto out_unmap;
1001*74fe6c29SRuslan Bukin 
1002*74fe6c29SRuslan Bukin 		errcode = pt_section_unmap(sfix->section);
1003*74fe6c29SRuslan Bukin 		if (errcode < 0)
1004*74fe6c29SRuslan Bukin 			goto out_put;
1005*74fe6c29SRuslan Bukin 
1006*74fe6c29SRuslan Bukin 		errcode = pt_section_put(sfix->section);
1007*74fe6c29SRuslan Bukin 		if (errcode < 0)
1008*74fe6c29SRuslan Bukin 			return errcode;
1009*74fe6c29SRuslan Bukin 	}
1010*74fe6c29SRuslan Bukin 
1011*74fe6c29SRuslan Bukin 	return 0;
1012*74fe6c29SRuslan Bukin 
1013*74fe6c29SRuslan Bukin out_unmap:
1014*74fe6c29SRuslan Bukin 	(void) pt_section_unmap(sfix->section);
1015*74fe6c29SRuslan Bukin 
1016*74fe6c29SRuslan Bukin out_put:
1017*74fe6c29SRuslan Bukin 	(void) pt_section_put(sfix->section);
1018*74fe6c29SRuslan Bukin 	return errcode;
1019*74fe6c29SRuslan Bukin }
1020*74fe6c29SRuslan Bukin 
1021*74fe6c29SRuslan Bukin static int worker_bcache(void *arg)
1022*74fe6c29SRuslan Bukin {
1023*74fe6c29SRuslan Bukin 	struct section_fixture *sfix;
1024*74fe6c29SRuslan Bukin 	int it, errcode;
1025*74fe6c29SRuslan Bukin 
1026*74fe6c29SRuslan Bukin 	sfix = arg;
1027*74fe6c29SRuslan Bukin 	if (!sfix)
1028*74fe6c29SRuslan Bukin 		return -pte_internal;
1029*74fe6c29SRuslan Bukin 
1030*74fe6c29SRuslan Bukin 	errcode = pt_section_get(sfix->section);
1031*74fe6c29SRuslan Bukin 	if (errcode < 0)
1032*74fe6c29SRuslan Bukin 		return errcode;
1033*74fe6c29SRuslan Bukin 
1034*74fe6c29SRuslan Bukin 	for (it = 0; it < num_work; ++it) {
1035*74fe6c29SRuslan Bukin 		struct pt_block_cache *bcache;
1036*74fe6c29SRuslan Bukin 
1037*74fe6c29SRuslan Bukin 		errcode = pt_section_map(sfix->section);
1038*74fe6c29SRuslan Bukin 		if (errcode < 0)
1039*74fe6c29SRuslan Bukin 			goto out_put;
1040*74fe6c29SRuslan Bukin 
1041*74fe6c29SRuslan Bukin 		errcode = pt_section_request_bcache(sfix->section);
1042*74fe6c29SRuslan Bukin 		if (errcode < 0)
1043*74fe6c29SRuslan Bukin 			goto out_unmap;
1044*74fe6c29SRuslan Bukin 
1045*74fe6c29SRuslan Bukin 		bcache = pt_section_bcache(sfix->section);
1046*74fe6c29SRuslan Bukin 		if (!bcache) {
1047*74fe6c29SRuslan Bukin 			errcode = -pte_nomem;
1048*74fe6c29SRuslan Bukin 			goto out_unmap;
1049*74fe6c29SRuslan Bukin 		}
1050*74fe6c29SRuslan Bukin 
1051*74fe6c29SRuslan Bukin 		errcode = pt_section_unmap(sfix->section);
1052*74fe6c29SRuslan Bukin 		if (errcode < 0)
1053*74fe6c29SRuslan Bukin 			goto out_put;
1054*74fe6c29SRuslan Bukin 	}
1055*74fe6c29SRuslan Bukin 
1056*74fe6c29SRuslan Bukin 	return pt_section_put(sfix->section);
1057*74fe6c29SRuslan Bukin 
1058*74fe6c29SRuslan Bukin out_unmap:
1059*74fe6c29SRuslan Bukin 	(void) pt_section_unmap(sfix->section);
1060*74fe6c29SRuslan Bukin 
1061*74fe6c29SRuslan Bukin out_put:
1062*74fe6c29SRuslan Bukin 	(void) pt_section_put(sfix->section);
1063*74fe6c29SRuslan Bukin 	return errcode;
1064*74fe6c29SRuslan Bukin }
1065*74fe6c29SRuslan Bukin 
1066*74fe6c29SRuslan Bukin static struct ptunit_result stress(struct section_fixture *sfix,
1067*74fe6c29SRuslan Bukin 				   int (*worker)(void *))
1068*74fe6c29SRuslan Bukin {
1069*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1070*74fe6c29SRuslan Bukin 	int errcode;
1071*74fe6c29SRuslan Bukin 
1072*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1073*74fe6c29SRuslan Bukin 
1074*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1075*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1076*74fe6c29SRuslan Bukin 
1077*74fe6c29SRuslan Bukin #if defined(FEATURE_THREADS)
1078*74fe6c29SRuslan Bukin 	{
1079*74fe6c29SRuslan Bukin 		int thrd;
1080*74fe6c29SRuslan Bukin 
1081*74fe6c29SRuslan Bukin 		for (thrd = 0; thrd < num_threads; ++thrd)
1082*74fe6c29SRuslan Bukin 			ptu_test(ptunit_thrd_create, &sfix->thrd, worker, sfix);
1083*74fe6c29SRuslan Bukin 	}
1084*74fe6c29SRuslan Bukin #endif /* defined(FEATURE_THREADS) */
1085*74fe6c29SRuslan Bukin 
1086*74fe6c29SRuslan Bukin 	errcode = worker(sfix);
1087*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1088*74fe6c29SRuslan Bukin 
1089*74fe6c29SRuslan Bukin 	return ptu_passed();
1090*74fe6c29SRuslan Bukin }
1091*74fe6c29SRuslan Bukin 
1092*74fe6c29SRuslan Bukin static struct ptunit_result init_no_bcache(struct section_fixture *sfix)
1093*74fe6c29SRuslan Bukin {
1094*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1095*74fe6c29SRuslan Bukin 	struct pt_block_cache *bcache;
1096*74fe6c29SRuslan Bukin 	int errcode;
1097*74fe6c29SRuslan Bukin 
1098*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1099*74fe6c29SRuslan Bukin 
1100*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1101*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1102*74fe6c29SRuslan Bukin 
1103*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
1104*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1105*74fe6c29SRuslan Bukin 
1106*74fe6c29SRuslan Bukin 	bcache = pt_section_bcache(sfix->section);
1107*74fe6c29SRuslan Bukin 	ptu_null(bcache);
1108*74fe6c29SRuslan Bukin 
1109*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
1110*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1111*74fe6c29SRuslan Bukin 
1112*74fe6c29SRuslan Bukin 	return ptu_passed();
1113*74fe6c29SRuslan Bukin }
1114*74fe6c29SRuslan Bukin 
1115*74fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_free(struct section_fixture *sfix)
1116*74fe6c29SRuslan Bukin {
1117*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1118*74fe6c29SRuslan Bukin 	struct pt_block_cache *bcache;
1119*74fe6c29SRuslan Bukin 	int errcode;
1120*74fe6c29SRuslan Bukin 
1121*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1122*74fe6c29SRuslan Bukin 
1123*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1124*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1125*74fe6c29SRuslan Bukin 
1126*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
1127*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1128*74fe6c29SRuslan Bukin 
1129*74fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
1130*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1131*74fe6c29SRuslan Bukin 
1132*74fe6c29SRuslan Bukin 	bcache = pt_section_bcache(sfix->section);
1133*74fe6c29SRuslan Bukin 	ptu_ptr(bcache);
1134*74fe6c29SRuslan Bukin 	ptu_uint_eq(bcache->nentries, sfix->section->size);
1135*74fe6c29SRuslan Bukin 
1136*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
1137*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1138*74fe6c29SRuslan Bukin 
1139*74fe6c29SRuslan Bukin 	bcache = pt_section_bcache(sfix->section);
1140*74fe6c29SRuslan Bukin 	ptu_null(bcache);
1141*74fe6c29SRuslan Bukin 
1142*74fe6c29SRuslan Bukin 	return ptu_passed();
1143*74fe6c29SRuslan Bukin }
1144*74fe6c29SRuslan Bukin 
1145*74fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_twice(struct section_fixture *sfix)
1146*74fe6c29SRuslan Bukin {
1147*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1148*74fe6c29SRuslan Bukin 	int errcode;
1149*74fe6c29SRuslan Bukin 
1150*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1151*74fe6c29SRuslan Bukin 
1152*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1153*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1154*74fe6c29SRuslan Bukin 
1155*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
1156*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1157*74fe6c29SRuslan Bukin 
1158*74fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
1159*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1160*74fe6c29SRuslan Bukin 
1161*74fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
1162*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1163*74fe6c29SRuslan Bukin 
1164*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
1165*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1166*74fe6c29SRuslan Bukin 
1167*74fe6c29SRuslan Bukin 	return ptu_passed();
1168*74fe6c29SRuslan Bukin }
1169*74fe6c29SRuslan Bukin 
1170*74fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_nomap(struct section_fixture *sfix)
1171*74fe6c29SRuslan Bukin {
1172*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1173*74fe6c29SRuslan Bukin 	int errcode;
1174*74fe6c29SRuslan Bukin 
1175*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1176*74fe6c29SRuslan Bukin 
1177*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1178*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1179*74fe6c29SRuslan Bukin 
1180*74fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
1181*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
1182*74fe6c29SRuslan Bukin 
1183*74fe6c29SRuslan Bukin 	return ptu_passed();
1184*74fe6c29SRuslan Bukin }
1185*74fe6c29SRuslan Bukin 
1186*74fe6c29SRuslan Bukin static struct ptunit_result memsize_nomap(struct section_fixture *sfix)
1187*74fe6c29SRuslan Bukin {
1188*74fe6c29SRuslan Bukin 	uint64_t memsize;
1189*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1190*74fe6c29SRuslan Bukin 	int errcode;
1191*74fe6c29SRuslan Bukin 
1192*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1193*74fe6c29SRuslan Bukin 
1194*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1195*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1196*74fe6c29SRuslan Bukin 
1197*74fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, &memsize);
1198*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1199*74fe6c29SRuslan Bukin 	ptu_uint_eq(memsize, 0ull);
1200*74fe6c29SRuslan Bukin 
1201*74fe6c29SRuslan Bukin 	return ptu_passed();
1202*74fe6c29SRuslan Bukin }
1203*74fe6c29SRuslan Bukin 
1204*74fe6c29SRuslan Bukin static struct ptunit_result memsize_unmap(struct section_fixture *sfix)
1205*74fe6c29SRuslan Bukin {
1206*74fe6c29SRuslan Bukin 	uint64_t memsize;
1207*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1208*74fe6c29SRuslan Bukin 	int errcode;
1209*74fe6c29SRuslan Bukin 
1210*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1211*74fe6c29SRuslan Bukin 
1212*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1213*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1214*74fe6c29SRuslan Bukin 
1215*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
1216*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1217*74fe6c29SRuslan Bukin 
1218*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
1219*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1220*74fe6c29SRuslan Bukin 
1221*74fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, &memsize);
1222*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1223*74fe6c29SRuslan Bukin 	ptu_uint_eq(memsize, 0ull);
1224*74fe6c29SRuslan Bukin 
1225*74fe6c29SRuslan Bukin 	return ptu_passed();
1226*74fe6c29SRuslan Bukin }
1227*74fe6c29SRuslan Bukin 
1228*74fe6c29SRuslan Bukin static struct ptunit_result memsize_map_nobcache(struct section_fixture *sfix)
1229*74fe6c29SRuslan Bukin {
1230*74fe6c29SRuslan Bukin 	uint64_t memsize;
1231*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1232*74fe6c29SRuslan Bukin 	int errcode;
1233*74fe6c29SRuslan Bukin 
1234*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1235*74fe6c29SRuslan Bukin 
1236*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1237*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1238*74fe6c29SRuslan Bukin 
1239*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
1240*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1241*74fe6c29SRuslan Bukin 
1242*74fe6c29SRuslan Bukin 	memsize = 0xfefefefefefefefeull;
1243*74fe6c29SRuslan Bukin 
1244*74fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, &memsize);
1245*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1246*74fe6c29SRuslan Bukin 	ptu_uint_ge(memsize, 0ull);
1247*74fe6c29SRuslan Bukin 	ptu_uint_le(memsize, 0x2000ull);
1248*74fe6c29SRuslan Bukin 
1249*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
1250*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1251*74fe6c29SRuslan Bukin 
1252*74fe6c29SRuslan Bukin 	return ptu_passed();
1253*74fe6c29SRuslan Bukin }
1254*74fe6c29SRuslan Bukin 
1255*74fe6c29SRuslan Bukin static struct ptunit_result memsize_map_bcache(struct section_fixture *sfix)
1256*74fe6c29SRuslan Bukin {
1257*74fe6c29SRuslan Bukin 	uint64_t memsize;
1258*74fe6c29SRuslan Bukin 	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
1259*74fe6c29SRuslan Bukin 	int errcode;
1260*74fe6c29SRuslan Bukin 
1261*74fe6c29SRuslan Bukin 	sfix_write(sfix, bytes);
1262*74fe6c29SRuslan Bukin 
1263*74fe6c29SRuslan Bukin 	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
1264*74fe6c29SRuslan Bukin 	ptu_ptr(sfix->section);
1265*74fe6c29SRuslan Bukin 
1266*74fe6c29SRuslan Bukin 	errcode = pt_section_map(sfix->section);
1267*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1268*74fe6c29SRuslan Bukin 
1269*74fe6c29SRuslan Bukin 	errcode = pt_section_alloc_bcache(sfix->section);
1270*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1271*74fe6c29SRuslan Bukin 
1272*74fe6c29SRuslan Bukin 	errcode = pt_section_memsize(sfix->section, &memsize);
1273*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1274*74fe6c29SRuslan Bukin 	ptu_uint_ge(memsize,
1275*74fe6c29SRuslan Bukin 		    sfix->section->size * sizeof(struct pt_bcache_entry));
1276*74fe6c29SRuslan Bukin 
1277*74fe6c29SRuslan Bukin 	errcode = pt_section_unmap(sfix->section);
1278*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1279*74fe6c29SRuslan Bukin 
1280*74fe6c29SRuslan Bukin 	return ptu_passed();
1281*74fe6c29SRuslan Bukin }
1282*74fe6c29SRuslan Bukin 
1283*74fe6c29SRuslan Bukin static struct ptunit_result sfix_init(struct section_fixture *sfix)
1284*74fe6c29SRuslan Bukin {
1285*74fe6c29SRuslan Bukin 	int errcode;
1286*74fe6c29SRuslan Bukin 
1287*74fe6c29SRuslan Bukin 	sfix->section = NULL;
1288*74fe6c29SRuslan Bukin 	sfix->file = NULL;
1289*74fe6c29SRuslan Bukin 	sfix->name = NULL;
1290*74fe6c29SRuslan Bukin 
1291*74fe6c29SRuslan Bukin 	errcode = ptunit_mkfile(&sfix->file, &sfix->name, "wb");
1292*74fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
1293*74fe6c29SRuslan Bukin 
1294*74fe6c29SRuslan Bukin 	ptu_test(ptunit_thrd_init, &sfix->thrd);
1295*74fe6c29SRuslan Bukin 
1296*74fe6c29SRuslan Bukin 	return ptu_passed();
1297*74fe6c29SRuslan Bukin }
1298*74fe6c29SRuslan Bukin 
1299*74fe6c29SRuslan Bukin static struct ptunit_result sfix_fini(struct section_fixture *sfix)
1300*74fe6c29SRuslan Bukin {
1301*74fe6c29SRuslan Bukin 	int thrd;
1302*74fe6c29SRuslan Bukin 
1303*74fe6c29SRuslan Bukin 	ptu_test(ptunit_thrd_fini, &sfix->thrd);
1304*74fe6c29SRuslan Bukin 
1305*74fe6c29SRuslan Bukin 	for (thrd = 0; thrd < sfix->thrd.nthreads; ++thrd)
1306*74fe6c29SRuslan Bukin 		ptu_int_eq(sfix->thrd.result[thrd], 0);
1307*74fe6c29SRuslan Bukin 
1308*74fe6c29SRuslan Bukin 	if (sfix->section) {
1309*74fe6c29SRuslan Bukin 		pt_section_put(sfix->section);
1310*74fe6c29SRuslan Bukin 		sfix->section = NULL;
1311*74fe6c29SRuslan Bukin 	}
1312*74fe6c29SRuslan Bukin 
1313*74fe6c29SRuslan Bukin 	if (sfix->file) {
1314*74fe6c29SRuslan Bukin 		fclose(sfix->file);
1315*74fe6c29SRuslan Bukin 		sfix->file = NULL;
1316*74fe6c29SRuslan Bukin 
1317*74fe6c29SRuslan Bukin 		if (sfix->name)
1318*74fe6c29SRuslan Bukin 			remove(sfix->name);
1319*74fe6c29SRuslan Bukin 	}
1320*74fe6c29SRuslan Bukin 
1321*74fe6c29SRuslan Bukin 	if (sfix->name) {
1322*74fe6c29SRuslan Bukin 		free(sfix->name);
1323*74fe6c29SRuslan Bukin 		sfix->name = NULL;
1324*74fe6c29SRuslan Bukin 	}
1325*74fe6c29SRuslan Bukin 
1326*74fe6c29SRuslan Bukin 	return ptu_passed();
1327*74fe6c29SRuslan Bukin }
1328*74fe6c29SRuslan Bukin 
1329*74fe6c29SRuslan Bukin int main(int argc, char **argv)
1330*74fe6c29SRuslan Bukin {
1331*74fe6c29SRuslan Bukin 	struct section_fixture sfix;
1332*74fe6c29SRuslan Bukin 	struct ptunit_suite suite;
1333*74fe6c29SRuslan Bukin 
1334*74fe6c29SRuslan Bukin 	sfix.init = sfix_init;
1335*74fe6c29SRuslan Bukin 	sfix.fini = sfix_fini;
1336*74fe6c29SRuslan Bukin 
1337*74fe6c29SRuslan Bukin 	suite = ptunit_mk_suite(argc, argv);
1338*74fe6c29SRuslan Bukin 
1339*74fe6c29SRuslan Bukin 	ptu_run_f(suite, create, sfix);
1340*74fe6c29SRuslan Bukin 	ptu_run_f(suite, create_bad_offset, sfix);
1341*74fe6c29SRuslan Bukin 	ptu_run_f(suite, create_truncated, sfix);
1342*74fe6c29SRuslan Bukin 	ptu_run_f(suite, create_empty, sfix);
1343*74fe6c29SRuslan Bukin 
1344*74fe6c29SRuslan Bukin 	ptu_run(suite, filename_null);
1345*74fe6c29SRuslan Bukin 	ptu_run(suite, offset_null);
1346*74fe6c29SRuslan Bukin 	ptu_run(suite, size_null);
1347*74fe6c29SRuslan Bukin 	ptu_run(suite, get_null);
1348*74fe6c29SRuslan Bukin 	ptu_run(suite, put_null);
1349*74fe6c29SRuslan Bukin 	ptu_run(suite, attach_null);
1350*74fe6c29SRuslan Bukin 	ptu_run(suite, detach_null);
1351*74fe6c29SRuslan Bukin 	ptu_run(suite, map_null);
1352*74fe6c29SRuslan Bukin 	ptu_run(suite, unmap_null);
1353*74fe6c29SRuslan Bukin 	ptu_run(suite, cache_null);
1354*74fe6c29SRuslan Bukin 
1355*74fe6c29SRuslan Bukin 	ptu_run_f(suite, get_overflow, sfix);
1356*74fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_overflow, sfix);
1357*74fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_bad_ucount, sfix);
1358*74fe6c29SRuslan Bukin 	ptu_run_f(suite, map_change, sfix);
1359*74fe6c29SRuslan Bukin 	ptu_run_f(suite, map_put, sfix);
1360*74fe6c29SRuslan Bukin 	ptu_run_f(suite, unmap_nomap, sfix);
1361*74fe6c29SRuslan Bukin 	ptu_run_f(suite, map_overflow, sfix);
1362*74fe6c29SRuslan Bukin 	ptu_run_f(suite, get_put, sfix);
1363*74fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_detach, sfix);
1364*74fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_bad_iscache, sfix);
1365*74fe6c29SRuslan Bukin 	ptu_run_f(suite, detach_bad_iscache, sfix);
1366*74fe6c29SRuslan Bukin 	ptu_run_f(suite, map_unmap, sfix);
1367*74fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_map, sfix);
1368*74fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_bad_map, sfix);
1369*74fe6c29SRuslan Bukin 	ptu_run_f(suite, attach_map_overflow, sfix);
1370*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read, sfix);
1371*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_null, sfix);
1372*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_offset, sfix);
1373*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_truncated, sfix);
1374*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_from_truncated, sfix);
1375*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_nomem, sfix);
1376*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_overflow, sfix);
1377*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_overflow_32bit, sfix);
1378*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_nomap, sfix);
1379*74fe6c29SRuslan Bukin 	ptu_run_f(suite, read_unmap_map, sfix);
1380*74fe6c29SRuslan Bukin 
1381*74fe6c29SRuslan Bukin 	ptu_run_f(suite, init_no_bcache, sfix);
1382*74fe6c29SRuslan Bukin 	ptu_run_f(suite, bcache_alloc_free, sfix);
1383*74fe6c29SRuslan Bukin 	ptu_run_f(suite, bcache_alloc_twice, sfix);
1384*74fe6c29SRuslan Bukin 	ptu_run_f(suite, bcache_alloc_nomap, sfix);
1385*74fe6c29SRuslan Bukin 
1386*74fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_null, sfix);
1387*74fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_nomap, sfix);
1388*74fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_unmap, sfix);
1389*74fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_map_nobcache, sfix);
1390*74fe6c29SRuslan Bukin 	ptu_run_f(suite, memsize_map_bcache, sfix);
1391*74fe6c29SRuslan Bukin 
1392*74fe6c29SRuslan Bukin 	ptu_run_fp(suite, stress, sfix, worker_bcache);
1393*74fe6c29SRuslan Bukin 	ptu_run_fp(suite, stress, sfix, worker_read);
1394*74fe6c29SRuslan Bukin 
1395*74fe6c29SRuslan Bukin 	return ptunit_report(&suite);
1396*74fe6c29SRuslan Bukin }
1397