OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [test_suite0/] [src/] [perf/] [exregs.c] - Rev 2

Compare with Previous | Blame | View Log

/*
 * Copyright (C) 2010 B Labs Ltd.
 *
 * l4_exchange_registers performance tests
 *
 * Author: Bahadir Balban
 */
#include <l4lib/macros.h>
#include L4LIB_INC_ARCH(syslib.h)
#include L4LIB_INC_ARCH(syscalls.h)
#include <l4lib/lib/thread.h>
#include <l4lib/perfmon.h>
#include <l4lib/exregs.h>
#include <string.h>
#include <stdio.h>
#include <tests.h>
#include <perf.h>
 
struct perfmon_cycles l4_exregs_cycles;
 
#define PERFTEST_EXREGS_COUNT		100
 
int perf_measure_exregs(void)
{
	struct task_ids ids;
	struct exregs_data exregs[2];
	int err;
 
	/* Get own space id */
	l4_getid(&ids);
 
	/*
	 * Initialize cycle structures
	 */
	memset(&l4_exregs_cycles, 0, sizeof (struct perfmon_cycles));
	l4_exregs_cycles.min = ~0; /* Init as maximum possible */
 
	/*
	 * Create a thread in the same space.
	 * Thread is not runnable.
	 */
	if ((err = l4_thread_control(THREAD_CREATE | TC_SHARE_SPACE,
				     &ids)) < 0) {
		dbg_printf("Thread create failed. "
			   "err=%d\n", err);
		return err;
	}
 
	dbg_printf("Thread created successfully. "
		   "tid=%d\n", ids.tid);
 
	/*
	 * Prepare a context part full of 0xFF
	 */
	memset(&exregs[0].context, 0xFF, sizeof(exregs[1].context));
	exregs[0].valid_vect = 0xFFFFFFFF;
 
	dbg_printf("Starting l4_exregs write measurement\n");
	for (int i = 0; i < PERFTEST_EXREGS_COUNT; i++) {
		perfmon_reset_start_cyccnt();
		/* Write to context */
		if ((err = l4_exchange_registers(&exregs[0], ids.tid)) < 0)
			goto out;
		perfmon_record_cycles(&l4_exregs_cycles,
				      "l4_exchange_registers");
	}
 
	/* Calculate average */
	l4_exregs_cycles.avg = l4_exregs_cycles.total / l4_exregs_cycles.ops;
 
	/*
	 * Print results
	 */
	printf("PERFMON: %s took %llu min, %llu max, %llu avg, "
	       "%llu total microseconds in %llu ops.\n",
	       "l4_exchange_registers()/WRITE",
	       l4_exregs_cycles.min * USEC_MULTIPLIER,
	       l4_exregs_cycles.max * USEC_MULTIPLIER,
	       l4_exregs_cycles.avg * USEC_MULTIPLIER,
	       l4_exregs_cycles.total * USEC_MULTIPLIER,
	       l4_exregs_cycles.ops);
 
	/*
	 * Prepare a context part full of 0xFF
	 */
	memset(&exregs[0].context, 0xFF, sizeof(exregs[1].context));
	exregs[0].valid_vect = 0xFFFFFFFF;
 
	dbg_printf("Starting l4_exregs read measurement\n");
	for (int i = 0; i < PERFTEST_EXREGS_COUNT; i++) {
		/* Set the other as read-all */
		exregs_set_read(&exregs[1]);
		exregs[1].valid_vect = 0xFFFFFFFF;
 
		if ((err = l4_exchange_registers(&exregs[1],
						 ids.tid)) < 0)
		goto out;
	}
 
	/*
	 * Read back all context and compare results
	 */
	if (memcmp(&exregs[0].context, &exregs[1].context,
		   sizeof(exregs[0].context))) {
		err = -1;
		goto out;
	}
 
	/* Calculate average */
	l4_exregs_cycles.avg = l4_exregs_cycles.total / l4_exregs_cycles.ops;
 
	/*
	 * Print results
	 */
	printf("PERFMON: %s took %llu min, %llu max, %llu avg, "
	       "%llu total microseconds in %llu ops.\n",
	       "l4_exchange_registers()/READ",
	       l4_exregs_cycles.min * USEC_MULTIPLIER,
	       l4_exregs_cycles.max * USEC_MULTIPLIER,
	       l4_exregs_cycles.avg * USEC_MULTIPLIER,
	       l4_exregs_cycles.total * USEC_MULTIPLIER,
	       l4_exregs_cycles.ops);
 
out:
	/*
	 * Destroy the thread
	 */
	if ((err = l4_thread_control(THREAD_DESTROY, &ids)) < 0) {
		dbg_printf("Thread destroy failed. err=%d\n",
			   err);
	}
	return 0;
 
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.