Blame libipt/test/src/ptunit-section.c

Packit b1f7ae
/*
Packit b1f7ae
 * Copyright (c) 2013-2017, Intel Corporation
Packit b1f7ae
 *
Packit b1f7ae
 * Redistribution and use in source and binary forms, with or without
Packit b1f7ae
 * modification, are permitted provided that the following conditions are met:
Packit b1f7ae
 *
Packit b1f7ae
 *  * Redistributions of source code must retain the above copyright notice,
Packit b1f7ae
 *    this list of conditions and the following disclaimer.
Packit b1f7ae
 *  * Redistributions in binary form must reproduce the above copyright notice,
Packit b1f7ae
 *    this list of conditions and the following disclaimer in the documentation
Packit b1f7ae
 *    and/or other materials provided with the distribution.
Packit b1f7ae
 *  * Neither the name of Intel Corporation nor the names of its contributors
Packit b1f7ae
 *    may be used to endorse or promote products derived from this software
Packit b1f7ae
 *    without specific prior written permission.
Packit b1f7ae
 *
Packit b1f7ae
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit b1f7ae
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit b1f7ae
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit b1f7ae
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
Packit b1f7ae
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Packit b1f7ae
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Packit b1f7ae
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Packit b1f7ae
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
Packit b1f7ae
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Packit b1f7ae
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit b1f7ae
 * POSSIBILITY OF SUCH DAMAGE.
Packit b1f7ae
 */
Packit b1f7ae
Packit b1f7ae
#include "ptunit_threads.h"
Packit b1f7ae
#include "ptunit_mkfile.h"
Packit b1f7ae
Packit b1f7ae
#include "pt_section.h"
Packit b1f7ae
#include "pt_block_cache.h"
Packit b1f7ae
Packit b1f7ae
#include "intel-pt.h"
Packit b1f7ae
Packit b1f7ae
#include <stdlib.h>
Packit b1f7ae
#include <stdio.h>
Packit b1f7ae
Packit b1f7ae
Packit b1f7ae
struct pt_block_cache *pt_bcache_alloc(uint64_t nentries)
Packit b1f7ae
{
Packit b1f7ae
	struct pt_block_cache *bcache;
Packit b1f7ae
Packit b1f7ae
	if (!nentries || (UINT32_MAX < nentries))
Packit b1f7ae
		return NULL;
Packit b1f7ae
Packit b1f7ae
	/* The cache is not really used by tests.  It suffices to allocate only
Packit b1f7ae
	 * the cache struct with the single default entry.
Packit b1f7ae
	 *
Packit b1f7ae
	 * We still set the number of entries to the requested size.
Packit b1f7ae
	 */
Packit b1f7ae
	bcache = malloc(sizeof(*bcache));
Packit b1f7ae
	if (bcache)
Packit b1f7ae
		bcache->nentries = (uint32_t) nentries;
Packit b1f7ae
Packit b1f7ae
	return bcache;
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
void pt_bcache_free(struct pt_block_cache *bcache)
Packit b1f7ae
{
Packit b1f7ae
	free(bcache);
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
/* A test fixture providing a temporary file and an initially NULL section. */
Packit b1f7ae
struct section_fixture {
Packit b1f7ae
	/* Threading support. */
Packit b1f7ae
	struct ptunit_thrd_fixture thrd;
Packit b1f7ae
Packit b1f7ae
	/* A temporary file name. */
Packit b1f7ae
	char *name;
Packit b1f7ae
Packit b1f7ae
	/* That file opened for writing. */
Packit b1f7ae
	FILE *file;
Packit b1f7ae
Packit b1f7ae
	/* The section. */
Packit b1f7ae
	struct pt_section *section;
Packit b1f7ae
Packit b1f7ae
	/* A cloned section. */
Packit b1f7ae
	struct pt_section *clone;
Packit b1f7ae
Packit b1f7ae
	/* The test fixture initialization and finalization functions. */
Packit b1f7ae
	struct ptunit_result (*init)(struct section_fixture *);
Packit b1f7ae
	struct ptunit_result (*fini)(struct section_fixture *);
Packit b1f7ae
};
Packit b1f7ae
Packit b1f7ae
enum {
Packit b1f7ae
#if defined(FEATURE_THREADS)
Packit b1f7ae
Packit b1f7ae
	num_threads	= 4,
Packit b1f7ae
Packit b1f7ae
#endif /* defined(FEATURE_THREADS) */
Packit b1f7ae
Packit b1f7ae
	num_work	= 0x4000
Packit b1f7ae
};
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result sfix_write_aux(struct section_fixture *sfix,
Packit b1f7ae
					   const uint8_t *buffer, size_t size)
Packit b1f7ae
{
Packit b1f7ae
	size_t written;
Packit b1f7ae
Packit b1f7ae
	written = fwrite(buffer, 1, size, sfix->file);
Packit b1f7ae
	ptu_uint_eq(written, size);
Packit b1f7ae
Packit b1f7ae
	fflush(sfix->file);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
#define sfix_write(sfix, buffer)				\
Packit b1f7ae
	ptu_check(sfix_write_aux, sfix, buffer, sizeof(buffer))
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result create(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	const char *name;
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
Packit b1f7ae
	uint64_t offset, size;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	name = pt_section_filename(sfix->section);
Packit b1f7ae
	ptu_str_eq(name, sfix->name);
Packit b1f7ae
Packit b1f7ae
	offset = pt_section_offset(sfix->section);
Packit b1f7ae
	ptu_uint_eq(offset, 0x1ull);
Packit b1f7ae
Packit b1f7ae
	size = pt_section_size(sfix->section);
Packit b1f7ae
	ptu_uint_eq(size, 0x3ull);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result create_bad_offset(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x10ull, 0x0ull);
Packit b1f7ae
	ptu_null(sfix->section);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result create_truncated(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	const char *name;
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
Packit b1f7ae
	uint64_t offset, size;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, UINT64_MAX);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	name = pt_section_filename(sfix->section);
Packit b1f7ae
	ptu_str_eq(name, sfix->name);
Packit b1f7ae
Packit b1f7ae
	offset = pt_section_offset(sfix->section);
Packit b1f7ae
	ptu_uint_eq(offset, 0x1ull);
Packit b1f7ae
Packit b1f7ae
	size = pt_section_size(sfix->section);
Packit b1f7ae
	ptu_uint_eq(size, sizeof(bytes) - 1);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result create_empty(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x0ull, 0x10ull);
Packit b1f7ae
	ptu_null(sfix->section);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result clone_null(void)
Packit b1f7ae
{
Packit b1f7ae
	struct pt_section *section;
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	section = NULL;
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_clone(NULL, section, 0ull, 1ull);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_clone(&section, NULL, 0ull, 1ull);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result filename_null(void)
Packit b1f7ae
{
Packit b1f7ae
	const char *name;
Packit b1f7ae
Packit b1f7ae
	name = pt_section_filename(NULL);
Packit b1f7ae
	ptu_null(name);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result size_null(void)
Packit b1f7ae
{
Packit b1f7ae
	uint64_t size;
Packit b1f7ae
Packit b1f7ae
	size = pt_section_size(NULL);
Packit b1f7ae
	ptu_uint_eq(size, 0ull);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result offset_null(void)
Packit b1f7ae
{
Packit b1f7ae
	uint64_t offset;
Packit b1f7ae
Packit b1f7ae
	offset = pt_section_offset(NULL);
Packit b1f7ae
	ptu_uint_eq(offset, 0ull);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result get_null(void)
Packit b1f7ae
{
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_get(NULL);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result put_null(void)
Packit b1f7ae
{
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_put(NULL);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result map_null(void)
Packit b1f7ae
{
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(NULL);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result unmap_null(void)
Packit b1f7ae
{
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(NULL);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result cache_null(void)
Packit b1f7ae
{
Packit b1f7ae
	struct pt_block_cache *bcache;
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(NULL);
Packit b1f7ae
	ptu_null(bcache);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result get_overflow(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	sfix->section->ucount = UINT16_MAX;
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_get(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	sfix->section->ucount = 1;
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result map_change(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_bad_image);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result map_put(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_put(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result unmap_nomap(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_nomap);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result map_overflow(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	sfix->section->mcount = UINT16_MAX;
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	sfix->section->mcount = 0;
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result get_put(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_get(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_get(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_put(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_put(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result map_unmap(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, 2);
Packit b1f7ae
	ptu_uint_eq(buffer[0], bytes[1]);
Packit b1f7ae
	ptu_uint_eq(buffer[1], bytes[2]);
Packit b1f7ae
	ptu_uint_eq(buffer[2], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_null(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	uint8_t buffer[] = { 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, NULL, 1, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, -pte_internal);
Packit b1f7ae
	ptu_uint_eq(buffer[0], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(NULL, buffer, 1, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, -pte_internal);
Packit b1f7ae
	ptu_uint_eq(buffer[0], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_offset(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 2, 0x1ull);
Packit b1f7ae
	ptu_int_eq(status, 2);
Packit b1f7ae
	ptu_uint_eq(buffer[0], bytes[2]);
Packit b1f7ae
	ptu_uint_eq(buffer[1], bytes[3]);
Packit b1f7ae
	ptu_uint_eq(buffer[2], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_truncated(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc, 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 2, 0x2ull);
Packit b1f7ae
	ptu_int_eq(status, 1);
Packit b1f7ae
	ptu_uint_eq(buffer[0], bytes[3]);
Packit b1f7ae
	ptu_uint_eq(buffer[1], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_from_truncated(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc, 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x2ull, 0x10ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 2, 0x1ull);
Packit b1f7ae
	ptu_int_eq(status, 1);
Packit b1f7ae
	ptu_uint_eq(buffer[0], bytes[3]);
Packit b1f7ae
	ptu_uint_eq(buffer[1], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_nomem(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 1, 0x3ull);
Packit b1f7ae
	ptu_int_eq(status, -pte_nomap);
Packit b1f7ae
	ptu_uint_eq(buffer[0], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_overflow(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 1,
Packit b1f7ae
				 0xffffffffffff0000ull);
Packit b1f7ae
	ptu_int_eq(status, -pte_nomap);
Packit b1f7ae
	ptu_uint_eq(buffer[0], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_overflow_32bit(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 1,
Packit b1f7ae
				 0xff00000000ull);
Packit b1f7ae
	ptu_int_eq(status, -pte_nomap);
Packit b1f7ae
	ptu_uint_eq(buffer[0], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_nomap(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 1, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, -pte_nomap);
Packit b1f7ae
	ptu_uint_eq(buffer[0], 0xcc);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result read_unmap_map(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, 2);
Packit b1f7ae
	ptu_uint_eq(buffer[0], bytes[1]);
Packit b1f7ae
	ptu_uint_eq(buffer[1], bytes[2]);
Packit b1f7ae
	ptu_uint_eq(buffer[2], 0xcc);
Packit b1f7ae
Packit b1f7ae
	memset(buffer, 0xcc, sizeof(buffer));
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, -pte_nomap);
Packit b1f7ae
	ptu_uint_eq(buffer[0], 0xcc);
Packit b1f7ae
	ptu_uint_eq(buffer[1], 0xcc);
Packit b1f7ae
	ptu_uint_eq(buffer[2], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->section, buffer, 2, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, 2);
Packit b1f7ae
	ptu_uint_eq(buffer[0], bytes[1]);
Packit b1f7ae
	ptu_uint_eq(buffer[1], bytes[2]);
Packit b1f7ae
	ptu_uint_eq(buffer[2], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result clone_bad_range(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0xcc };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x2ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_clone(&sfix->clone, sfix->section, 0x0ull, 0x2ull);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_clone(&sfix->clone, sfix->section, 0x2ull, 0x2ull);
Packit b1f7ae
	ptu_int_eq(errcode, -pte_internal);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result clone_head(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0xcc };
Packit b1f7ae
	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x2ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_clone(&sfix->clone, sfix->section, 0x1ull, 0x1ull);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->clone);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->clone, buffer, 2, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, 1);
Packit b1f7ae
	ptu_uint_eq(buffer[0], bytes[1]);
Packit b1f7ae
	ptu_uint_eq(buffer[1], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->clone);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result clone_tail(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0xcc };
Packit b1f7ae
	uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
Packit b1f7ae
	int status;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x2ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_clone(&sfix->clone, sfix->section, 0x2ull, 0x1ull);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_map(sfix->clone);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_read(sfix->clone, buffer, 2, 0x0ull);
Packit b1f7ae
	ptu_int_eq(status, 1);
Packit b1f7ae
	ptu_uint_eq(buffer[0], bytes[2]);
Packit b1f7ae
	ptu_uint_eq(buffer[1], 0xcc);
Packit b1f7ae
Packit b1f7ae
	status = pt_section_unmap(sfix->clone);
Packit b1f7ae
	ptu_int_eq(status, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static int worker(void *arg)
Packit b1f7ae
{
Packit b1f7ae
	struct section_fixture *sfix;
Packit b1f7ae
	int it, errcode;
Packit b1f7ae
Packit b1f7ae
	sfix = arg;
Packit b1f7ae
	if (!sfix)
Packit b1f7ae
		return -pte_internal;
Packit b1f7ae
Packit b1f7ae
	for (it = 0; it < num_work; ++it) {
Packit b1f7ae
		uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
Packit b1f7ae
		int read;
Packit b1f7ae
Packit b1f7ae
		errcode = pt_section_get(sfix->section);
Packit b1f7ae
		if (errcode < 0)
Packit b1f7ae
			return errcode;
Packit b1f7ae
Packit b1f7ae
		errcode = pt_section_map(sfix->section);
Packit b1f7ae
		if (errcode < 0)
Packit b1f7ae
			goto out_put;
Packit b1f7ae
Packit b1f7ae
		read = pt_section_read(sfix->section, buffer, 2, 0x0ull);
Packit b1f7ae
		if (read < 0)
Packit b1f7ae
			goto out_unmap;
Packit b1f7ae
Packit b1f7ae
		errcode = -pte_invalid;
Packit b1f7ae
		if ((read != 2) || (buffer[0] != 0x2) || (buffer[1] != 0x4))
Packit b1f7ae
			goto out_unmap;
Packit b1f7ae
Packit b1f7ae
		errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
		if (errcode < 0)
Packit b1f7ae
			goto out_put;
Packit b1f7ae
Packit b1f7ae
		errcode = pt_section_put(sfix->section);
Packit b1f7ae
		if (errcode < 0)
Packit b1f7ae
			return errcode;
Packit b1f7ae
	}
Packit b1f7ae
Packit b1f7ae
	return 0;
Packit b1f7ae
Packit b1f7ae
out_unmap:
Packit b1f7ae
	(void) pt_section_unmap(sfix->section);
Packit b1f7ae
Packit b1f7ae
out_put:
Packit b1f7ae
	(void) pt_section_put(sfix->section);
Packit b1f7ae
	return errcode;
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result stress(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
#if defined(FEATURE_THREADS)
Packit b1f7ae
	{
Packit b1f7ae
		int thrd;
Packit b1f7ae
Packit b1f7ae
		for (thrd = 0; thrd < num_threads; ++thrd)
Packit b1f7ae
			ptu_test(ptunit_thrd_create, &sfix->thrd, worker, sfix);
Packit b1f7ae
	}
Packit b1f7ae
#endif /* defined(FEATURE_THREADS) */
Packit b1f7ae
Packit b1f7ae
	errcode = worker(sfix);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result cache(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	struct pt_block_cache *bcache;
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(sfix->section);
Packit b1f7ae
	ptu_null(bcache);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(sfix->section);
Packit b1f7ae
	ptu_ptr(bcache);
Packit b1f7ae
	ptu_uint_eq(bcache->nentries, sfix->section->size);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(sfix->section);
Packit b1f7ae
	ptu_null(bcache);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result cache_disabled(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	struct pt_block_cache *bcache;
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	pt_section_disable_bcache(sfix->section);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(sfix->section);
Packit b1f7ae
	ptu_null(bcache);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result cache_enable_disable(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 };
Packit b1f7ae
	struct pt_block_cache *bcache;
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix_write(sfix, bytes);
Packit b1f7ae
Packit b1f7ae
	sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
Packit b1f7ae
	ptu_ptr(sfix->section);
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(sfix->section);
Packit b1f7ae
	ptu_null(bcache);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	pt_section_disable_bcache(sfix->section);
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(sfix->section);
Packit b1f7ae
	ptu_ptr(bcache);
Packit b1f7ae
	ptu_uint_eq(bcache->nentries, sfix->section->size);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(sfix->section);
Packit b1f7ae
	ptu_null(bcache);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_map(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	bcache = pt_section_bcache(sfix->section);
Packit b1f7ae
	ptu_null(bcache);
Packit b1f7ae
Packit b1f7ae
	errcode = pt_section_unmap(sfix->section);
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result sfix_init(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	int errcode;
Packit b1f7ae
Packit b1f7ae
	sfix->section = NULL;
Packit b1f7ae
	sfix->clone = NULL;
Packit b1f7ae
	sfix->file = NULL;
Packit b1f7ae
	sfix->name = NULL;
Packit b1f7ae
Packit b1f7ae
	errcode = ptunit_mkfile(&sfix->file, &sfix->name, "wb");
Packit b1f7ae
	ptu_int_eq(errcode, 0);
Packit b1f7ae
Packit b1f7ae
	ptu_test(ptunit_thrd_init, &sfix->thrd);
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
static struct ptunit_result sfix_fini(struct section_fixture *sfix)
Packit b1f7ae
{
Packit b1f7ae
	int thrd;
Packit b1f7ae
Packit b1f7ae
	ptu_test(ptunit_thrd_fini, &sfix->thrd);
Packit b1f7ae
Packit b1f7ae
	for (thrd = 0; thrd < sfix->thrd.nthreads; ++thrd)
Packit b1f7ae
		ptu_int_eq(sfix->thrd.result[thrd], 0);
Packit b1f7ae
Packit b1f7ae
	if (sfix->section) {
Packit b1f7ae
		pt_section_put(sfix->section);
Packit b1f7ae
		sfix->section = NULL;
Packit b1f7ae
	}
Packit b1f7ae
Packit b1f7ae
	if (sfix->clone) {
Packit b1f7ae
		pt_section_put(sfix->clone);
Packit b1f7ae
		sfix->clone = NULL;
Packit b1f7ae
	}
Packit b1f7ae
Packit b1f7ae
	if (sfix->file) {
Packit b1f7ae
		fclose(sfix->file);
Packit b1f7ae
		sfix->file = NULL;
Packit b1f7ae
Packit b1f7ae
		if (sfix->name)
Packit b1f7ae
			remove(sfix->name);
Packit b1f7ae
	}
Packit b1f7ae
Packit b1f7ae
	if (sfix->name) {
Packit b1f7ae
		free(sfix->name);
Packit b1f7ae
		sfix->name = NULL;
Packit b1f7ae
	}
Packit b1f7ae
Packit b1f7ae
	return ptu_passed();
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
int main(int argc, char **argv)
Packit b1f7ae
{
Packit b1f7ae
	struct section_fixture sfix;
Packit b1f7ae
	struct ptunit_suite suite;
Packit b1f7ae
Packit b1f7ae
	sfix.init = sfix_init;
Packit b1f7ae
	sfix.fini = sfix_fini;
Packit b1f7ae
Packit b1f7ae
	suite = ptunit_mk_suite(argc, argv);
Packit b1f7ae
Packit b1f7ae
	ptu_run_f(suite, create, sfix);
Packit b1f7ae
	ptu_run_f(suite, create_bad_offset, sfix);
Packit b1f7ae
	ptu_run_f(suite, create_truncated, sfix);
Packit b1f7ae
	ptu_run_f(suite, create_empty, sfix);
Packit b1f7ae
Packit b1f7ae
	ptu_run(suite, clone_null);
Packit b1f7ae
	ptu_run(suite, filename_null);
Packit b1f7ae
	ptu_run(suite, offset_null);
Packit b1f7ae
	ptu_run(suite, size_null);
Packit b1f7ae
	ptu_run(suite, get_null);
Packit b1f7ae
	ptu_run(suite, put_null);
Packit b1f7ae
	ptu_run(suite, map_null);
Packit b1f7ae
	ptu_run(suite, unmap_null);
Packit b1f7ae
	ptu_run(suite, cache_null);
Packit b1f7ae
Packit b1f7ae
	ptu_run_f(suite, get_overflow, sfix);
Packit b1f7ae
	ptu_run_f(suite, map_change, sfix);
Packit b1f7ae
	ptu_run_f(suite, map_put, sfix);
Packit b1f7ae
	ptu_run_f(suite, unmap_nomap, sfix);
Packit b1f7ae
	ptu_run_f(suite, map_overflow, sfix);
Packit b1f7ae
	ptu_run_f(suite, get_put, sfix);
Packit b1f7ae
	ptu_run_f(suite, map_unmap, sfix);
Packit b1f7ae
	ptu_run_f(suite, read, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_null, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_offset, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_truncated, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_from_truncated, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_nomem, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_overflow, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_overflow_32bit, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_nomap, sfix);
Packit b1f7ae
	ptu_run_f(suite, read_unmap_map, sfix);
Packit b1f7ae
	ptu_run_f(suite, stress, sfix);
Packit b1f7ae
Packit b1f7ae
	ptu_run_f(suite, clone_bad_range, sfix);
Packit b1f7ae
	ptu_run_f(suite, clone_head, sfix);
Packit b1f7ae
	ptu_run_f(suite, clone_tail, sfix);
Packit b1f7ae
Packit b1f7ae
	ptu_run_f(suite, cache, sfix);
Packit b1f7ae
	ptu_run_f(suite, cache_disabled, sfix);
Packit b1f7ae
	ptu_run_f(suite, cache_enable_disable, sfix);
Packit b1f7ae
Packit b1f7ae
	ptunit_report(&suite);
Packit b1f7ae
	return suite.nr_fails;
Packit b1f7ae
}