xref: /freebsd-src/contrib/processor-trace/libipt/test/src/ptunit-image.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.h"
3074fe6c29SRuslan Bukin 
3174fe6c29SRuslan Bukin #include "pt_image.h"
3274fe6c29SRuslan Bukin #include "pt_section.h"
3374fe6c29SRuslan Bukin #include "pt_mapped_section.h"
3474fe6c29SRuslan Bukin 
3574fe6c29SRuslan Bukin #include "intel-pt.h"
3674fe6c29SRuslan Bukin 
3774fe6c29SRuslan Bukin 
3874fe6c29SRuslan Bukin struct image_fixture;
3974fe6c29SRuslan Bukin 
4074fe6c29SRuslan Bukin /* A test mapping. */
4174fe6c29SRuslan Bukin struct ifix_mapping {
4274fe6c29SRuslan Bukin 	/* The contents. */
4374fe6c29SRuslan Bukin 	uint8_t content[0x10];
4474fe6c29SRuslan Bukin 
4574fe6c29SRuslan Bukin 	/* The size - between 0 and sizeof(content). */
4674fe6c29SRuslan Bukin 	uint64_t size;
4774fe6c29SRuslan Bukin 
4874fe6c29SRuslan Bukin 	/* An artificial error code to be injected into pt_section_read().
4974fe6c29SRuslan Bukin 	 *
5074fe6c29SRuslan Bukin 	 * If @errcode is non-zero, pt_section_read() fails with @errcode.
5174fe6c29SRuslan Bukin 	 */
5274fe6c29SRuslan Bukin 	int errcode;
5374fe6c29SRuslan Bukin };
5474fe6c29SRuslan Bukin 
5574fe6c29SRuslan Bukin /* A test file status - turned into a section status. */
5674fe6c29SRuslan Bukin struct ifix_status {
5774fe6c29SRuslan Bukin 	/* Delete indication:
5874fe6c29SRuslan Bukin 	 * - zero if initialized and not (yet) deleted
5974fe6c29SRuslan Bukin 	 * - non-zero if deleted and not (re-)initialized
6074fe6c29SRuslan Bukin 	 */
6174fe6c29SRuslan Bukin 	int deleted;
6274fe6c29SRuslan Bukin 
6374fe6c29SRuslan Bukin 	/* Put with use-count of zero indication. */
6474fe6c29SRuslan Bukin 	int bad_put;
6574fe6c29SRuslan Bukin 
6674fe6c29SRuslan Bukin 	/* The test mapping to be used. */
6774fe6c29SRuslan Bukin 	struct ifix_mapping *mapping;
6874fe6c29SRuslan Bukin 
6974fe6c29SRuslan Bukin 	/* A link back to the test fixture providing this section. */
7074fe6c29SRuslan Bukin 	struct image_fixture *ifix;
7174fe6c29SRuslan Bukin };
7274fe6c29SRuslan Bukin 
7374fe6c29SRuslan Bukin enum {
7474fe6c29SRuslan Bukin 	ifix_nsecs = 5
7574fe6c29SRuslan Bukin };
7674fe6c29SRuslan Bukin 
7774fe6c29SRuslan Bukin /* A fake image section cache. */
7874fe6c29SRuslan Bukin struct pt_image_section_cache {
7974fe6c29SRuslan Bukin 	/* The cached sections. */
8074fe6c29SRuslan Bukin 	struct pt_section *section[ifix_nsecs];
8174fe6c29SRuslan Bukin 
8274fe6c29SRuslan Bukin 	/* Their load addresses. */
8374fe6c29SRuslan Bukin 	uint64_t laddr[ifix_nsecs];
8474fe6c29SRuslan Bukin 
8574fe6c29SRuslan Bukin 	/* The number of used sections. */
8674fe6c29SRuslan Bukin 	int nsecs;
8774fe6c29SRuslan Bukin };
8874fe6c29SRuslan Bukin 
8974fe6c29SRuslan Bukin extern int pt_iscache_lookup(struct pt_image_section_cache *iscache,
9074fe6c29SRuslan Bukin 			     struct pt_section **section, uint64_t *laddr,
9174fe6c29SRuslan Bukin 			     int isid);
9274fe6c29SRuslan Bukin 
9374fe6c29SRuslan Bukin 
9474fe6c29SRuslan Bukin /* A test fixture providing an image, test sections, and asids. */
9574fe6c29SRuslan Bukin struct image_fixture {
9674fe6c29SRuslan Bukin 	/* The image. */
9774fe6c29SRuslan Bukin 	struct pt_image image;
9874fe6c29SRuslan Bukin 
9974fe6c29SRuslan Bukin 	/* The test states. */
10074fe6c29SRuslan Bukin 	struct ifix_status status[ifix_nsecs];
10174fe6c29SRuslan Bukin 
10274fe6c29SRuslan Bukin 	/* The test mappings. */
10374fe6c29SRuslan Bukin 	struct ifix_mapping mapping[ifix_nsecs];
10474fe6c29SRuslan Bukin 
10574fe6c29SRuslan Bukin 	/* The sections. */
10674fe6c29SRuslan Bukin 	struct pt_section section[ifix_nsecs];
10774fe6c29SRuslan Bukin 
10874fe6c29SRuslan Bukin 	/* The asids. */
10974fe6c29SRuslan Bukin 	struct pt_asid asid[3];
11074fe6c29SRuslan Bukin 
11174fe6c29SRuslan Bukin 	/* The number of used sections/mappings/states. */
11274fe6c29SRuslan Bukin 	int nsecs;
11374fe6c29SRuslan Bukin 
11474fe6c29SRuslan Bukin 	/* An initially empty image as destination for image copies. */
11574fe6c29SRuslan Bukin 	struct pt_image copy;
11674fe6c29SRuslan Bukin 
11774fe6c29SRuslan Bukin 	/* A test section cache. */
11874fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
11974fe6c29SRuslan Bukin 
12074fe6c29SRuslan Bukin 	/* The test fixture initialization and finalization functions. */
12174fe6c29SRuslan Bukin 	struct ptunit_result (*init)(struct image_fixture *);
12274fe6c29SRuslan Bukin 	struct ptunit_result (*fini)(struct image_fixture *);
12374fe6c29SRuslan Bukin };
12474fe6c29SRuslan Bukin 
ifix_init_section(struct pt_section * section,char * filename,struct ifix_status * status,struct ifix_mapping * mapping,struct image_fixture * ifix)12574fe6c29SRuslan Bukin static void ifix_init_section(struct pt_section *section, char *filename,
12674fe6c29SRuslan Bukin 			      struct ifix_status *status,
12774fe6c29SRuslan Bukin 			      struct ifix_mapping *mapping,
12874fe6c29SRuslan Bukin 			      struct image_fixture *ifix)
12974fe6c29SRuslan Bukin {
13074fe6c29SRuslan Bukin 	uint8_t i;
13174fe6c29SRuslan Bukin 
13274fe6c29SRuslan Bukin 	memset(section, 0, sizeof(*section));
13374fe6c29SRuslan Bukin 
13474fe6c29SRuslan Bukin 	section->filename = filename;
13574fe6c29SRuslan Bukin 	section->status = status;
13674fe6c29SRuslan Bukin 	section->size = mapping->size = sizeof(mapping->content);
13774fe6c29SRuslan Bukin 	section->offset = 0x10;
13874fe6c29SRuslan Bukin 
13974fe6c29SRuslan Bukin 	for (i = 0; i < mapping->size; ++i)
14074fe6c29SRuslan Bukin 		mapping->content[i] = i;
14174fe6c29SRuslan Bukin 
14274fe6c29SRuslan Bukin 	status->deleted = 0;
14374fe6c29SRuslan Bukin 	status->bad_put = 0;
14474fe6c29SRuslan Bukin 	status->mapping = mapping;
14574fe6c29SRuslan Bukin 	status->ifix = ifix;
14674fe6c29SRuslan Bukin }
14774fe6c29SRuslan Bukin 
ifix_add_section(struct image_fixture * ifix,char * filename)14874fe6c29SRuslan Bukin static int ifix_add_section(struct image_fixture *ifix, char *filename)
14974fe6c29SRuslan Bukin {
15074fe6c29SRuslan Bukin 	int index;
15174fe6c29SRuslan Bukin 
15274fe6c29SRuslan Bukin 	if (!ifix)
15374fe6c29SRuslan Bukin 		return -pte_internal;
15474fe6c29SRuslan Bukin 
15574fe6c29SRuslan Bukin 	index = ifix->nsecs;
15674fe6c29SRuslan Bukin 	if (ifix_nsecs <= index)
15774fe6c29SRuslan Bukin 		return -pte_internal;
15874fe6c29SRuslan Bukin 
15974fe6c29SRuslan Bukin 	ifix_init_section(&ifix->section[index], filename, &ifix->status[index],
16074fe6c29SRuslan Bukin 			  &ifix->mapping[index], ifix);
16174fe6c29SRuslan Bukin 
16274fe6c29SRuslan Bukin 	ifix->nsecs += 1;
16374fe6c29SRuslan Bukin 	return index;
16474fe6c29SRuslan Bukin }
16574fe6c29SRuslan Bukin 
ifix_cache_section(struct image_fixture * ifix,struct pt_section * section,uint64_t laddr)16674fe6c29SRuslan Bukin static int ifix_cache_section(struct image_fixture *ifix,
16774fe6c29SRuslan Bukin 			      struct pt_section *section, uint64_t laddr)
16874fe6c29SRuslan Bukin {
16974fe6c29SRuslan Bukin 	int index;
17074fe6c29SRuslan Bukin 
17174fe6c29SRuslan Bukin 	if (!ifix)
17274fe6c29SRuslan Bukin 		return -pte_internal;
17374fe6c29SRuslan Bukin 
17474fe6c29SRuslan Bukin 	index = ifix->iscache.nsecs;
17574fe6c29SRuslan Bukin 	if (ifix_nsecs <= index)
17674fe6c29SRuslan Bukin 		return -pte_internal;
17774fe6c29SRuslan Bukin 
17874fe6c29SRuslan Bukin 	ifix->iscache.section[index] = section;
17974fe6c29SRuslan Bukin 	ifix->iscache.laddr[index] = laddr;
18074fe6c29SRuslan Bukin 
18174fe6c29SRuslan Bukin 	index += 1;
18274fe6c29SRuslan Bukin 	ifix->iscache.nsecs = index;
18374fe6c29SRuslan Bukin 
18474fe6c29SRuslan Bukin 	return index;
18574fe6c29SRuslan Bukin }
18674fe6c29SRuslan Bukin 
pt_section_filename(const struct pt_section * section)18774fe6c29SRuslan Bukin const char *pt_section_filename(const struct pt_section *section)
18874fe6c29SRuslan Bukin {
18974fe6c29SRuslan Bukin 	if (!section)
19074fe6c29SRuslan Bukin 		return NULL;
19174fe6c29SRuslan Bukin 
19274fe6c29SRuslan Bukin 	return section->filename;
19374fe6c29SRuslan Bukin }
19474fe6c29SRuslan Bukin 
pt_section_offset(const struct pt_section * section)19574fe6c29SRuslan Bukin uint64_t pt_section_offset(const struct pt_section *section)
19674fe6c29SRuslan Bukin {
19774fe6c29SRuslan Bukin 	if (!section)
19874fe6c29SRuslan Bukin 		return 0ull;
19974fe6c29SRuslan Bukin 
20074fe6c29SRuslan Bukin 	return section->offset;
20174fe6c29SRuslan Bukin }
20274fe6c29SRuslan Bukin 
pt_section_size(const struct pt_section * section)20374fe6c29SRuslan Bukin uint64_t pt_section_size(const struct pt_section *section)
20474fe6c29SRuslan Bukin {
20574fe6c29SRuslan Bukin 	if (!section)
20674fe6c29SRuslan Bukin 		return 0ull;
20774fe6c29SRuslan Bukin 
20874fe6c29SRuslan Bukin 	return section->size;
20974fe6c29SRuslan Bukin }
21074fe6c29SRuslan Bukin 
pt_mk_section(struct pt_section ** psection,const char * filename,uint64_t offset,uint64_t size)211*85f87cf4SRuslan Bukin int pt_mk_section(struct pt_section **psection, const char *filename,
212*85f87cf4SRuslan Bukin 		  uint64_t offset, uint64_t size)
21374fe6c29SRuslan Bukin {
214*85f87cf4SRuslan Bukin 	(void) psection;
215*85f87cf4SRuslan Bukin 	(void) filename;
21674fe6c29SRuslan Bukin 	(void) offset;
21774fe6c29SRuslan Bukin 	(void) size;
21874fe6c29SRuslan Bukin 
21974fe6c29SRuslan Bukin 	/* This function is not used by our tests. */
220*85f87cf4SRuslan Bukin 	return -pte_not_supported;
22174fe6c29SRuslan Bukin }
22274fe6c29SRuslan Bukin 
pt_section_get(struct pt_section * section)22374fe6c29SRuslan Bukin int pt_section_get(struct pt_section *section)
22474fe6c29SRuslan Bukin {
22574fe6c29SRuslan Bukin 	if (!section)
22674fe6c29SRuslan Bukin 		return -pte_internal;
22774fe6c29SRuslan Bukin 
22874fe6c29SRuslan Bukin 	section->ucount += 1;
22974fe6c29SRuslan Bukin 	return 0;
23074fe6c29SRuslan Bukin }
23174fe6c29SRuslan Bukin 
pt_section_put(struct pt_section * section)23274fe6c29SRuslan Bukin int pt_section_put(struct pt_section *section)
23374fe6c29SRuslan Bukin {
23474fe6c29SRuslan Bukin 	struct ifix_status *status;
23574fe6c29SRuslan Bukin 	uint16_t ucount;
23674fe6c29SRuslan Bukin 
23774fe6c29SRuslan Bukin 	if (!section)
23874fe6c29SRuslan Bukin 		return -pte_internal;
23974fe6c29SRuslan Bukin 
24074fe6c29SRuslan Bukin 	status = section->status;
24174fe6c29SRuslan Bukin 	if (!status)
24274fe6c29SRuslan Bukin 		return -pte_internal;
24374fe6c29SRuslan Bukin 
24474fe6c29SRuslan Bukin 	ucount = section->ucount;
24574fe6c29SRuslan Bukin 	if (!ucount) {
24674fe6c29SRuslan Bukin 		status->bad_put += 1;
24774fe6c29SRuslan Bukin 
24874fe6c29SRuslan Bukin 		return -pte_internal;
24974fe6c29SRuslan Bukin 	}
25074fe6c29SRuslan Bukin 
25174fe6c29SRuslan Bukin 	ucount = --section->ucount;
25274fe6c29SRuslan Bukin 	if (!ucount) {
25374fe6c29SRuslan Bukin 		status->deleted += 1;
25474fe6c29SRuslan Bukin 
25574fe6c29SRuslan Bukin 		if (status->deleted > 1)
25674fe6c29SRuslan Bukin 			return -pte_internal;
25774fe6c29SRuslan Bukin 	}
25874fe6c29SRuslan Bukin 
25974fe6c29SRuslan Bukin 	return 0;
26074fe6c29SRuslan Bukin }
26174fe6c29SRuslan Bukin 
pt_iscache_lookup(struct pt_image_section_cache * iscache,struct pt_section ** section,uint64_t * laddr,int isid)26274fe6c29SRuslan Bukin int pt_iscache_lookup(struct pt_image_section_cache *iscache,
26374fe6c29SRuslan Bukin 		      struct pt_section **section, uint64_t *laddr, int isid)
26474fe6c29SRuslan Bukin {
26574fe6c29SRuslan Bukin 	if (!iscache || !section || !laddr)
26674fe6c29SRuslan Bukin 		return -pte_internal;
26774fe6c29SRuslan Bukin 
26874fe6c29SRuslan Bukin 	if (!isid || iscache->nsecs < isid)
26974fe6c29SRuslan Bukin 		return -pte_bad_image;
27074fe6c29SRuslan Bukin 
27174fe6c29SRuslan Bukin 	isid -= 1;
27274fe6c29SRuslan Bukin 
27374fe6c29SRuslan Bukin 	*section = iscache->section[isid];
27474fe6c29SRuslan Bukin 	*laddr = iscache->laddr[isid];
27574fe6c29SRuslan Bukin 
27674fe6c29SRuslan Bukin 	return pt_section_get(*section);
27774fe6c29SRuslan Bukin }
27874fe6c29SRuslan Bukin 
ifix_unmap(struct pt_section * section)27974fe6c29SRuslan Bukin static int ifix_unmap(struct pt_section *section)
28074fe6c29SRuslan Bukin {
28174fe6c29SRuslan Bukin 	uint16_t mcount;
28274fe6c29SRuslan Bukin 
28374fe6c29SRuslan Bukin 	if (!section)
28474fe6c29SRuslan Bukin 		return -pte_internal;
28574fe6c29SRuslan Bukin 
28674fe6c29SRuslan Bukin 	mcount = section->mcount;
28774fe6c29SRuslan Bukin 	if (!mcount)
28874fe6c29SRuslan Bukin 		return -pte_internal;
28974fe6c29SRuslan Bukin 
29074fe6c29SRuslan Bukin 	if (!section->mapping)
29174fe6c29SRuslan Bukin 		return -pte_internal;
29274fe6c29SRuslan Bukin 
29374fe6c29SRuslan Bukin 	mcount = --section->mcount;
29474fe6c29SRuslan Bukin 	if (!mcount)
29574fe6c29SRuslan Bukin 		section->mapping = NULL;
29674fe6c29SRuslan Bukin 
29774fe6c29SRuslan Bukin 	return 0;
29874fe6c29SRuslan Bukin }
29974fe6c29SRuslan Bukin 
ifix_read(const struct pt_section * section,uint8_t * buffer,uint16_t size,uint64_t offset)30074fe6c29SRuslan Bukin static int ifix_read(const struct pt_section *section, uint8_t *buffer,
30174fe6c29SRuslan Bukin 		     uint16_t size, uint64_t offset)
30274fe6c29SRuslan Bukin {
30374fe6c29SRuslan Bukin 	struct ifix_mapping *mapping;
30474fe6c29SRuslan Bukin 	uint64_t begin, end;
30574fe6c29SRuslan Bukin 
30674fe6c29SRuslan Bukin 	if (!section || !buffer)
30774fe6c29SRuslan Bukin 		return -pte_internal;
30874fe6c29SRuslan Bukin 
30974fe6c29SRuslan Bukin 	begin = offset;
31074fe6c29SRuslan Bukin 	end = begin + size;
31174fe6c29SRuslan Bukin 
31274fe6c29SRuslan Bukin 	if (end < begin)
31374fe6c29SRuslan Bukin 		return -pte_nomap;
31474fe6c29SRuslan Bukin 
31574fe6c29SRuslan Bukin 	mapping = section->mapping;
31674fe6c29SRuslan Bukin 	if (!mapping)
31774fe6c29SRuslan Bukin 		return -pte_nomap;
31874fe6c29SRuslan Bukin 
31974fe6c29SRuslan Bukin 	if (mapping->errcode)
32074fe6c29SRuslan Bukin 		return mapping->errcode;
32174fe6c29SRuslan Bukin 
32274fe6c29SRuslan Bukin 	if (mapping->size <= begin)
32374fe6c29SRuslan Bukin 		return -pte_nomap;
32474fe6c29SRuslan Bukin 
32574fe6c29SRuslan Bukin 	if (mapping->size < end) {
32674fe6c29SRuslan Bukin 		end = mapping->size;
32774fe6c29SRuslan Bukin 		size = (uint16_t) (end - begin);
32874fe6c29SRuslan Bukin 	}
32974fe6c29SRuslan Bukin 
33074fe6c29SRuslan Bukin 	memcpy(buffer, &mapping->content[begin], size);
33174fe6c29SRuslan Bukin 
33274fe6c29SRuslan Bukin 	return size;
33374fe6c29SRuslan Bukin }
33474fe6c29SRuslan Bukin 
pt_section_map(struct pt_section * section)33574fe6c29SRuslan Bukin int pt_section_map(struct pt_section *section)
33674fe6c29SRuslan Bukin {
33774fe6c29SRuslan Bukin 	struct ifix_status *status;
33874fe6c29SRuslan Bukin 	uint16_t mcount;
33974fe6c29SRuslan Bukin 
34074fe6c29SRuslan Bukin 	if (!section)
34174fe6c29SRuslan Bukin 		return -pte_internal;
34274fe6c29SRuslan Bukin 
34374fe6c29SRuslan Bukin 	mcount = section->mcount++;
34474fe6c29SRuslan Bukin 	if (mcount)
34574fe6c29SRuslan Bukin 		return 0;
34674fe6c29SRuslan Bukin 
34774fe6c29SRuslan Bukin 	if (section->mapping)
34874fe6c29SRuslan Bukin 		return -pte_internal;
34974fe6c29SRuslan Bukin 
35074fe6c29SRuslan Bukin 	status = section->status;
35174fe6c29SRuslan Bukin 	if (!status)
35274fe6c29SRuslan Bukin 		return -pte_internal;
35374fe6c29SRuslan Bukin 
35474fe6c29SRuslan Bukin 	section->mapping = status->mapping;
35574fe6c29SRuslan Bukin 	section->unmap = ifix_unmap;
35674fe6c29SRuslan Bukin 	section->read = ifix_read;
35774fe6c29SRuslan Bukin 
35874fe6c29SRuslan Bukin 	return 0;
35974fe6c29SRuslan Bukin }
36074fe6c29SRuslan Bukin 
pt_section_on_map_lock(struct pt_section * section)36174fe6c29SRuslan Bukin int pt_section_on_map_lock(struct pt_section *section)
36274fe6c29SRuslan Bukin {
36374fe6c29SRuslan Bukin 	if (!section)
36474fe6c29SRuslan Bukin 		return -pte_internal;
36574fe6c29SRuslan Bukin 
36674fe6c29SRuslan Bukin 	return 0;
36774fe6c29SRuslan Bukin }
36874fe6c29SRuslan Bukin 
pt_section_unmap(struct pt_section * section)36974fe6c29SRuslan Bukin int pt_section_unmap(struct pt_section *section)
37074fe6c29SRuslan Bukin {
37174fe6c29SRuslan Bukin 	if (!section)
37274fe6c29SRuslan Bukin 		return -pte_internal;
37374fe6c29SRuslan Bukin 
37474fe6c29SRuslan Bukin 	if (!section->unmap)
37574fe6c29SRuslan Bukin 		return -pte_nomap;
37674fe6c29SRuslan Bukin 
37774fe6c29SRuslan Bukin 	return section->unmap(section);
37874fe6c29SRuslan Bukin }
37974fe6c29SRuslan Bukin 
pt_section_read(const struct pt_section * section,uint8_t * buffer,uint16_t size,uint64_t offset)38074fe6c29SRuslan Bukin int pt_section_read(const struct pt_section *section, uint8_t *buffer,
38174fe6c29SRuslan Bukin 		    uint16_t size, uint64_t offset)
38274fe6c29SRuslan Bukin {
38374fe6c29SRuslan Bukin 	if (!section)
38474fe6c29SRuslan Bukin 		return -pte_internal;
38574fe6c29SRuslan Bukin 
38674fe6c29SRuslan Bukin 	if (!section->read)
38774fe6c29SRuslan Bukin 		return -pte_nomap;
38874fe6c29SRuslan Bukin 
38974fe6c29SRuslan Bukin 	return section->read(section, buffer, size, offset);
39074fe6c29SRuslan Bukin }
39174fe6c29SRuslan Bukin 
39274fe6c29SRuslan Bukin /* A test read memory callback. */
image_readmem_callback(uint8_t * buffer,size_t size,const struct pt_asid * asid,uint64_t ip,void * context)39374fe6c29SRuslan Bukin static int image_readmem_callback(uint8_t *buffer, size_t size,
39474fe6c29SRuslan Bukin 				  const struct pt_asid *asid,
39574fe6c29SRuslan Bukin 				  uint64_t ip, void *context)
39674fe6c29SRuslan Bukin {
39774fe6c29SRuslan Bukin 	const uint8_t *memory;
39874fe6c29SRuslan Bukin 	size_t idx;
39974fe6c29SRuslan Bukin 
40074fe6c29SRuslan Bukin 	(void) asid;
40174fe6c29SRuslan Bukin 
40274fe6c29SRuslan Bukin 	if (!buffer)
40374fe6c29SRuslan Bukin 		return -pte_invalid;
40474fe6c29SRuslan Bukin 
40574fe6c29SRuslan Bukin 	/* We use a constant offset of 0x3000. */
40674fe6c29SRuslan Bukin 	if (ip < 0x3000ull)
40774fe6c29SRuslan Bukin 		return -pte_nomap;
40874fe6c29SRuslan Bukin 
40974fe6c29SRuslan Bukin 	ip -= 0x3000ull;
41074fe6c29SRuslan Bukin 
41174fe6c29SRuslan Bukin 	memory = (const uint8_t *) context;
41274fe6c29SRuslan Bukin 	if (!memory)
41374fe6c29SRuslan Bukin 		return -pte_internal;
41474fe6c29SRuslan Bukin 
41574fe6c29SRuslan Bukin 	for (idx = 0; idx < size; ++idx)
41674fe6c29SRuslan Bukin 		buffer[idx] = memory[ip + idx];
41774fe6c29SRuslan Bukin 
41874fe6c29SRuslan Bukin 	return (int) idx;
41974fe6c29SRuslan Bukin }
42074fe6c29SRuslan Bukin 
init(void)42174fe6c29SRuslan Bukin static struct ptunit_result init(void)
42274fe6c29SRuslan Bukin {
42374fe6c29SRuslan Bukin 	struct pt_image image;
42474fe6c29SRuslan Bukin 
42574fe6c29SRuslan Bukin 	memset(&image, 0xcd, sizeof(image));
42674fe6c29SRuslan Bukin 
42774fe6c29SRuslan Bukin 	pt_image_init(&image, NULL);
42874fe6c29SRuslan Bukin 	ptu_null(image.name);
42974fe6c29SRuslan Bukin 	ptu_null(image.sections);
43074fe6c29SRuslan Bukin 	ptu_null((void *) (uintptr_t) image.readmem.callback);
43174fe6c29SRuslan Bukin 	ptu_null(image.readmem.context);
43274fe6c29SRuslan Bukin 
43374fe6c29SRuslan Bukin 	return ptu_passed();
43474fe6c29SRuslan Bukin }
43574fe6c29SRuslan Bukin 
init_name(struct image_fixture * ifix)43674fe6c29SRuslan Bukin static struct ptunit_result init_name(struct image_fixture *ifix)
43774fe6c29SRuslan Bukin {
43874fe6c29SRuslan Bukin 	memset(&ifix->image, 0xcd, sizeof(ifix->image));
43974fe6c29SRuslan Bukin 
44074fe6c29SRuslan Bukin 	pt_image_init(&ifix->image, "image-name");
44174fe6c29SRuslan Bukin 	ptu_str_eq(ifix->image.name, "image-name");
44274fe6c29SRuslan Bukin 	ptu_null(ifix->image.sections);
44374fe6c29SRuslan Bukin 	ptu_null((void *) (uintptr_t) ifix->image.readmem.callback);
44474fe6c29SRuslan Bukin 	ptu_null(ifix->image.readmem.context);
44574fe6c29SRuslan Bukin 
44674fe6c29SRuslan Bukin 	return ptu_passed();
44774fe6c29SRuslan Bukin }
44874fe6c29SRuslan Bukin 
init_null(void)44974fe6c29SRuslan Bukin static struct ptunit_result init_null(void)
45074fe6c29SRuslan Bukin {
45174fe6c29SRuslan Bukin 	pt_image_init(NULL, NULL);
45274fe6c29SRuslan Bukin 
45374fe6c29SRuslan Bukin 	return ptu_passed();
45474fe6c29SRuslan Bukin }
45574fe6c29SRuslan Bukin 
fini(void)45674fe6c29SRuslan Bukin static struct ptunit_result fini(void)
45774fe6c29SRuslan Bukin {
45874fe6c29SRuslan Bukin 	struct ifix_mapping mapping;
45974fe6c29SRuslan Bukin 	struct ifix_status status;
46074fe6c29SRuslan Bukin 	struct pt_section section;
46174fe6c29SRuslan Bukin 	struct pt_image image;
46274fe6c29SRuslan Bukin 	struct pt_asid asid;
46374fe6c29SRuslan Bukin 	int errcode;
46474fe6c29SRuslan Bukin 
46574fe6c29SRuslan Bukin 	pt_asid_init(&asid);
46674fe6c29SRuslan Bukin 	ifix_init_section(&section, NULL, &status, &mapping, NULL);
46774fe6c29SRuslan Bukin 
46874fe6c29SRuslan Bukin 	pt_image_init(&image, NULL);
46974fe6c29SRuslan Bukin 	errcode = pt_image_add(&image, &section, &asid, 0x0ull, 0);
47074fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
47174fe6c29SRuslan Bukin 
47274fe6c29SRuslan Bukin 	pt_image_fini(&image);
47374fe6c29SRuslan Bukin 	ptu_int_eq(section.ucount, 0);
47474fe6c29SRuslan Bukin 	ptu_int_eq(section.mcount, 0);
47574fe6c29SRuslan Bukin 	ptu_int_eq(status.deleted, 1);
47674fe6c29SRuslan Bukin 	ptu_int_eq(status.bad_put, 0);
47774fe6c29SRuslan Bukin 
47874fe6c29SRuslan Bukin 	return ptu_passed();
47974fe6c29SRuslan Bukin }
48074fe6c29SRuslan Bukin 
fini_empty(void)48174fe6c29SRuslan Bukin static struct ptunit_result fini_empty(void)
48274fe6c29SRuslan Bukin {
48374fe6c29SRuslan Bukin 	struct pt_image image;
48474fe6c29SRuslan Bukin 
48574fe6c29SRuslan Bukin 	pt_image_init(&image, NULL);
48674fe6c29SRuslan Bukin 	pt_image_fini(&image);
48774fe6c29SRuslan Bukin 
48874fe6c29SRuslan Bukin 	return ptu_passed();
48974fe6c29SRuslan Bukin }
49074fe6c29SRuslan Bukin 
fini_null(void)49174fe6c29SRuslan Bukin static struct ptunit_result fini_null(void)
49274fe6c29SRuslan Bukin {
49374fe6c29SRuslan Bukin 	pt_image_fini(NULL);
49474fe6c29SRuslan Bukin 
49574fe6c29SRuslan Bukin 	return ptu_passed();
49674fe6c29SRuslan Bukin }
49774fe6c29SRuslan Bukin 
name(struct image_fixture * ifix)49874fe6c29SRuslan Bukin static struct ptunit_result name(struct image_fixture *ifix)
49974fe6c29SRuslan Bukin {
50074fe6c29SRuslan Bukin 	const char *name;
50174fe6c29SRuslan Bukin 
50274fe6c29SRuslan Bukin 	pt_image_init(&ifix->image, "image-name");
50374fe6c29SRuslan Bukin 
50474fe6c29SRuslan Bukin 	name = pt_image_name(&ifix->image);
50574fe6c29SRuslan Bukin 	ptu_str_eq(name, "image-name");
50674fe6c29SRuslan Bukin 
50774fe6c29SRuslan Bukin 	return ptu_passed();
50874fe6c29SRuslan Bukin }
50974fe6c29SRuslan Bukin 
name_none(void)51074fe6c29SRuslan Bukin static struct ptunit_result name_none(void)
51174fe6c29SRuslan Bukin {
51274fe6c29SRuslan Bukin 	struct pt_image image;
51374fe6c29SRuslan Bukin 	const char *name;
51474fe6c29SRuslan Bukin 
51574fe6c29SRuslan Bukin 	pt_image_init(&image, NULL);
51674fe6c29SRuslan Bukin 
51774fe6c29SRuslan Bukin 	name = pt_image_name(&image);
51874fe6c29SRuslan Bukin 	ptu_null(name);
51974fe6c29SRuslan Bukin 
52074fe6c29SRuslan Bukin 	return ptu_passed();
52174fe6c29SRuslan Bukin }
52274fe6c29SRuslan Bukin 
name_null(void)52374fe6c29SRuslan Bukin static struct ptunit_result name_null(void)
52474fe6c29SRuslan Bukin {
52574fe6c29SRuslan Bukin 	const char *name;
52674fe6c29SRuslan Bukin 
52774fe6c29SRuslan Bukin 	name = pt_image_name(NULL);
52874fe6c29SRuslan Bukin 	ptu_null(name);
52974fe6c29SRuslan Bukin 
53074fe6c29SRuslan Bukin 	return ptu_passed();
53174fe6c29SRuslan Bukin }
53274fe6c29SRuslan Bukin 
read_empty(struct image_fixture * ifix)53374fe6c29SRuslan Bukin static struct ptunit_result read_empty(struct image_fixture *ifix)
53474fe6c29SRuslan Bukin {
53574fe6c29SRuslan Bukin 	struct pt_asid asid;
53674fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
53774fe6c29SRuslan Bukin 	int status, isid;
53874fe6c29SRuslan Bukin 
53974fe6c29SRuslan Bukin 	pt_asid_init(&asid);
54074fe6c29SRuslan Bukin 
54174fe6c29SRuslan Bukin 	isid = -1;
54274fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
54374fe6c29SRuslan Bukin 			       &asid, 0x1000ull);
54474fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
54574fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
54674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
54774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
54874fe6c29SRuslan Bukin 
54974fe6c29SRuslan Bukin 	return ptu_passed();
55074fe6c29SRuslan Bukin }
55174fe6c29SRuslan Bukin 
overlap_front(struct image_fixture * ifix)55274fe6c29SRuslan Bukin static struct ptunit_result overlap_front(struct image_fixture *ifix)
55374fe6c29SRuslan Bukin {
55474fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
55574fe6c29SRuslan Bukin 	int status, isid;
55674fe6c29SRuslan Bukin 
55774fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
55874fe6c29SRuslan Bukin 			      0x1001ull, 1);
55974fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
56074fe6c29SRuslan Bukin 
56174fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
56274fe6c29SRuslan Bukin 			      0x1000ull, 2);
56374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
56474fe6c29SRuslan Bukin 
56574fe6c29SRuslan Bukin 	isid = -1;
56674fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
56774fe6c29SRuslan Bukin 			       0x1010ull);
56874fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
56974fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
57074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0f);
57174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
57274fe6c29SRuslan Bukin 
57374fe6c29SRuslan Bukin 	buffer[0] = 0xcc;
57474fe6c29SRuslan Bukin 
57574fe6c29SRuslan Bukin 	isid = -1;
57674fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
57774fe6c29SRuslan Bukin 			       0x100full);
57874fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
57974fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
58074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0f);
58174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
58274fe6c29SRuslan Bukin 
58374fe6c29SRuslan Bukin 	return ptu_passed();
58474fe6c29SRuslan Bukin }
58574fe6c29SRuslan Bukin 
overlap_back(struct image_fixture * ifix)58674fe6c29SRuslan Bukin static struct ptunit_result overlap_back(struct image_fixture *ifix)
58774fe6c29SRuslan Bukin {
58874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
58974fe6c29SRuslan Bukin 	int status, isid;
59074fe6c29SRuslan Bukin 
59174fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
59274fe6c29SRuslan Bukin 			      0x1000ull, 1);
59374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
59474fe6c29SRuslan Bukin 
59574fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
59674fe6c29SRuslan Bukin 			      0x1001ull, 2);
59774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
59874fe6c29SRuslan Bukin 
59974fe6c29SRuslan Bukin 	isid = -1;
60074fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
60174fe6c29SRuslan Bukin 			       0x1000ull);
60274fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
60374fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
60474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
60574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
60674fe6c29SRuslan Bukin 
60774fe6c29SRuslan Bukin 	isid = -1;
60874fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
60974fe6c29SRuslan Bukin 			       0x1010ull);
61074fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
61174fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
61274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0f);
61374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
61474fe6c29SRuslan Bukin 
61574fe6c29SRuslan Bukin 	isid = -1;
61674fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
61774fe6c29SRuslan Bukin 			       0x1001ull);
61874fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
61974fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
62074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
62174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
62274fe6c29SRuslan Bukin 
62374fe6c29SRuslan Bukin 	return ptu_passed();
62474fe6c29SRuslan Bukin }
62574fe6c29SRuslan Bukin 
overlap_multiple(struct image_fixture * ifix)62674fe6c29SRuslan Bukin static struct ptunit_result overlap_multiple(struct image_fixture *ifix)
62774fe6c29SRuslan Bukin {
62874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
62974fe6c29SRuslan Bukin 	int status, isid;
63074fe6c29SRuslan Bukin 
63174fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
63274fe6c29SRuslan Bukin 			      0x1000ull, 1);
63374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
63474fe6c29SRuslan Bukin 
63574fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
63674fe6c29SRuslan Bukin 			      0x1010ull, 2);
63774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
63874fe6c29SRuslan Bukin 
63974fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
64074fe6c29SRuslan Bukin 			      0x1008ull, 3);
64174fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
64274fe6c29SRuslan Bukin 
64374fe6c29SRuslan Bukin 	isid = -1;
64474fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
64574fe6c29SRuslan Bukin 			       0x1007ull);
64674fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
64774fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
64874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x07);
64974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
65074fe6c29SRuslan Bukin 
65174fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
65274fe6c29SRuslan Bukin 			       0x1008ull);
65374fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
65474fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
65574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
65674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
65774fe6c29SRuslan Bukin 
65874fe6c29SRuslan Bukin 	isid = -1;
65974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
66074fe6c29SRuslan Bukin 			       0x1017ull);
66174fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
66274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
66374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0f);
66474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
66574fe6c29SRuslan Bukin 
66674fe6c29SRuslan Bukin 	isid = -1;
66774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
66874fe6c29SRuslan Bukin 			       0x1018ull);
66974fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
67074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
67174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x08);
67274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
67374fe6c29SRuslan Bukin 
67474fe6c29SRuslan Bukin 	return ptu_passed();
67574fe6c29SRuslan Bukin }
67674fe6c29SRuslan Bukin 
overlap_mid(struct image_fixture * ifix)67774fe6c29SRuslan Bukin static struct ptunit_result overlap_mid(struct image_fixture *ifix)
67874fe6c29SRuslan Bukin {
67974fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
68074fe6c29SRuslan Bukin 	int status, isid;
68174fe6c29SRuslan Bukin 
68274fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
68374fe6c29SRuslan Bukin 			      0x1000ull, 1);
68474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
68574fe6c29SRuslan Bukin 
68674fe6c29SRuslan Bukin 	ifix->section[1].size = 0x8;
68774fe6c29SRuslan Bukin 	ifix->mapping[1].size = 0x8;
68874fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
68974fe6c29SRuslan Bukin 			      0x1004ull, 2);
69074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
69174fe6c29SRuslan Bukin 
69274fe6c29SRuslan Bukin 	isid = -1;
69374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
69474fe6c29SRuslan Bukin 			       0x1003ull);
69574fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
69674fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
69774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
69874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
69974fe6c29SRuslan Bukin 
70074fe6c29SRuslan Bukin 	isid = -1;
70174fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
70274fe6c29SRuslan Bukin 			       0x1004ull);
70374fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
70474fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
70574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
70674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
70774fe6c29SRuslan Bukin 
70874fe6c29SRuslan Bukin 	isid = -1;
70974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
71074fe6c29SRuslan Bukin 			       0x100bull);
71174fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
71274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
71374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x07);
71474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
71574fe6c29SRuslan Bukin 
71674fe6c29SRuslan Bukin 	isid = -1;
71774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
71874fe6c29SRuslan Bukin 			       0x100cull);
71974fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
72074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
72174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0c);
72274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
72374fe6c29SRuslan Bukin 
72474fe6c29SRuslan Bukin 	return ptu_passed();
72574fe6c29SRuslan Bukin }
72674fe6c29SRuslan Bukin 
contained(struct image_fixture * ifix)72774fe6c29SRuslan Bukin static struct ptunit_result contained(struct image_fixture *ifix)
72874fe6c29SRuslan Bukin {
72974fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
73074fe6c29SRuslan Bukin 	int status, isid;
73174fe6c29SRuslan Bukin 
73274fe6c29SRuslan Bukin 	ifix->section[0].size = 0x8;
73374fe6c29SRuslan Bukin 	ifix->mapping[0].size = 0x8;
73474fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
73574fe6c29SRuslan Bukin 			      0x1004ull, 1);
73674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
73774fe6c29SRuslan Bukin 
73874fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
73974fe6c29SRuslan Bukin 			      0x1000ull, 2);
74074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
74174fe6c29SRuslan Bukin 
74274fe6c29SRuslan Bukin 	isid = -1;
74374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
74474fe6c29SRuslan Bukin 			       0x1008ull);
74574fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
74674fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
74774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x08);
74874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
74974fe6c29SRuslan Bukin 
75074fe6c29SRuslan Bukin 	return ptu_passed();
75174fe6c29SRuslan Bukin }
75274fe6c29SRuslan Bukin 
contained_multiple(struct image_fixture * ifix)75374fe6c29SRuslan Bukin static struct ptunit_result contained_multiple(struct image_fixture *ifix)
75474fe6c29SRuslan Bukin {
75574fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
75674fe6c29SRuslan Bukin 	int status, isid;
75774fe6c29SRuslan Bukin 
75874fe6c29SRuslan Bukin 	ifix->section[0].size = 0x2;
75974fe6c29SRuslan Bukin 	ifix->mapping[0].size = 0x2;
76074fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
76174fe6c29SRuslan Bukin 			      0x1004ull, 1);
76274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
76374fe6c29SRuslan Bukin 
76474fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
76574fe6c29SRuslan Bukin 			      0x1008ull, 2);
76674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
76774fe6c29SRuslan Bukin 
76874fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
76974fe6c29SRuslan Bukin 			      0x1000ull, 3);
77074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
77174fe6c29SRuslan Bukin 
77274fe6c29SRuslan Bukin 	isid = -1;
77374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
77474fe6c29SRuslan Bukin 			       0x1004ull);
77574fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
77674fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
77774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x04);
77874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
77974fe6c29SRuslan Bukin 
78074fe6c29SRuslan Bukin 	isid = -1;
78174fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
78274fe6c29SRuslan Bukin 			       0x1008ull);
78374fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
78474fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
78574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x08);
78674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
78774fe6c29SRuslan Bukin 
78874fe6c29SRuslan Bukin 	return ptu_passed();
78974fe6c29SRuslan Bukin }
79074fe6c29SRuslan Bukin 
contained_back(struct image_fixture * ifix)79174fe6c29SRuslan Bukin static struct ptunit_result contained_back(struct image_fixture *ifix)
79274fe6c29SRuslan Bukin {
79374fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
79474fe6c29SRuslan Bukin 	int status, isid;
79574fe6c29SRuslan Bukin 
79674fe6c29SRuslan Bukin 	ifix->section[0].size = 0x8;
79774fe6c29SRuslan Bukin 	ifix->mapping[0].size = 0x8;
79874fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
79974fe6c29SRuslan Bukin 			      0x1004ull, 1);
80074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
80174fe6c29SRuslan Bukin 
80274fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
80374fe6c29SRuslan Bukin 			      0x100cull, 2);
80474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
80574fe6c29SRuslan Bukin 
80674fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
80774fe6c29SRuslan Bukin 			      0x1000ull, 3);
80874fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
80974fe6c29SRuslan Bukin 
81074fe6c29SRuslan Bukin 	isid = -1;
81174fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
81274fe6c29SRuslan Bukin 			       0x1004ull);
81374fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
81474fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
81574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x04);
81674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
81774fe6c29SRuslan Bukin 
81874fe6c29SRuslan Bukin 	isid = -1;
81974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
82074fe6c29SRuslan Bukin 			       0x100cull);
82174fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
82274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
82374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0c);
82474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
82574fe6c29SRuslan Bukin 
82674fe6c29SRuslan Bukin 	isid = -1;
82774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
82874fe6c29SRuslan Bukin 			       0x100full);
82974fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
83074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
83174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0f);
83274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
83374fe6c29SRuslan Bukin 
83474fe6c29SRuslan Bukin 	isid = -1;
83574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
83674fe6c29SRuslan Bukin 			       0x1010ull);
83774fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
83874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
83974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x04);
84074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
84174fe6c29SRuslan Bukin 
84274fe6c29SRuslan Bukin 	return ptu_passed();
84374fe6c29SRuslan Bukin }
84474fe6c29SRuslan Bukin 
same(struct image_fixture * ifix)84574fe6c29SRuslan Bukin static struct ptunit_result same(struct image_fixture *ifix)
84674fe6c29SRuslan Bukin {
84774fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
84874fe6c29SRuslan Bukin 	int status, isid;
84974fe6c29SRuslan Bukin 
85074fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
85174fe6c29SRuslan Bukin 			      0x1000ull, 1);
85274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
85374fe6c29SRuslan Bukin 
85474fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
85574fe6c29SRuslan Bukin 			      0x1000ull, 1);
85674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
85774fe6c29SRuslan Bukin 
85874fe6c29SRuslan Bukin 	isid = -1;
85974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
86074fe6c29SRuslan Bukin 			       0x1008ull);
86174fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
86274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
86374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x08);
86474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
86574fe6c29SRuslan Bukin 
86674fe6c29SRuslan Bukin 	return ptu_passed();
86774fe6c29SRuslan Bukin }
86874fe6c29SRuslan Bukin 
same_different_isid(struct image_fixture * ifix)86974fe6c29SRuslan Bukin static struct ptunit_result same_different_isid(struct image_fixture *ifix)
87074fe6c29SRuslan Bukin {
87174fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
87274fe6c29SRuslan Bukin 	int status, isid;
87374fe6c29SRuslan Bukin 
87474fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
87574fe6c29SRuslan Bukin 			      0x1000ull, 1);
87674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
87774fe6c29SRuslan Bukin 
87874fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
87974fe6c29SRuslan Bukin 			      0x1000ull, 2);
88074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
88174fe6c29SRuslan Bukin 
88274fe6c29SRuslan Bukin 	isid = -1;
88374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
88474fe6c29SRuslan Bukin 			       0x1008ull);
88574fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
88674fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
88774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x08);
88874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
88974fe6c29SRuslan Bukin 
89074fe6c29SRuslan Bukin 	return ptu_passed();
89174fe6c29SRuslan Bukin }
89274fe6c29SRuslan Bukin 
same_different_offset(struct image_fixture * ifix)89374fe6c29SRuslan Bukin static struct ptunit_result same_different_offset(struct image_fixture *ifix)
89474fe6c29SRuslan Bukin {
89574fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc }, i;
89674fe6c29SRuslan Bukin 	int status, isid, index;
89774fe6c29SRuslan Bukin 
89874fe6c29SRuslan Bukin 	/* Add another section from a different part of the same file as an
89974fe6c29SRuslan Bukin 	 * existing section.
90074fe6c29SRuslan Bukin 	 */
90174fe6c29SRuslan Bukin 	index = ifix_add_section(ifix, ifix->section[0].filename);
90274fe6c29SRuslan Bukin 	ptu_int_gt(index, 0);
90374fe6c29SRuslan Bukin 
90474fe6c29SRuslan Bukin 	ifix->section[index].offset = ifix->section[0].offset + 0x10;
90574fe6c29SRuslan Bukin 	ptu_uint_eq(ifix->section[index].size, ifix->section[0].size);
90674fe6c29SRuslan Bukin 
90774fe6c29SRuslan Bukin 	/* Change the content of the new section so we can distinguish them. */
90874fe6c29SRuslan Bukin 	for (i = 0; i < ifix->mapping[index].size; ++i)
90974fe6c29SRuslan Bukin 		ifix->mapping[index].content[i] += 0x10;
91074fe6c29SRuslan Bukin 
91174fe6c29SRuslan Bukin 
91274fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
91374fe6c29SRuslan Bukin 			      0x1000ull, 0);
91474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
91574fe6c29SRuslan Bukin 
91674fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[index],
91774fe6c29SRuslan Bukin 			      &ifix->asid[0], 0x1000ull, 0);
91874fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
91974fe6c29SRuslan Bukin 
92074fe6c29SRuslan Bukin 	isid = -1;
92174fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
92274fe6c29SRuslan Bukin 			       0x1000ull);
92374fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
92474fe6c29SRuslan Bukin 	ptu_int_eq(isid, 0);
92574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x10);
92674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
92774fe6c29SRuslan Bukin 
92874fe6c29SRuslan Bukin 	isid = -1;
92974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
93074fe6c29SRuslan Bukin 			       0x100full);
93174fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
93274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 0);
93374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x1f);
93474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
93574fe6c29SRuslan Bukin 
93674fe6c29SRuslan Bukin 	return ptu_passed();
93774fe6c29SRuslan Bukin }
93874fe6c29SRuslan Bukin 
adjacent(struct image_fixture * ifix)93974fe6c29SRuslan Bukin static struct ptunit_result adjacent(struct image_fixture *ifix)
94074fe6c29SRuslan Bukin {
94174fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
94274fe6c29SRuslan Bukin 	int status, isid;
94374fe6c29SRuslan Bukin 
94474fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
94574fe6c29SRuslan Bukin 			      0x1000ull, 1);
94674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
94774fe6c29SRuslan Bukin 
94874fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
94974fe6c29SRuslan Bukin 			      0x1000ull - ifix->section[1].size, 2);
95074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
95174fe6c29SRuslan Bukin 
95274fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[2], &ifix->asid[0],
95374fe6c29SRuslan Bukin 			      0x1000ull + ifix->section[0].size, 3);
95474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
95574fe6c29SRuslan Bukin 
95674fe6c29SRuslan Bukin 	isid = -1;
95774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
95874fe6c29SRuslan Bukin 			       0x1000ull);
95974fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
96074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
96174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
96274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
96374fe6c29SRuslan Bukin 
96474fe6c29SRuslan Bukin 	isid = -1;
96574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
96674fe6c29SRuslan Bukin 			       0xfffull);
96774fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
96874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
96974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0],
97074fe6c29SRuslan Bukin 		    ifix->mapping[1].content[ifix->mapping[1].size - 1]);
97174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
97274fe6c29SRuslan Bukin 
97374fe6c29SRuslan Bukin 	isid = -1;
97474fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
97574fe6c29SRuslan Bukin 			       0x1000ull + ifix->section[0].size);
97674fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
97774fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
97874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
97974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
98074fe6c29SRuslan Bukin 
98174fe6c29SRuslan Bukin 	return ptu_passed();
98274fe6c29SRuslan Bukin }
98374fe6c29SRuslan Bukin 
read_null(struct image_fixture * ifix)98474fe6c29SRuslan Bukin static struct ptunit_result read_null(struct image_fixture *ifix)
98574fe6c29SRuslan Bukin {
98674fe6c29SRuslan Bukin 	uint8_t buffer;
98774fe6c29SRuslan Bukin 	int status, isid;
98874fe6c29SRuslan Bukin 
98974fe6c29SRuslan Bukin 	status = pt_image_read(NULL, &isid, &buffer, 1, &ifix->asid[0],
99074fe6c29SRuslan Bukin 			       0x1000ull);
99174fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
99274fe6c29SRuslan Bukin 
99374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, NULL, &buffer, 1, &ifix->asid[0],
99474fe6c29SRuslan Bukin 			       0x1000ull);
99574fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
99674fe6c29SRuslan Bukin 
99774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, NULL, 1, &ifix->asid[0],
99874fe6c29SRuslan Bukin 			       0x1000ull);
99974fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
100074fe6c29SRuslan Bukin 
100174fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, &buffer, 1, NULL,
100274fe6c29SRuslan Bukin 			       0x1000ull);
100374fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
100474fe6c29SRuslan Bukin 
100574fe6c29SRuslan Bukin 	return ptu_passed();
100674fe6c29SRuslan Bukin }
100774fe6c29SRuslan Bukin 
read(struct image_fixture * ifix)100874fe6c29SRuslan Bukin static struct ptunit_result read(struct image_fixture *ifix)
100974fe6c29SRuslan Bukin {
101074fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
101174fe6c29SRuslan Bukin 	int status, isid;
101274fe6c29SRuslan Bukin 
101374fe6c29SRuslan Bukin 	isid = -1;
101474fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
101574fe6c29SRuslan Bukin 			       0x2003ull);
101674fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
101774fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
101874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
101974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
102074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
102174fe6c29SRuslan Bukin 
102274fe6c29SRuslan Bukin 	return ptu_passed();
102374fe6c29SRuslan Bukin }
102474fe6c29SRuslan Bukin 
read_asid(struct image_fixture * ifix)102574fe6c29SRuslan Bukin static struct ptunit_result read_asid(struct image_fixture *ifix)
102674fe6c29SRuslan Bukin {
102774fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
102874fe6c29SRuslan Bukin 	int status, isid;
102974fe6c29SRuslan Bukin 
103074fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
103174fe6c29SRuslan Bukin 			      0x1000ull, 1);
103274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
103374fe6c29SRuslan Bukin 
103474fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[1],
103574fe6c29SRuslan Bukin 			      0x1008ull, 2);
103674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
103774fe6c29SRuslan Bukin 
103874fe6c29SRuslan Bukin 	isid = -1;
103974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
104074fe6c29SRuslan Bukin 			       0x1009ull);
104174fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
104274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
104374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x09);
104474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
104574fe6c29SRuslan Bukin 
104674fe6c29SRuslan Bukin 	isid = -1;
104774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[1],
104874fe6c29SRuslan Bukin 			       0x1009ull);
104974fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
105074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
105174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
105274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
105374fe6c29SRuslan Bukin 
105474fe6c29SRuslan Bukin 	return ptu_passed();
105574fe6c29SRuslan Bukin }
105674fe6c29SRuslan Bukin 
read_bad_asid(struct image_fixture * ifix)105774fe6c29SRuslan Bukin static struct ptunit_result read_bad_asid(struct image_fixture *ifix)
105874fe6c29SRuslan Bukin {
105974fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
106074fe6c29SRuslan Bukin 	int status, isid;
106174fe6c29SRuslan Bukin 
106274fe6c29SRuslan Bukin 	isid = -1;
106374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
106474fe6c29SRuslan Bukin 			       &ifix->asid[0], 0x2003ull);
106574fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
106674fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
106774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
106874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
106974fe6c29SRuslan Bukin 
107074fe6c29SRuslan Bukin 	return ptu_passed();
107174fe6c29SRuslan Bukin }
107274fe6c29SRuslan Bukin 
read_null_asid(struct image_fixture * ifix)107374fe6c29SRuslan Bukin static struct ptunit_result read_null_asid(struct image_fixture *ifix)
107474fe6c29SRuslan Bukin {
107574fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
107674fe6c29SRuslan Bukin 	int status, isid;
107774fe6c29SRuslan Bukin 
107874fe6c29SRuslan Bukin 	isid = -1;
107974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, NULL, 0x2003ull);
108074fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
108174fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
108274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
108374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
108474fe6c29SRuslan Bukin 
108574fe6c29SRuslan Bukin 	return ptu_passed();
108674fe6c29SRuslan Bukin }
108774fe6c29SRuslan Bukin 
read_callback(struct image_fixture * ifix)108874fe6c29SRuslan Bukin static struct ptunit_result read_callback(struct image_fixture *ifix)
108974fe6c29SRuslan Bukin {
109074fe6c29SRuslan Bukin 	uint8_t memory[] = { 0xdd, 0x01, 0x02, 0xdd };
109174fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
109274fe6c29SRuslan Bukin 	int status, isid;
109374fe6c29SRuslan Bukin 
109474fe6c29SRuslan Bukin 	status = pt_image_set_callback(&ifix->image, image_readmem_callback,
109574fe6c29SRuslan Bukin 				       memory);
109674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
109774fe6c29SRuslan Bukin 
109874fe6c29SRuslan Bukin 	isid = -1;
109974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
110074fe6c29SRuslan Bukin 			       0x3001ull);
110174fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
110274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 0);
110374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
110474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
110574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
110674fe6c29SRuslan Bukin 
110774fe6c29SRuslan Bukin 	return ptu_passed();
110874fe6c29SRuslan Bukin }
110974fe6c29SRuslan Bukin 
read_nomem(struct image_fixture * ifix)111074fe6c29SRuslan Bukin static struct ptunit_result read_nomem(struct image_fixture *ifix)
111174fe6c29SRuslan Bukin {
111274fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
111374fe6c29SRuslan Bukin 	int status, isid;
111474fe6c29SRuslan Bukin 
111574fe6c29SRuslan Bukin 	isid = -1;
111674fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
111774fe6c29SRuslan Bukin 			       &ifix->asid[1], 0x1010ull);
111874fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
111974fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
112074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
112174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
112274fe6c29SRuslan Bukin 
112374fe6c29SRuslan Bukin 	return ptu_passed();
112474fe6c29SRuslan Bukin }
112574fe6c29SRuslan Bukin 
read_truncated(struct image_fixture * ifix)112674fe6c29SRuslan Bukin static struct ptunit_result read_truncated(struct image_fixture *ifix)
112774fe6c29SRuslan Bukin {
112874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
112974fe6c29SRuslan Bukin 	int status, isid;
113074fe6c29SRuslan Bukin 
113174fe6c29SRuslan Bukin 	isid = -1;
113274fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
113374fe6c29SRuslan Bukin 			       &ifix->asid[0], 0x100full);
113474fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
113574fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
113674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0f);
113774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
113874fe6c29SRuslan Bukin 
113974fe6c29SRuslan Bukin 	return ptu_passed();
114074fe6c29SRuslan Bukin }
114174fe6c29SRuslan Bukin 
read_error(struct image_fixture * ifix)114274fe6c29SRuslan Bukin static struct ptunit_result read_error(struct image_fixture *ifix)
114374fe6c29SRuslan Bukin {
114474fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc };
114574fe6c29SRuslan Bukin 	int status, isid;
114674fe6c29SRuslan Bukin 
114774fe6c29SRuslan Bukin 	ifix->mapping[0].errcode = -pte_nosync;
114874fe6c29SRuslan Bukin 
114974fe6c29SRuslan Bukin 	isid = -1;
115074fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
115174fe6c29SRuslan Bukin 			       0x1000ull);
115274fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nosync);
115374fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
115474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
115574fe6c29SRuslan Bukin 
115674fe6c29SRuslan Bukin 	return ptu_passed();
115774fe6c29SRuslan Bukin }
115874fe6c29SRuslan Bukin 
read_spurious_error(struct image_fixture * ifix)115974fe6c29SRuslan Bukin static struct ptunit_result read_spurious_error(struct image_fixture *ifix)
116074fe6c29SRuslan Bukin {
116174fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
116274fe6c29SRuslan Bukin 	int status, isid;
116374fe6c29SRuslan Bukin 
116474fe6c29SRuslan Bukin 	isid = -1;
116574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
116674fe6c29SRuslan Bukin 			       0x1000ull);
116774fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
116874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
116974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
117074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
117174fe6c29SRuslan Bukin 
117274fe6c29SRuslan Bukin 	ifix->mapping[0].errcode = -pte_nosync;
117374fe6c29SRuslan Bukin 
117474fe6c29SRuslan Bukin 	isid = -1;
117574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
117674fe6c29SRuslan Bukin 			       0x1005ull);
117774fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nosync);
117874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
117974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
118074fe6c29SRuslan Bukin 
118174fe6c29SRuslan Bukin 	return ptu_passed();
118274fe6c29SRuslan Bukin }
118374fe6c29SRuslan Bukin 
remove_section(struct image_fixture * ifix)118474fe6c29SRuslan Bukin static struct ptunit_result remove_section(struct image_fixture *ifix)
118574fe6c29SRuslan Bukin {
118674fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
118774fe6c29SRuslan Bukin 	int status, isid;
118874fe6c29SRuslan Bukin 
118974fe6c29SRuslan Bukin 	isid = -1;
119074fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
119174fe6c29SRuslan Bukin 			       0x1001ull);
119274fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
119374fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
119474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
119574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
119674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
119774fe6c29SRuslan Bukin 
119874fe6c29SRuslan Bukin 	status = pt_image_remove(&ifix->image, &ifix->section[0],
119974fe6c29SRuslan Bukin 				 &ifix->asid[0], 0x1000ull);
120074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
120174fe6c29SRuslan Bukin 
120274fe6c29SRuslan Bukin 	ptu_int_ne(ifix->status[0].deleted, 0);
120374fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[1].deleted, 0);
120474fe6c29SRuslan Bukin 
120574fe6c29SRuslan Bukin 	isid = -1;
120674fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
120774fe6c29SRuslan Bukin 			       &ifix->asid[0], 0x1003ull);
120874fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
120974fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
121074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
121174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
121274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
121374fe6c29SRuslan Bukin 
121474fe6c29SRuslan Bukin 	isid = -1;
121574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
121674fe6c29SRuslan Bukin 			       0x2003ull);
121774fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
121874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
121974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
122074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
122174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
122274fe6c29SRuslan Bukin 
122374fe6c29SRuslan Bukin 	return ptu_passed();
122474fe6c29SRuslan Bukin }
122574fe6c29SRuslan Bukin 
remove_bad_vaddr(struct image_fixture * ifix)122674fe6c29SRuslan Bukin static struct ptunit_result remove_bad_vaddr(struct image_fixture *ifix)
122774fe6c29SRuslan Bukin {
122874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
122974fe6c29SRuslan Bukin 	int status, isid;
123074fe6c29SRuslan Bukin 
123174fe6c29SRuslan Bukin 	isid = -1;
123274fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
123374fe6c29SRuslan Bukin 			       0x1001ull);
123474fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
123574fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
123674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
123774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
123874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
123974fe6c29SRuslan Bukin 
124074fe6c29SRuslan Bukin 	status = pt_image_remove(&ifix->image, &ifix->section[0],
124174fe6c29SRuslan Bukin 				 &ifix->asid[0], 0x2000ull);
124274fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_bad_image);
124374fe6c29SRuslan Bukin 
124474fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[0].deleted, 0);
124574fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[1].deleted, 0);
124674fe6c29SRuslan Bukin 
124774fe6c29SRuslan Bukin 	isid = -1;
124874fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
124974fe6c29SRuslan Bukin 			       0x1003ull);
125074fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
125174fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
125274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
125374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
125474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
125574fe6c29SRuslan Bukin 
125674fe6c29SRuslan Bukin 	isid = -1;
125774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
125874fe6c29SRuslan Bukin 			       0x2005ull);
125974fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
126074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
126174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x05);
126274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x06);
126374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
126474fe6c29SRuslan Bukin 
126574fe6c29SRuslan Bukin 	return ptu_passed();
126674fe6c29SRuslan Bukin }
126774fe6c29SRuslan Bukin 
remove_bad_asid(struct image_fixture * ifix)126874fe6c29SRuslan Bukin static struct ptunit_result remove_bad_asid(struct image_fixture *ifix)
126974fe6c29SRuslan Bukin {
127074fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
127174fe6c29SRuslan Bukin 	int status, isid;
127274fe6c29SRuslan Bukin 
127374fe6c29SRuslan Bukin 	isid = -1;
127474fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
127574fe6c29SRuslan Bukin 			       0x1001ull);
127674fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
127774fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
127874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
127974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
128074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
128174fe6c29SRuslan Bukin 
128274fe6c29SRuslan Bukin 	status = pt_image_remove(&ifix->image, &ifix->section[0],
128374fe6c29SRuslan Bukin 				 &ifix->asid[1], 0x1000ull);
128474fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_bad_image);
128574fe6c29SRuslan Bukin 
128674fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[0].deleted, 0);
128774fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[1].deleted, 0);
128874fe6c29SRuslan Bukin 
128974fe6c29SRuslan Bukin 	isid = -1;
129074fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
129174fe6c29SRuslan Bukin 			       0x1003ull);
129274fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
129374fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
129474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
129574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
129674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
129774fe6c29SRuslan Bukin 
129874fe6c29SRuslan Bukin 	isid = -1;
129974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
130074fe6c29SRuslan Bukin 			       0x2005ull);
130174fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
130274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
130374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x05);
130474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x06);
130574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
130674fe6c29SRuslan Bukin 
130774fe6c29SRuslan Bukin 	return ptu_passed();
130874fe6c29SRuslan Bukin }
130974fe6c29SRuslan Bukin 
remove_by_filename(struct image_fixture * ifix)131074fe6c29SRuslan Bukin static struct ptunit_result remove_by_filename(struct image_fixture *ifix)
131174fe6c29SRuslan Bukin {
131274fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
131374fe6c29SRuslan Bukin 	int status, isid;
131474fe6c29SRuslan Bukin 
131574fe6c29SRuslan Bukin 	isid = -1;
131674fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
131774fe6c29SRuslan Bukin 			       0x1001ull);
131874fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
131974fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
132074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
132174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
132274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
132374fe6c29SRuslan Bukin 
132474fe6c29SRuslan Bukin 	status = pt_image_remove_by_filename(&ifix->image,
132574fe6c29SRuslan Bukin 					     ifix->section[0].filename,
132674fe6c29SRuslan Bukin 					     &ifix->asid[0]);
132774fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
132874fe6c29SRuslan Bukin 
132974fe6c29SRuslan Bukin 	ptu_int_ne(ifix->status[0].deleted, 0);
133074fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[1].deleted, 0);
133174fe6c29SRuslan Bukin 
133274fe6c29SRuslan Bukin 	isid = -1;
133374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
133474fe6c29SRuslan Bukin 			       &ifix->asid[0], 0x1003ull);
133574fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
133674fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
133774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
133874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
133974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
134074fe6c29SRuslan Bukin 
134174fe6c29SRuslan Bukin 	isid = -1;
134274fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
134374fe6c29SRuslan Bukin 			       0x2003ull);
134474fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
134574fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
134674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
134774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
134874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
134974fe6c29SRuslan Bukin 
135074fe6c29SRuslan Bukin 	return ptu_passed();
135174fe6c29SRuslan Bukin }
135274fe6c29SRuslan Bukin 
135374fe6c29SRuslan Bukin static struct ptunit_result
remove_by_filename_bad_asid(struct image_fixture * ifix)135474fe6c29SRuslan Bukin remove_by_filename_bad_asid(struct image_fixture *ifix)
135574fe6c29SRuslan Bukin {
135674fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
135774fe6c29SRuslan Bukin 	int status, isid;
135874fe6c29SRuslan Bukin 
135974fe6c29SRuslan Bukin 	isid = -1;
136074fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
136174fe6c29SRuslan Bukin 			       0x1001ull);
136274fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
136374fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
136474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
136574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
136674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
136774fe6c29SRuslan Bukin 
136874fe6c29SRuslan Bukin 	status = pt_image_remove_by_filename(&ifix->image,
136974fe6c29SRuslan Bukin 					     ifix->section[0].filename,
137074fe6c29SRuslan Bukin 					     &ifix->asid[1]);
137174fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
137274fe6c29SRuslan Bukin 
137374fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[0].deleted, 0);
137474fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[1].deleted, 0);
137574fe6c29SRuslan Bukin 
137674fe6c29SRuslan Bukin 	isid = -1;
137774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
137874fe6c29SRuslan Bukin 			       0x1003ull);
137974fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
138074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
138174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
138274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
138374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
138474fe6c29SRuslan Bukin 
138574fe6c29SRuslan Bukin 	isid = -1;
138674fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
138774fe6c29SRuslan Bukin 			       0x2005ull);
138874fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
138974fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
139074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x05);
139174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x06);
139274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
139374fe6c29SRuslan Bukin 
139474fe6c29SRuslan Bukin 	return ptu_passed();
139574fe6c29SRuslan Bukin }
139674fe6c29SRuslan Bukin 
remove_none_by_filename(struct image_fixture * ifix)139774fe6c29SRuslan Bukin static struct ptunit_result remove_none_by_filename(struct image_fixture *ifix)
139874fe6c29SRuslan Bukin {
139974fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
140074fe6c29SRuslan Bukin 	int status, isid;
140174fe6c29SRuslan Bukin 
140274fe6c29SRuslan Bukin 	status = pt_image_remove_by_filename(&ifix->image, "bad-name",
140374fe6c29SRuslan Bukin 					     &ifix->asid[0]);
140474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
140574fe6c29SRuslan Bukin 
140674fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[0].deleted, 0);
140774fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[1].deleted, 0);
140874fe6c29SRuslan Bukin 
140974fe6c29SRuslan Bukin 	isid = -1;
141074fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
141174fe6c29SRuslan Bukin 			       0x1003ull);
141274fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
141374fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
141474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
141574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
141674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
141774fe6c29SRuslan Bukin 
141874fe6c29SRuslan Bukin 	isid = -1;
141974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
142074fe6c29SRuslan Bukin 			       0x2001ull);
142174fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
142274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
142374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
142474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
142574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
142674fe6c29SRuslan Bukin 
142774fe6c29SRuslan Bukin 	return ptu_passed();
142874fe6c29SRuslan Bukin }
142974fe6c29SRuslan Bukin 
remove_all_by_filename(struct image_fixture * ifix)143074fe6c29SRuslan Bukin static struct ptunit_result remove_all_by_filename(struct image_fixture *ifix)
143174fe6c29SRuslan Bukin {
143274fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
143374fe6c29SRuslan Bukin 	int status, isid;
143474fe6c29SRuslan Bukin 
143574fe6c29SRuslan Bukin 	ifix->section[0].filename = "same-name";
143674fe6c29SRuslan Bukin 	ifix->section[1].filename = "same-name";
143774fe6c29SRuslan Bukin 
143874fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
143974fe6c29SRuslan Bukin 			      0x1000ull, 1);
144074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
144174fe6c29SRuslan Bukin 
144274fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
144374fe6c29SRuslan Bukin 			      0x2000ull, 2);
144474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
144574fe6c29SRuslan Bukin 
144674fe6c29SRuslan Bukin 	isid = -1;
144774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
144874fe6c29SRuslan Bukin 			       0x1001ull);
144974fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
145074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
145174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
145274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
145374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
145474fe6c29SRuslan Bukin 
145574fe6c29SRuslan Bukin 	status = pt_image_remove_by_filename(&ifix->image, "same-name",
145674fe6c29SRuslan Bukin 					     &ifix->asid[0]);
145774fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
145874fe6c29SRuslan Bukin 
145974fe6c29SRuslan Bukin 	ptu_int_ne(ifix->status[0].deleted, 0);
146074fe6c29SRuslan Bukin 	ptu_int_ne(ifix->status[1].deleted, 0);
146174fe6c29SRuslan Bukin 
146274fe6c29SRuslan Bukin 	isid = -1;
146374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
146474fe6c29SRuslan Bukin 			       &ifix->asid[0], 0x1003ull);
146574fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
146674fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
146774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
146874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
146974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
147074fe6c29SRuslan Bukin 
147174fe6c29SRuslan Bukin 	isid = -1;
147274fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
147374fe6c29SRuslan Bukin 			       &ifix->asid[0], 0x2003ull);
147474fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
147574fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
147674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
147774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
147874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
147974fe6c29SRuslan Bukin 
148074fe6c29SRuslan Bukin 	return ptu_passed();
148174fe6c29SRuslan Bukin }
148274fe6c29SRuslan Bukin 
remove_by_asid(struct image_fixture * ifix)148374fe6c29SRuslan Bukin static struct ptunit_result remove_by_asid(struct image_fixture *ifix)
148474fe6c29SRuslan Bukin {
148574fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
148674fe6c29SRuslan Bukin 	int status, isid;
148774fe6c29SRuslan Bukin 
148874fe6c29SRuslan Bukin 	isid = -1;
148974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
149074fe6c29SRuslan Bukin 			       0x1001ull);
149174fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
149274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 10);
149374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
149474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
149574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
149674fe6c29SRuslan Bukin 
149774fe6c29SRuslan Bukin 	status = pt_image_remove_by_asid(&ifix->image, &ifix->asid[0]);
149874fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
149974fe6c29SRuslan Bukin 
150074fe6c29SRuslan Bukin 	ptu_int_ne(ifix->status[0].deleted, 0);
150174fe6c29SRuslan Bukin 	ptu_int_eq(ifix->status[1].deleted, 0);
150274fe6c29SRuslan Bukin 
150374fe6c29SRuslan Bukin 	isid = -1;
150474fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
150574fe6c29SRuslan Bukin 			       &ifix->asid[0], 0x1003ull);
150674fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
150774fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
150874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
150974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x02);
151074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
151174fe6c29SRuslan Bukin 
151274fe6c29SRuslan Bukin 	isid = -1;
151374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
151474fe6c29SRuslan Bukin 			       0x2003ull);
151574fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
151674fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
151774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
151874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
151974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
152074fe6c29SRuslan Bukin 
152174fe6c29SRuslan Bukin 	return ptu_passed();
152274fe6c29SRuslan Bukin }
152374fe6c29SRuslan Bukin 
copy_empty(struct image_fixture * ifix)152474fe6c29SRuslan Bukin static struct ptunit_result copy_empty(struct image_fixture *ifix)
152574fe6c29SRuslan Bukin {
152674fe6c29SRuslan Bukin 	struct pt_asid asid;
152774fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
152874fe6c29SRuslan Bukin 	int status, isid;
152974fe6c29SRuslan Bukin 
153074fe6c29SRuslan Bukin 	pt_asid_init(&asid);
153174fe6c29SRuslan Bukin 
153274fe6c29SRuslan Bukin 	status = pt_image_copy(&ifix->copy, &ifix->image);
153374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
153474fe6c29SRuslan Bukin 
153574fe6c29SRuslan Bukin 	isid = -1;
153674fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, sizeof(buffer),
153774fe6c29SRuslan Bukin 			       &asid, 0x1000ull);
153874fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
153974fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
154074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0xcc);
154174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
154274fe6c29SRuslan Bukin 
154374fe6c29SRuslan Bukin 	return ptu_passed();
154474fe6c29SRuslan Bukin }
154574fe6c29SRuslan Bukin 
copy(struct image_fixture * ifix)154674fe6c29SRuslan Bukin static struct ptunit_result copy(struct image_fixture *ifix)
154774fe6c29SRuslan Bukin {
154874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
154974fe6c29SRuslan Bukin 	int status, isid;
155074fe6c29SRuslan Bukin 
155174fe6c29SRuslan Bukin 	status = pt_image_copy(&ifix->copy, &ifix->image);
155274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
155374fe6c29SRuslan Bukin 
155474fe6c29SRuslan Bukin 	isid = -1;
155574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 2, &ifix->asid[1],
155674fe6c29SRuslan Bukin 			       0x2003ull);
155774fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
155874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
155974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
156074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
156174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
156274fe6c29SRuslan Bukin 
156374fe6c29SRuslan Bukin 	return ptu_passed();
156474fe6c29SRuslan Bukin }
156574fe6c29SRuslan Bukin 
copy_self(struct image_fixture * ifix)156674fe6c29SRuslan Bukin static struct ptunit_result copy_self(struct image_fixture *ifix)
156774fe6c29SRuslan Bukin {
156874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
156974fe6c29SRuslan Bukin 	int status, isid;
157074fe6c29SRuslan Bukin 
157174fe6c29SRuslan Bukin 	status = pt_image_copy(&ifix->image, &ifix->image);
157274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
157374fe6c29SRuslan Bukin 
157474fe6c29SRuslan Bukin 	isid = -1;
157574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
157674fe6c29SRuslan Bukin 			       0x2003ull);
157774fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
157874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
157974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
158074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
158174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
158274fe6c29SRuslan Bukin 
158374fe6c29SRuslan Bukin 	return ptu_passed();
158474fe6c29SRuslan Bukin }
158574fe6c29SRuslan Bukin 
copy_shrink(struct image_fixture * ifix)158674fe6c29SRuslan Bukin static struct ptunit_result copy_shrink(struct image_fixture *ifix)
158774fe6c29SRuslan Bukin {
158874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
158974fe6c29SRuslan Bukin 	int status, isid;
159074fe6c29SRuslan Bukin 
159174fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->copy, &ifix->section[1], &ifix->asid[1],
159274fe6c29SRuslan Bukin 			      0x2000ull, 1);
159374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
159474fe6c29SRuslan Bukin 
159574fe6c29SRuslan Bukin 	status = pt_image_copy(&ifix->copy, &ifix->image);
159674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
159774fe6c29SRuslan Bukin 
159874fe6c29SRuslan Bukin 	isid = -1;
159974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 2, &ifix->asid[1],
160074fe6c29SRuslan Bukin 			       0x2003ull);
160174fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
160274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 11);
160374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
160474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
160574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
160674fe6c29SRuslan Bukin 
160774fe6c29SRuslan Bukin 	return ptu_passed();
160874fe6c29SRuslan Bukin }
160974fe6c29SRuslan Bukin 
copy_split(struct image_fixture * ifix)161074fe6c29SRuslan Bukin static struct ptunit_result copy_split(struct image_fixture *ifix)
161174fe6c29SRuslan Bukin {
161274fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
161374fe6c29SRuslan Bukin 	int status, isid;
161474fe6c29SRuslan Bukin 
161574fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->copy, &ifix->section[0], &ifix->asid[0],
161674fe6c29SRuslan Bukin 			      0x2000ull, 1);
161774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
161874fe6c29SRuslan Bukin 
161974fe6c29SRuslan Bukin 	ifix->section[1].size = 0x7;
162074fe6c29SRuslan Bukin 	ifix->mapping[1].size = 0x7;
162174fe6c29SRuslan Bukin 
162274fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
162374fe6c29SRuslan Bukin 			      0x2001ull, 2);
162474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
162574fe6c29SRuslan Bukin 
162674fe6c29SRuslan Bukin 	ifix->section[2].size = 0x8;
162774fe6c29SRuslan Bukin 	ifix->mapping[2].size = 0x8;
162874fe6c29SRuslan Bukin 
162974fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[2], &ifix->asid[0],
163074fe6c29SRuslan Bukin 			      0x2008ull, 3);
163174fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
163274fe6c29SRuslan Bukin 
163374fe6c29SRuslan Bukin 	status = pt_image_copy(&ifix->copy, &ifix->image);
163474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
163574fe6c29SRuslan Bukin 
163674fe6c29SRuslan Bukin 	isid = -1;
163774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
163874fe6c29SRuslan Bukin 			       0x2003ull);
163974fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
164074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
164174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x02);
164274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
164374fe6c29SRuslan Bukin 
164474fe6c29SRuslan Bukin 	isid = -1;
164574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
164674fe6c29SRuslan Bukin 			       0x2009ull);
164774fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
164874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
164974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x01);
165074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
165174fe6c29SRuslan Bukin 
165274fe6c29SRuslan Bukin 	isid = -1;
165374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
165474fe6c29SRuslan Bukin 			       0x2000ull);
165574fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
165674fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
165774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x00);
165874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
165974fe6c29SRuslan Bukin 
166074fe6c29SRuslan Bukin 	return ptu_passed();
166174fe6c29SRuslan Bukin }
166274fe6c29SRuslan Bukin 
copy_merge(struct image_fixture * ifix)166374fe6c29SRuslan Bukin static struct ptunit_result copy_merge(struct image_fixture *ifix)
166474fe6c29SRuslan Bukin {
166574fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
166674fe6c29SRuslan Bukin 	int status, isid;
166774fe6c29SRuslan Bukin 
166874fe6c29SRuslan Bukin 	ifix->section[1].size = 0x8;
166974fe6c29SRuslan Bukin 	ifix->mapping[1].size = 0x8;
167074fe6c29SRuslan Bukin 
167174fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->copy, &ifix->section[1], &ifix->asid[0],
167274fe6c29SRuslan Bukin 			      0x2000ull, 1);
167374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
167474fe6c29SRuslan Bukin 
167574fe6c29SRuslan Bukin 	ifix->section[2].size = 0x8;
167674fe6c29SRuslan Bukin 	ifix->mapping[2].size = 0x8;
167774fe6c29SRuslan Bukin 
167874fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->copy, &ifix->section[2], &ifix->asid[0],
167974fe6c29SRuslan Bukin 			      0x2008ull, 2);
168074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
168174fe6c29SRuslan Bukin 
168274fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
168374fe6c29SRuslan Bukin 			      0x2000ull, 3);
168474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
168574fe6c29SRuslan Bukin 
168674fe6c29SRuslan Bukin 	status = pt_image_copy(&ifix->copy, &ifix->image);
168774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
168874fe6c29SRuslan Bukin 
168974fe6c29SRuslan Bukin 	isid = -1;
169074fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
169174fe6c29SRuslan Bukin 			       0x2003ull);
169274fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
169374fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
169474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
169574fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
169674fe6c29SRuslan Bukin 
169774fe6c29SRuslan Bukin 	isid = -1;
169874fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
169974fe6c29SRuslan Bukin 			       0x200aull);
170074fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
170174fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
170274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0a);
170374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
170474fe6c29SRuslan Bukin 
170574fe6c29SRuslan Bukin 	return ptu_passed();
170674fe6c29SRuslan Bukin }
170774fe6c29SRuslan Bukin 
copy_overlap(struct image_fixture * ifix)170874fe6c29SRuslan Bukin static struct ptunit_result copy_overlap(struct image_fixture *ifix)
170974fe6c29SRuslan Bukin {
171074fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc };
171174fe6c29SRuslan Bukin 	int status, isid;
171274fe6c29SRuslan Bukin 
171374fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->copy, &ifix->section[0], &ifix->asid[0],
171474fe6c29SRuslan Bukin 			      0x2000ull, 1);
171574fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
171674fe6c29SRuslan Bukin 
171774fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->copy, &ifix->section[1], &ifix->asid[0],
171874fe6c29SRuslan Bukin 			      0x2010ull, 2);
171974fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
172074fe6c29SRuslan Bukin 
172174fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[2], &ifix->asid[0],
172274fe6c29SRuslan Bukin 			      0x2008ull, 3);
172374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
172474fe6c29SRuslan Bukin 
172574fe6c29SRuslan Bukin 	status = pt_image_copy(&ifix->copy, &ifix->image);
172674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
172774fe6c29SRuslan Bukin 
172874fe6c29SRuslan Bukin 	isid = -1;
172974fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
173074fe6c29SRuslan Bukin 			       0x2003ull);
173174fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
173274fe6c29SRuslan Bukin 	ptu_int_eq(isid, 1);
173374fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
173474fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
173574fe6c29SRuslan Bukin 
173674fe6c29SRuslan Bukin 	isid = -1;
173774fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
173874fe6c29SRuslan Bukin 			       0x200aull);
173974fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
174074fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
174174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x02);
174274fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
174374fe6c29SRuslan Bukin 
174474fe6c29SRuslan Bukin 	isid = -1;
174574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
174674fe6c29SRuslan Bukin 			       0x2016ull);
174774fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
174874fe6c29SRuslan Bukin 	ptu_int_eq(isid, 3);
174974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x0e);
175074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
175174fe6c29SRuslan Bukin 
175274fe6c29SRuslan Bukin 	isid = -1;
175374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
175474fe6c29SRuslan Bukin 			       0x2019ull);
175574fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
175674fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
175774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x09);
175874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0xcc);
175974fe6c29SRuslan Bukin 
176074fe6c29SRuslan Bukin 	return ptu_passed();
176174fe6c29SRuslan Bukin }
176274fe6c29SRuslan Bukin 
copy_replace(struct image_fixture * ifix)176374fe6c29SRuslan Bukin static struct ptunit_result copy_replace(struct image_fixture *ifix)
176474fe6c29SRuslan Bukin {
176574fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
176674fe6c29SRuslan Bukin 	int status, isid;
176774fe6c29SRuslan Bukin 
176874fe6c29SRuslan Bukin 	ifix->section[0].size = 0x8;
176974fe6c29SRuslan Bukin 	ifix->mapping[0].size = 0x8;
177074fe6c29SRuslan Bukin 
177174fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->copy, &ifix->section[0], &ifix->asid[0],
177274fe6c29SRuslan Bukin 			      0x1004ull, 1);
177374fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
177474fe6c29SRuslan Bukin 
177574fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
177674fe6c29SRuslan Bukin 			      0x1000ull, 2);
177774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
177874fe6c29SRuslan Bukin 
177974fe6c29SRuslan Bukin 	status = pt_image_copy(&ifix->copy, &ifix->image);
178074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
178174fe6c29SRuslan Bukin 
178274fe6c29SRuslan Bukin 	isid = -1;
178374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->copy, &isid, buffer, 2, &ifix->asid[0],
178474fe6c29SRuslan Bukin 			       0x1003ull);
178574fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
178674fe6c29SRuslan Bukin 	ptu_int_eq(isid, 2);
178774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
178874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
178974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
179074fe6c29SRuslan Bukin 
179174fe6c29SRuslan Bukin 	return ptu_passed();
179274fe6c29SRuslan Bukin }
179374fe6c29SRuslan Bukin 
add_cached_null(void)179474fe6c29SRuslan Bukin static struct ptunit_result add_cached_null(void)
179574fe6c29SRuslan Bukin {
179674fe6c29SRuslan Bukin 	struct pt_image_section_cache iscache;
179774fe6c29SRuslan Bukin 	struct pt_image image;
179874fe6c29SRuslan Bukin 	int status;
179974fe6c29SRuslan Bukin 
180074fe6c29SRuslan Bukin 	status = pt_image_add_cached(NULL, &iscache, 0, NULL);
180174fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_invalid);
180274fe6c29SRuslan Bukin 
180374fe6c29SRuslan Bukin 	status = pt_image_add_cached(&image, NULL, 0, NULL);
180474fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_invalid);
180574fe6c29SRuslan Bukin 
180674fe6c29SRuslan Bukin 	return ptu_passed();
180774fe6c29SRuslan Bukin }
180874fe6c29SRuslan Bukin 
add_cached(struct image_fixture * ifix)180974fe6c29SRuslan Bukin static struct ptunit_result add_cached(struct image_fixture *ifix)
181074fe6c29SRuslan Bukin {
181174fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
181274fe6c29SRuslan Bukin 	int status, isid, risid;
181374fe6c29SRuslan Bukin 
181474fe6c29SRuslan Bukin 	isid = ifix_cache_section(ifix, &ifix->section[0], 0x1000ull);
181574fe6c29SRuslan Bukin 	ptu_int_gt(isid, 0);
181674fe6c29SRuslan Bukin 
181774fe6c29SRuslan Bukin 	status = pt_image_add_cached(&ifix->image, &ifix->iscache, isid,
181874fe6c29SRuslan Bukin 				      &ifix->asid[0]);
181974fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
182074fe6c29SRuslan Bukin 
182174fe6c29SRuslan Bukin 	risid = -1;
182274fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &risid, buffer, 2, &ifix->asid[0],
182374fe6c29SRuslan Bukin 			       0x1003ull);
182474fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
182574fe6c29SRuslan Bukin 	ptu_int_eq(risid, isid);
182674fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
182774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
182874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
182974fe6c29SRuslan Bukin 
183074fe6c29SRuslan Bukin 	return ptu_passed();
183174fe6c29SRuslan Bukin }
183274fe6c29SRuslan Bukin 
add_cached_null_asid(struct image_fixture * ifix)183374fe6c29SRuslan Bukin static struct ptunit_result add_cached_null_asid(struct image_fixture *ifix)
183474fe6c29SRuslan Bukin {
183574fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
183674fe6c29SRuslan Bukin 	int status, isid, risid;
183774fe6c29SRuslan Bukin 
183874fe6c29SRuslan Bukin 	isid = ifix_cache_section(ifix, &ifix->section[0], 0x1000ull);
183974fe6c29SRuslan Bukin 	ptu_int_gt(isid, 0);
184074fe6c29SRuslan Bukin 
184174fe6c29SRuslan Bukin 	status = pt_image_add_cached(&ifix->image, &ifix->iscache, isid, NULL);
184274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
184374fe6c29SRuslan Bukin 
184474fe6c29SRuslan Bukin 	risid = -1;
184574fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &risid, buffer, 2, &ifix->asid[0],
184674fe6c29SRuslan Bukin 			       0x1003ull);
184774fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
184874fe6c29SRuslan Bukin 	ptu_int_eq(risid, isid);
184974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
185074fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
185174fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
185274fe6c29SRuslan Bukin 
185374fe6c29SRuslan Bukin 	return ptu_passed();
185474fe6c29SRuslan Bukin }
185574fe6c29SRuslan Bukin 
add_cached_twice(struct image_fixture * ifix)185674fe6c29SRuslan Bukin static struct ptunit_result add_cached_twice(struct image_fixture *ifix)
185774fe6c29SRuslan Bukin {
185874fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
185974fe6c29SRuslan Bukin 	int status, isid, risid;
186074fe6c29SRuslan Bukin 
186174fe6c29SRuslan Bukin 	isid = ifix_cache_section(ifix, &ifix->section[0], 0x1000ull);
186274fe6c29SRuslan Bukin 	ptu_int_gt(isid, 0);
186374fe6c29SRuslan Bukin 
186474fe6c29SRuslan Bukin 	status = pt_image_add_cached(&ifix->image, &ifix->iscache, isid,
186574fe6c29SRuslan Bukin 				      &ifix->asid[0]);
186674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
186774fe6c29SRuslan Bukin 
186874fe6c29SRuslan Bukin 	status = pt_image_add_cached(&ifix->image, &ifix->iscache, isid,
186974fe6c29SRuslan Bukin 				      &ifix->asid[0]);
187074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
187174fe6c29SRuslan Bukin 
187274fe6c29SRuslan Bukin 	risid = -1;
187374fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &risid, buffer, 2, &ifix->asid[0],
187474fe6c29SRuslan Bukin 			       0x1003ull);
187574fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
187674fe6c29SRuslan Bukin 	ptu_int_eq(risid, isid);
187774fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[0], 0x03);
187874fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[1], 0x04);
187974fe6c29SRuslan Bukin 	ptu_uint_eq(buffer[2], 0xcc);
188074fe6c29SRuslan Bukin 
188174fe6c29SRuslan Bukin 	return ptu_passed();
188274fe6c29SRuslan Bukin }
188374fe6c29SRuslan Bukin 
add_cached_bad_isid(struct image_fixture * ifix)188474fe6c29SRuslan Bukin static struct ptunit_result add_cached_bad_isid(struct image_fixture *ifix)
188574fe6c29SRuslan Bukin {
188674fe6c29SRuslan Bukin 	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
188774fe6c29SRuslan Bukin 	int status, isid;
188874fe6c29SRuslan Bukin 
188974fe6c29SRuslan Bukin 	status = pt_image_add_cached(&ifix->image, &ifix->iscache, 1,
189074fe6c29SRuslan Bukin 				      &ifix->asid[0]);
189174fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_bad_image);
189274fe6c29SRuslan Bukin 
189374fe6c29SRuslan Bukin 	isid = -1;
189474fe6c29SRuslan Bukin 	status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
189574fe6c29SRuslan Bukin 			       0x1003ull);
189674fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
189774fe6c29SRuslan Bukin 	ptu_int_eq(isid, -1);
189874fe6c29SRuslan Bukin 
189974fe6c29SRuslan Bukin 	return ptu_passed();
190074fe6c29SRuslan Bukin }
190174fe6c29SRuslan Bukin 
find_null(struct image_fixture * ifix)190274fe6c29SRuslan Bukin static struct ptunit_result find_null(struct image_fixture *ifix)
190374fe6c29SRuslan Bukin {
190474fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
190574fe6c29SRuslan Bukin 	int status;
190674fe6c29SRuslan Bukin 
190774fe6c29SRuslan Bukin 	status = pt_image_find(NULL, &msec, &ifix->asid[0],
190874fe6c29SRuslan Bukin 			       0x1000ull);
190974fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
191074fe6c29SRuslan Bukin 
191174fe6c29SRuslan Bukin 	status = pt_image_find(&ifix->image, NULL, &ifix->asid[0],
191274fe6c29SRuslan Bukin 			       0x1000ull);
191374fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
191474fe6c29SRuslan Bukin 
191574fe6c29SRuslan Bukin 	status = pt_image_find(&ifix->image, &msec, NULL, 0x1000ull);
191674fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
191774fe6c29SRuslan Bukin 
191874fe6c29SRuslan Bukin 	return ptu_passed();
191974fe6c29SRuslan Bukin }
192074fe6c29SRuslan Bukin 
find(struct image_fixture * ifix)192174fe6c29SRuslan Bukin static struct ptunit_result find(struct image_fixture *ifix)
192274fe6c29SRuslan Bukin {
192374fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
192474fe6c29SRuslan Bukin 	int status;
192574fe6c29SRuslan Bukin 
192674fe6c29SRuslan Bukin 	status = pt_image_find(&ifix->image, &msec, &ifix->asid[1], 0x2003ull);
192774fe6c29SRuslan Bukin 	ptu_int_eq(status, 11);
192874fe6c29SRuslan Bukin 	ptu_ptr_eq(msec.section, &ifix->section[1]);
192974fe6c29SRuslan Bukin 	ptu_uint_eq(msec.vaddr, 0x2000ull);
193074fe6c29SRuslan Bukin 
193174fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
193274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
193374fe6c29SRuslan Bukin 
193474fe6c29SRuslan Bukin 	return ptu_passed();
193574fe6c29SRuslan Bukin }
193674fe6c29SRuslan Bukin 
find_asid(struct image_fixture * ifix)193774fe6c29SRuslan Bukin static struct ptunit_result find_asid(struct image_fixture *ifix)
193874fe6c29SRuslan Bukin {
193974fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
194074fe6c29SRuslan Bukin 	int status;
194174fe6c29SRuslan Bukin 
194274fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
194374fe6c29SRuslan Bukin 			      0x1000ull, 1);
194474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
194574fe6c29SRuslan Bukin 
194674fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[1],
194774fe6c29SRuslan Bukin 			      0x1008ull, 2);
194874fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
194974fe6c29SRuslan Bukin 
195074fe6c29SRuslan Bukin 	status = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1009ull);
195174fe6c29SRuslan Bukin 	ptu_int_eq(status, 1);
195274fe6c29SRuslan Bukin 	ptu_ptr_eq(msec.section, &ifix->section[0]);
195374fe6c29SRuslan Bukin 	ptu_uint_eq(msec.vaddr, 0x1000ull);
195474fe6c29SRuslan Bukin 
195574fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
195674fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
195774fe6c29SRuslan Bukin 
195874fe6c29SRuslan Bukin 	status = pt_image_find(&ifix->image, &msec, &ifix->asid[1], 0x1009ull);
195974fe6c29SRuslan Bukin 	ptu_int_eq(status, 2);
196074fe6c29SRuslan Bukin 	ptu_ptr_eq(msec.section, &ifix->section[0]);
196174fe6c29SRuslan Bukin 	ptu_uint_eq(msec.vaddr, 0x1008ull);
196274fe6c29SRuslan Bukin 
196374fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
196474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
196574fe6c29SRuslan Bukin 
196674fe6c29SRuslan Bukin 	return ptu_passed();
196774fe6c29SRuslan Bukin }
196874fe6c29SRuslan Bukin 
find_bad_asid(struct image_fixture * ifix)196974fe6c29SRuslan Bukin static struct ptunit_result find_bad_asid(struct image_fixture *ifix)
197074fe6c29SRuslan Bukin {
197174fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
197274fe6c29SRuslan Bukin 	int status;
197374fe6c29SRuslan Bukin 
197474fe6c29SRuslan Bukin 	status = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x2003ull);
197574fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
197674fe6c29SRuslan Bukin 
197774fe6c29SRuslan Bukin 	return ptu_passed();
197874fe6c29SRuslan Bukin }
197974fe6c29SRuslan Bukin 
find_nomem(struct image_fixture * ifix)198074fe6c29SRuslan Bukin static struct ptunit_result find_nomem(struct image_fixture *ifix)
198174fe6c29SRuslan Bukin {
198274fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
198374fe6c29SRuslan Bukin 	int status;
198474fe6c29SRuslan Bukin 
198574fe6c29SRuslan Bukin 	status = pt_image_find(&ifix->image, &msec, &ifix->asid[1], 0x1010ull);
198674fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
198774fe6c29SRuslan Bukin 
198874fe6c29SRuslan Bukin 	return ptu_passed();
198974fe6c29SRuslan Bukin }
199074fe6c29SRuslan Bukin 
validate_null(struct image_fixture * ifix)199174fe6c29SRuslan Bukin static struct ptunit_result validate_null(struct image_fixture *ifix)
199274fe6c29SRuslan Bukin {
199374fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
199474fe6c29SRuslan Bukin 	int status;
199574fe6c29SRuslan Bukin 
199674fe6c29SRuslan Bukin 	status = pt_image_validate(NULL, &msec, 0x1004ull, 10);
199774fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
199874fe6c29SRuslan Bukin 
199974fe6c29SRuslan Bukin 	status = pt_image_validate(&ifix->image, NULL, 0x1004ull, 10);
200074fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_internal);
200174fe6c29SRuslan Bukin 
200274fe6c29SRuslan Bukin 	return ptu_passed();
200374fe6c29SRuslan Bukin }
200474fe6c29SRuslan Bukin 
validate(struct image_fixture * ifix)200574fe6c29SRuslan Bukin static struct ptunit_result validate(struct image_fixture *ifix)
200674fe6c29SRuslan Bukin {
200774fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
200874fe6c29SRuslan Bukin 	int isid, status;
200974fe6c29SRuslan Bukin 
201074fe6c29SRuslan Bukin 	isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
201174fe6c29SRuslan Bukin 	ptu_int_ge(isid, 0);
201274fe6c29SRuslan Bukin 
201374fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
201474fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
201574fe6c29SRuslan Bukin 
201674fe6c29SRuslan Bukin 	status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
201774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
201874fe6c29SRuslan Bukin 
201974fe6c29SRuslan Bukin 	return ptu_passed();
202074fe6c29SRuslan Bukin }
202174fe6c29SRuslan Bukin 
validate_bad_asid(struct image_fixture * ifix)202274fe6c29SRuslan Bukin static struct ptunit_result validate_bad_asid(struct image_fixture *ifix)
202374fe6c29SRuslan Bukin {
202474fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
202574fe6c29SRuslan Bukin 	int isid, status;
202674fe6c29SRuslan Bukin 
202774fe6c29SRuslan Bukin 	isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
202874fe6c29SRuslan Bukin 	ptu_int_ge(isid, 0);
202974fe6c29SRuslan Bukin 
203074fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
203174fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
203274fe6c29SRuslan Bukin 
203374fe6c29SRuslan Bukin 	msec.asid = ifix->asid[1];
203474fe6c29SRuslan Bukin 
203574fe6c29SRuslan Bukin 	status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
203674fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
203774fe6c29SRuslan Bukin 
203874fe6c29SRuslan Bukin 	return ptu_passed();
203974fe6c29SRuslan Bukin }
204074fe6c29SRuslan Bukin 
validate_bad_vaddr(struct image_fixture * ifix)204174fe6c29SRuslan Bukin static struct ptunit_result validate_bad_vaddr(struct image_fixture *ifix)
204274fe6c29SRuslan Bukin {
204374fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
204474fe6c29SRuslan Bukin 	int isid, status;
204574fe6c29SRuslan Bukin 
204674fe6c29SRuslan Bukin 	isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
204774fe6c29SRuslan Bukin 	ptu_int_ge(isid, 0);
204874fe6c29SRuslan Bukin 
204974fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
205074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
205174fe6c29SRuslan Bukin 
205274fe6c29SRuslan Bukin 	msec.vaddr = 0x2000ull;
205374fe6c29SRuslan Bukin 
205474fe6c29SRuslan Bukin 	status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
205574fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
205674fe6c29SRuslan Bukin 
205774fe6c29SRuslan Bukin 	return ptu_passed();
205874fe6c29SRuslan Bukin }
205974fe6c29SRuslan Bukin 
validate_bad_offset(struct image_fixture * ifix)206074fe6c29SRuslan Bukin static struct ptunit_result validate_bad_offset(struct image_fixture *ifix)
206174fe6c29SRuslan Bukin {
206274fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
206374fe6c29SRuslan Bukin 	int isid, status;
206474fe6c29SRuslan Bukin 
206574fe6c29SRuslan Bukin 	isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
206674fe6c29SRuslan Bukin 	ptu_int_ge(isid, 0);
206774fe6c29SRuslan Bukin 
206874fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
206974fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
207074fe6c29SRuslan Bukin 
207174fe6c29SRuslan Bukin 	msec.offset = 0x8ull;
207274fe6c29SRuslan Bukin 
207374fe6c29SRuslan Bukin 	status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
207474fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
207574fe6c29SRuslan Bukin 
207674fe6c29SRuslan Bukin 	return ptu_passed();
207774fe6c29SRuslan Bukin }
207874fe6c29SRuslan Bukin 
validate_bad_size(struct image_fixture * ifix)207974fe6c29SRuslan Bukin static struct ptunit_result validate_bad_size(struct image_fixture *ifix)
208074fe6c29SRuslan Bukin {
208174fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
208274fe6c29SRuslan Bukin 	int isid, status;
208374fe6c29SRuslan Bukin 
208474fe6c29SRuslan Bukin 	isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
208574fe6c29SRuslan Bukin 	ptu_int_ge(isid, 0);
208674fe6c29SRuslan Bukin 
208774fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
208874fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
208974fe6c29SRuslan Bukin 
209074fe6c29SRuslan Bukin 	msec.size = 0x8ull;
209174fe6c29SRuslan Bukin 
209274fe6c29SRuslan Bukin 	status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
209374fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
209474fe6c29SRuslan Bukin 
209574fe6c29SRuslan Bukin 	return ptu_passed();
209674fe6c29SRuslan Bukin }
209774fe6c29SRuslan Bukin 
validate_bad_isid(struct image_fixture * ifix)209874fe6c29SRuslan Bukin static struct ptunit_result validate_bad_isid(struct image_fixture *ifix)
209974fe6c29SRuslan Bukin {
210074fe6c29SRuslan Bukin 	struct pt_mapped_section msec;
210174fe6c29SRuslan Bukin 	int isid, status;
210274fe6c29SRuslan Bukin 
210374fe6c29SRuslan Bukin 	isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
210474fe6c29SRuslan Bukin 	ptu_int_ge(isid, 0);
210574fe6c29SRuslan Bukin 
210674fe6c29SRuslan Bukin 	status = pt_section_put(msec.section);
210774fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
210874fe6c29SRuslan Bukin 
210974fe6c29SRuslan Bukin 	status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid + 1);
211074fe6c29SRuslan Bukin 	ptu_int_eq(status, -pte_nomap);
211174fe6c29SRuslan Bukin 
211274fe6c29SRuslan Bukin 	return ptu_passed();
211374fe6c29SRuslan Bukin }
211474fe6c29SRuslan Bukin 
ifix_init(struct image_fixture * ifix)211574fe6c29SRuslan Bukin static struct ptunit_result ifix_init(struct image_fixture *ifix)
211674fe6c29SRuslan Bukin {
211774fe6c29SRuslan Bukin 	int index;
211874fe6c29SRuslan Bukin 
211974fe6c29SRuslan Bukin 	pt_image_init(&ifix->image, NULL);
212074fe6c29SRuslan Bukin 	pt_image_init(&ifix->copy, NULL);
212174fe6c29SRuslan Bukin 
212274fe6c29SRuslan Bukin 	memset(ifix->status, 0, sizeof(ifix->status));
212374fe6c29SRuslan Bukin 	memset(ifix->mapping, 0, sizeof(ifix->mapping));
212474fe6c29SRuslan Bukin 	memset(ifix->section, 0, sizeof(ifix->section));
212574fe6c29SRuslan Bukin 	memset(&ifix->iscache, 0, sizeof(ifix->iscache));
212674fe6c29SRuslan Bukin 
212774fe6c29SRuslan Bukin 	ifix->nsecs = 0;
212874fe6c29SRuslan Bukin 
212974fe6c29SRuslan Bukin 	index = ifix_add_section(ifix, "file-0");
213074fe6c29SRuslan Bukin 	ptu_int_eq(index, 0);
213174fe6c29SRuslan Bukin 
213274fe6c29SRuslan Bukin 	index = ifix_add_section(ifix, "file-1");
213374fe6c29SRuslan Bukin 	ptu_int_eq(index, 1);
213474fe6c29SRuslan Bukin 
213574fe6c29SRuslan Bukin 	index = ifix_add_section(ifix, "file-2");
213674fe6c29SRuslan Bukin 	ptu_int_eq(index, 2);
213774fe6c29SRuslan Bukin 
213874fe6c29SRuslan Bukin 	pt_asid_init(&ifix->asid[0]);
213974fe6c29SRuslan Bukin 	ifix->asid[0].cr3 = 0xa000;
214074fe6c29SRuslan Bukin 
214174fe6c29SRuslan Bukin 	pt_asid_init(&ifix->asid[1]);
214274fe6c29SRuslan Bukin 	ifix->asid[1].cr3 = 0xb000;
214374fe6c29SRuslan Bukin 
214474fe6c29SRuslan Bukin 	pt_asid_init(&ifix->asid[2]);
214574fe6c29SRuslan Bukin 	ifix->asid[2].cr3 = 0xc000;
214674fe6c29SRuslan Bukin 
214774fe6c29SRuslan Bukin 	return ptu_passed();
214874fe6c29SRuslan Bukin }
214974fe6c29SRuslan Bukin 
rfix_init(struct image_fixture * ifix)215074fe6c29SRuslan Bukin static struct ptunit_result rfix_init(struct image_fixture *ifix)
215174fe6c29SRuslan Bukin {
215274fe6c29SRuslan Bukin 	int status;
215374fe6c29SRuslan Bukin 
215474fe6c29SRuslan Bukin 	ptu_check(ifix_init, ifix);
215574fe6c29SRuslan Bukin 
215674fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
215774fe6c29SRuslan Bukin 			      0x1000ull, 10);
215874fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
215974fe6c29SRuslan Bukin 
216074fe6c29SRuslan Bukin 	status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[1],
216174fe6c29SRuslan Bukin 			      0x2000ull, 11);
216274fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
216374fe6c29SRuslan Bukin 
216474fe6c29SRuslan Bukin 	return ptu_passed();
216574fe6c29SRuslan Bukin }
216674fe6c29SRuslan Bukin 
dfix_fini(struct image_fixture * ifix)216774fe6c29SRuslan Bukin static struct ptunit_result dfix_fini(struct image_fixture *ifix)
216874fe6c29SRuslan Bukin {
216974fe6c29SRuslan Bukin 	pt_image_fini(&ifix->image);
217074fe6c29SRuslan Bukin 
217174fe6c29SRuslan Bukin 	return ptu_passed();
217274fe6c29SRuslan Bukin }
217374fe6c29SRuslan Bukin 
ifix_fini(struct image_fixture * ifix)217474fe6c29SRuslan Bukin static struct ptunit_result ifix_fini(struct image_fixture *ifix)
217574fe6c29SRuslan Bukin {
217674fe6c29SRuslan Bukin 	int sec;
217774fe6c29SRuslan Bukin 
217874fe6c29SRuslan Bukin 	ptu_check(dfix_fini, ifix);
217974fe6c29SRuslan Bukin 
218074fe6c29SRuslan Bukin 	pt_image_fini(&ifix->copy);
218174fe6c29SRuslan Bukin 
218274fe6c29SRuslan Bukin 	for (sec = 0; sec < ifix_nsecs; ++sec) {
218374fe6c29SRuslan Bukin 		ptu_int_eq(ifix->section[sec].ucount, 0);
218474fe6c29SRuslan Bukin 		ptu_int_eq(ifix->section[sec].mcount, 0);
218574fe6c29SRuslan Bukin 		ptu_int_le(ifix->status[sec].deleted, 1);
218674fe6c29SRuslan Bukin 		ptu_int_eq(ifix->status[sec].bad_put, 0);
218774fe6c29SRuslan Bukin 	}
218874fe6c29SRuslan Bukin 
218974fe6c29SRuslan Bukin 	return ptu_passed();
219074fe6c29SRuslan Bukin }
219174fe6c29SRuslan Bukin 
main(int argc,char ** argv)219274fe6c29SRuslan Bukin int main(int argc, char **argv)
219374fe6c29SRuslan Bukin {
219474fe6c29SRuslan Bukin 	struct image_fixture dfix, ifix, rfix;
219574fe6c29SRuslan Bukin 	struct ptunit_suite suite;
219674fe6c29SRuslan Bukin 
219774fe6c29SRuslan Bukin 	/* Dfix provides image destruction. */
219874fe6c29SRuslan Bukin 	dfix.init = NULL;
219974fe6c29SRuslan Bukin 	dfix.fini = dfix_fini;
220074fe6c29SRuslan Bukin 
220174fe6c29SRuslan Bukin 	/* Ifix provides an empty image. */
220274fe6c29SRuslan Bukin 	ifix.init = ifix_init;
220374fe6c29SRuslan Bukin 	ifix.fini = ifix_fini;
220474fe6c29SRuslan Bukin 
220574fe6c29SRuslan Bukin 	/* Rfix provides an image with two sections added. */
220674fe6c29SRuslan Bukin 	rfix.init = rfix_init;
220774fe6c29SRuslan Bukin 	rfix.fini = ifix_fini;
220874fe6c29SRuslan Bukin 
220974fe6c29SRuslan Bukin 	suite = ptunit_mk_suite(argc, argv);
221074fe6c29SRuslan Bukin 
221174fe6c29SRuslan Bukin 	ptu_run(suite, init);
221274fe6c29SRuslan Bukin 	ptu_run_f(suite, init_name, dfix);
221374fe6c29SRuslan Bukin 	ptu_run(suite, init_null);
221474fe6c29SRuslan Bukin 
221574fe6c29SRuslan Bukin 	ptu_run(suite, fini);
221674fe6c29SRuslan Bukin 	ptu_run(suite, fini_empty);
221774fe6c29SRuslan Bukin 	ptu_run(suite, fini_null);
221874fe6c29SRuslan Bukin 
221974fe6c29SRuslan Bukin 	ptu_run_f(suite, name, dfix);
222074fe6c29SRuslan Bukin 	ptu_run(suite, name_none);
222174fe6c29SRuslan Bukin 	ptu_run(suite, name_null);
222274fe6c29SRuslan Bukin 
222374fe6c29SRuslan Bukin 	ptu_run_f(suite, read_empty, ifix);
222474fe6c29SRuslan Bukin 	ptu_run_f(suite, overlap_front, ifix);
222574fe6c29SRuslan Bukin 	ptu_run_f(suite, overlap_back, ifix);
222674fe6c29SRuslan Bukin 	ptu_run_f(suite, overlap_multiple, ifix);
222774fe6c29SRuslan Bukin 	ptu_run_f(suite, overlap_mid, ifix);
222874fe6c29SRuslan Bukin 	ptu_run_f(suite, contained, ifix);
222974fe6c29SRuslan Bukin 	ptu_run_f(suite, contained_multiple, ifix);
223074fe6c29SRuslan Bukin 	ptu_run_f(suite, contained_back, ifix);
223174fe6c29SRuslan Bukin 	ptu_run_f(suite, same, ifix);
223274fe6c29SRuslan Bukin 	ptu_run_f(suite, same_different_isid, ifix);
223374fe6c29SRuslan Bukin 	ptu_run_f(suite, same_different_offset, ifix);
223474fe6c29SRuslan Bukin 	ptu_run_f(suite, adjacent, ifix);
223574fe6c29SRuslan Bukin 
223674fe6c29SRuslan Bukin 	ptu_run_f(suite, read_null, rfix);
223774fe6c29SRuslan Bukin 	ptu_run_f(suite, read, rfix);
223874fe6c29SRuslan Bukin 	ptu_run_f(suite, read_null, rfix);
223974fe6c29SRuslan Bukin 	ptu_run_f(suite, read_asid, ifix);
224074fe6c29SRuslan Bukin 	ptu_run_f(suite, read_bad_asid, rfix);
224174fe6c29SRuslan Bukin 	ptu_run_f(suite, read_null_asid, rfix);
224274fe6c29SRuslan Bukin 	ptu_run_f(suite, read_callback, rfix);
224374fe6c29SRuslan Bukin 	ptu_run_f(suite, read_nomem, rfix);
224474fe6c29SRuslan Bukin 	ptu_run_f(suite, read_truncated, rfix);
224574fe6c29SRuslan Bukin 	ptu_run_f(suite, read_error, rfix);
224674fe6c29SRuslan Bukin 	ptu_run_f(suite, read_spurious_error, rfix);
224774fe6c29SRuslan Bukin 
224874fe6c29SRuslan Bukin 	ptu_run_f(suite, remove_section, rfix);
224974fe6c29SRuslan Bukin 	ptu_run_f(suite, remove_bad_vaddr, rfix);
225074fe6c29SRuslan Bukin 	ptu_run_f(suite, remove_bad_asid, rfix);
225174fe6c29SRuslan Bukin 	ptu_run_f(suite, remove_by_filename, rfix);
225274fe6c29SRuslan Bukin 	ptu_run_f(suite, remove_by_filename_bad_asid, rfix);
225374fe6c29SRuslan Bukin 	ptu_run_f(suite, remove_none_by_filename, rfix);
225474fe6c29SRuslan Bukin 	ptu_run_f(suite, remove_all_by_filename, ifix);
225574fe6c29SRuslan Bukin 	ptu_run_f(suite, remove_by_asid, rfix);
225674fe6c29SRuslan Bukin 
225774fe6c29SRuslan Bukin 	ptu_run_f(suite, copy_empty, ifix);
225874fe6c29SRuslan Bukin 	ptu_run_f(suite, copy, rfix);
225974fe6c29SRuslan Bukin 	ptu_run_f(suite, copy_self, rfix);
226074fe6c29SRuslan Bukin 	ptu_run_f(suite, copy_shrink, rfix);
226174fe6c29SRuslan Bukin 	ptu_run_f(suite, copy_split, ifix);
226274fe6c29SRuslan Bukin 	ptu_run_f(suite, copy_merge, ifix);
226374fe6c29SRuslan Bukin 	ptu_run_f(suite, copy_overlap, ifix);
226474fe6c29SRuslan Bukin 	ptu_run_f(suite, copy_replace, ifix);
226574fe6c29SRuslan Bukin 
226674fe6c29SRuslan Bukin 	ptu_run(suite, add_cached_null);
226774fe6c29SRuslan Bukin 	ptu_run_f(suite, add_cached, ifix);
226874fe6c29SRuslan Bukin 	ptu_run_f(suite, add_cached_null_asid, ifix);
226974fe6c29SRuslan Bukin 	ptu_run_f(suite, add_cached_twice, ifix);
227074fe6c29SRuslan Bukin 	ptu_run_f(suite, add_cached_bad_isid, ifix);
227174fe6c29SRuslan Bukin 
227274fe6c29SRuslan Bukin 	ptu_run_f(suite, find_null, rfix);
227374fe6c29SRuslan Bukin 	ptu_run_f(suite, find, rfix);
227474fe6c29SRuslan Bukin 	ptu_run_f(suite, find_asid, ifix);
227574fe6c29SRuslan Bukin 	ptu_run_f(suite, find_bad_asid, rfix);
227674fe6c29SRuslan Bukin 	ptu_run_f(suite, find_nomem, rfix);
227774fe6c29SRuslan Bukin 
227874fe6c29SRuslan Bukin 	ptu_run_f(suite, validate_null, rfix);
227974fe6c29SRuslan Bukin 	ptu_run_f(suite, validate, rfix);
228074fe6c29SRuslan Bukin 	ptu_run_f(suite, validate_bad_asid, rfix);
228174fe6c29SRuslan Bukin 	ptu_run_f(suite, validate_bad_vaddr, rfix);
228274fe6c29SRuslan Bukin 	ptu_run_f(suite, validate_bad_offset, rfix);
228374fe6c29SRuslan Bukin 	ptu_run_f(suite, validate_bad_size, rfix);
228474fe6c29SRuslan Bukin 	ptu_run_f(suite, validate_bad_isid, rfix);
228574fe6c29SRuslan Bukin 
228674fe6c29SRuslan Bukin 	return ptunit_report(&suite);
228774fe6c29SRuslan Bukin }
2288