1 #include <sys/syscall.h>
9 #include "v3_hvm_ros_user.h"
11 typedef unsigned char uchar_t;
13 #define rdtscll(val) \
17 asm volatile("rdtsc" : "=a" (a), "=d" (d)); \
18 *(uint32_t *)&(tsc) = a; \
19 *(uint32_t *)(((uchar_t *)&tsc) + 4) = d; \
25 int simple_test_sync()
31 strcpy(buf,"hello world\n");
35 if (v3_hvm_ros_merge_address_spaces()) {
36 printf("failed to merge address spaces\n");
40 printf("Synchronize\n");
41 if (v3_hvm_ros_synchronize()) {
42 printf("failed to synchronize\n");
47 if (v3_hvm_ros_invoke_hrt_sync(buf,0)) {
48 printf("failed to invoke HRT\n");
52 printf("Desynchonize\n");
53 if (v3_hvm_ros_desynchronize()) {
54 printf("failed to desynchronize\n");
59 if (v3_hvm_ros_unmerge_address_spaces()) {
60 printf("failed to merge address spaces\n");
69 int timing_test_sync(uint64_t num_merge, uint64_t num_call)
72 unsigned long long start,end,i;
76 strcpy(buf,"hello world\n");
78 printf("Executing %lu address space merges\n",num_merge);
80 for (i=0;i<num_merge;i++) {
81 if (v3_hvm_ros_merge_address_spaces()) {
84 //fprintf(stderr,"%llu\n",i+1);
87 printf("Took %llu cycles, %llu cycles/iter, or %lf seconds/iter\n",end-start,(end-start)/num_merge,(((double)end-start)/num_merge)/2.1e9);
89 printf("Setting up synchronous invocation\n");
91 if (v3_hvm_ros_synchronize()) {
95 printf("Executing %lu HRT calls synchronously\n",num_call);
97 for (i=0;i<num_call;i++) {
98 if (v3_hvm_ros_invoke_hrt_sync(buf,0)) {
101 //fprintf(stderr,"%llu\n",i+1);
104 printf("Took %llu cycles, %llu cycles/iter, or %lf seconds/iter\n",end-start,(end-start)/num_call,(((double)end-start)/num_call)/2.1e9);
106 if (v3_hvm_ros_desynchronize()) {
110 if (v3_hvm_ros_unmerge_address_spaces()) {
117 int simple_test_async()
123 strcpy(buf,"hello world\n");
127 if (v3_hvm_ros_merge_address_spaces()) {
128 printf("failed to merge address spaces\n");
134 if (v3_hvm_ros_invoke_hrt_async(buf,0)) {
135 printf("failed to invoke HRT\n");
141 if (v3_hvm_ros_unmerge_address_spaces()) {
142 printf("failed to unmerge address spaces\n");
153 int timing_test_async(uint64_t num_merge, uint64_t num_call)
156 unsigned long long start,end,i;
160 strcpy(buf,"hello world\n");
162 printf("Executing %lu address space merges\n",num_merge);
164 for (i=0;i<num_merge;i++) {
165 if (v3_hvm_ros_merge_address_spaces()) {
168 //fprintf(stderr,"%llu\n",i+1);
171 printf("Took %llu cycles, %llu cycles/iter, or %lf seconds/iter\n",end-start,(end-start)/num_merge,(((double)end-start)/num_merge)/2.1e9);
173 printf("Executing %lu HRT calls\n",num_call);
175 for (i=0;i<num_call;i++) {
176 if (v3_hvm_ros_invoke_hrt_async(buf,0)) {
179 //fprintf(stderr,"%llu\n",i+1);
182 printf("Took %llu cycles, %llu cycles/iter, or %lf seconds/iter\n",end-start,(end-start)/num_call,(((double)end-start)/num_call)/2.1e9);
184 if (v3_hvm_ros_unmerge_address_spaces()) {
191 int main(int argc, char *argv[])
195 if (argc!=3 && argc!=5) {
196 printf("usage: test simple|time sync|async num_merges num_calls\n");
200 v3_hvm_ros_user_init();
202 if (argv[1][0]=='s') {
203 if (argv[2][0]=='s') {
204 rc=simple_test_sync();
205 } else if (argv[2][0]=='a') {
206 rc=simple_test_async();
208 printf("Unknown type %s\n",argv[2]);
211 } else if (argv[1][0]=='t') {
212 if (argv[2][0]=='s') {
213 rc=timing_test_sync(atoi(argv[3]),atoi(argv[4]));
214 } else if (argv[2][0]=='a') {
215 rc=timing_test_async(atoi(argv[3]),atoi(argv[4]));
217 printf("Unknown type %s\n",argv[2]);
221 printf("Unknown mode %s\n",argv[1]);
225 v3_hvm_ros_user_deinit();