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

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [test_suite0/] [src/] [perf/] [exregs.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
/*
2
 * Copyright (C) 2010 B Labs Ltd.
3
 *
4
 * l4_exchange_registers performance tests
5
 *
6
 * Author: Bahadir Balban
7
 */
8
#include <l4lib/macros.h>
9
#include L4LIB_INC_ARCH(syslib.h)
10
#include L4LIB_INC_ARCH(syscalls.h)
11
#include <l4lib/lib/thread.h>
12
#include <l4lib/perfmon.h>
13
#include <l4lib/exregs.h>
14
#include <string.h>
15
#include <stdio.h>
16
#include <tests.h>
17
#include <perf.h>
18
 
19
struct perfmon_cycles l4_exregs_cycles;
20
 
21
#define PERFTEST_EXREGS_COUNT           100
22
 
23
int perf_measure_exregs(void)
24
{
25
        struct task_ids ids;
26
        struct exregs_data exregs[2];
27
        int err;
28
 
29
        /* Get own space id */
30
        l4_getid(&ids);
31
 
32
        /*
33
         * Initialize cycle structures
34
         */
35
        memset(&l4_exregs_cycles, 0, sizeof (struct perfmon_cycles));
36
        l4_exregs_cycles.min = ~0; /* Init as maximum possible */
37
 
38
        /*
39
         * Create a thread in the same space.
40
         * Thread is not runnable.
41
         */
42
        if ((err = l4_thread_control(THREAD_CREATE | TC_SHARE_SPACE,
43
                                     &ids)) < 0) {
44
                dbg_printf("Thread create failed. "
45
                           "err=%d\n", err);
46
                return err;
47
        }
48
 
49
        dbg_printf("Thread created successfully. "
50
                   "tid=%d\n", ids.tid);
51
 
52
        /*
53
         * Prepare a context part full of 0xFF
54
         */
55
        memset(&exregs[0].context, 0xFF, sizeof(exregs[1].context));
56
        exregs[0].valid_vect = 0xFFFFFFFF;
57
 
58
        dbg_printf("Starting l4_exregs write measurement\n");
59
        for (int i = 0; i < PERFTEST_EXREGS_COUNT; i++) {
60
                perfmon_reset_start_cyccnt();
61
                /* Write to context */
62
                if ((err = l4_exchange_registers(&exregs[0], ids.tid)) < 0)
63
                        goto out;
64
                perfmon_record_cycles(&l4_exregs_cycles,
65
                                      "l4_exchange_registers");
66
        }
67
 
68
        /* Calculate average */
69
        l4_exregs_cycles.avg = l4_exregs_cycles.total / l4_exregs_cycles.ops;
70
 
71
        /*
72
         * Print results
73
         */
74
        printf("PERFMON: %s took %llu min, %llu max, %llu avg, "
75
               "%llu total microseconds in %llu ops.\n",
76
               "l4_exchange_registers()/WRITE",
77
               l4_exregs_cycles.min * USEC_MULTIPLIER,
78
               l4_exregs_cycles.max * USEC_MULTIPLIER,
79
               l4_exregs_cycles.avg * USEC_MULTIPLIER,
80
               l4_exregs_cycles.total * USEC_MULTIPLIER,
81
               l4_exregs_cycles.ops);
82
 
83
        /*
84
         * Prepare a context part full of 0xFF
85
         */
86
        memset(&exregs[0].context, 0xFF, sizeof(exregs[1].context));
87
        exregs[0].valid_vect = 0xFFFFFFFF;
88
 
89
        dbg_printf("Starting l4_exregs read measurement\n");
90
        for (int i = 0; i < PERFTEST_EXREGS_COUNT; i++) {
91
                /* Set the other as read-all */
92
                exregs_set_read(&exregs[1]);
93
                exregs[1].valid_vect = 0xFFFFFFFF;
94
 
95
                if ((err = l4_exchange_registers(&exregs[1],
96
                                                 ids.tid)) < 0)
97
                goto out;
98
        }
99
 
100
        /*
101
         * Read back all context and compare results
102
         */
103
        if (memcmp(&exregs[0].context, &exregs[1].context,
104
                   sizeof(exregs[0].context))) {
105
                err = -1;
106
                goto out;
107
        }
108
 
109
        /* Calculate average */
110
        l4_exregs_cycles.avg = l4_exregs_cycles.total / l4_exregs_cycles.ops;
111
 
112
        /*
113
         * Print results
114
         */
115
        printf("PERFMON: %s took %llu min, %llu max, %llu avg, "
116
               "%llu total microseconds in %llu ops.\n",
117
               "l4_exchange_registers()/READ",
118
               l4_exregs_cycles.min * USEC_MULTIPLIER,
119
               l4_exregs_cycles.max * USEC_MULTIPLIER,
120
               l4_exregs_cycles.avg * USEC_MULTIPLIER,
121
               l4_exregs_cycles.total * USEC_MULTIPLIER,
122
               l4_exregs_cycles.ops);
123
 
124
out:
125
        /*
126
         * Destroy the thread
127
         */
128
        if ((err = l4_thread_control(THREAD_DESTROY, &ids)) < 0) {
129
                dbg_printf("Thread destroy failed. err=%d\n",
130
                           err);
131
        }
132
        return 0;
133
 
134
}

powered by: WebSVN 2.1.0

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