Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Linux guest user library and test application for ROS<->HRT interaction in an HVM
[palacios.git] / guest / linux / hvm-ros / test.c
1 #include <sys/syscall.h>
2 #include <unistd.h>
3 #include <stdint.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <string.h>
7
8
9 #include "v3_hvm_ros_user.h"
10
11 typedef unsigned char uchar_t;
12
13 #define rdtscll(val)                                    \
14     do {                                                \
15         uint64_t tsc;                                   \
16         uint32_t a, d;                                  \
17         asm volatile("rdtsc" : "=a" (a), "=d" (d));     \
18         *(uint32_t *)&(tsc) = a;                        \
19         *(uint32_t *)(((uchar_t *)&tsc) + 4) = d;       \
20         val = tsc;                                      \
21     } while (0)                                 
22
23
24
25 int simple_test_sync()
26 {
27     char buf[4096];  
28     
29     memset(buf,1,4096);
30     memset(buf,0,4096);
31     strcpy(buf,"hello world\n");
32
33     
34     printf("Merge\n");
35     if (v3_hvm_ros_merge_address_spaces()) { 
36         printf("failed to merge address spaces\n");
37         return -1;
38     }
39
40     printf("Synchronize\n");
41     if (v3_hvm_ros_synchronize()) { 
42         printf("failed to synchronize\n");
43         return -1;
44     }
45
46     printf("Invoke\n");
47     if (v3_hvm_ros_invoke_hrt_sync(buf,0)) { 
48         printf("failed to invoke HRT\n");
49         return -1;
50     }
51
52     printf("Desynchonize\n");
53     if (v3_hvm_ros_desynchronize()) { 
54         printf("failed to desynchronize\n");
55         return -1;
56     }
57
58     printf("Unmerge\n");
59     if (v3_hvm_ros_unmerge_address_spaces()) { 
60         printf("failed to merge address spaces\n");
61         return -1;
62     }
63
64     printf("Done.\n");
65
66     return 0;
67 }
68
69 int timing_test_sync(uint64_t num_merge, uint64_t num_call)
70 {
71     char buf[4096];  
72     unsigned long long start,end,i;
73     
74     memset(buf,1,4096);
75     memset(buf,0,4096);
76     strcpy(buf,"hello world\n");
77
78     printf("Executing %lu address space merges\n",num_merge);
79     rdtscll(start);
80     for (i=0;i<num_merge;i++) {
81         if (v3_hvm_ros_merge_address_spaces()) { 
82             return -1;
83         } 
84         //fprintf(stderr,"%llu\n",i+1);
85     }
86     rdtscll(end);
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);
88     
89     printf("Setting up synchronous invocation\n");
90     
91     if (v3_hvm_ros_synchronize()) {
92         return -1;
93     }
94
95     printf("Executing %lu HRT calls synchronously\n",num_call);
96     rdtscll(start);
97     for (i=0;i<num_call;i++) {
98         if (v3_hvm_ros_invoke_hrt_sync(buf,0)) {
99             return -1;
100         } 
101         //fprintf(stderr,"%llu\n",i+1);
102     }
103     rdtscll(end);
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);
105
106     if (v3_hvm_ros_desynchronize()) { 
107         return -1;
108     }
109
110     if (v3_hvm_ros_unmerge_address_spaces()) { 
111         return -1;
112     } 
113
114     return 0;
115 }
116
117 int simple_test_async()
118 {
119     char buf[4096];  
120     
121     memset(buf,1,4096);
122     memset(buf,0,4096);
123     strcpy(buf,"hello world\n");
124
125    printf("Merge\n");
126
127     if (v3_hvm_ros_merge_address_spaces()) { 
128         printf("failed to merge address spaces\n");
129         return -1;
130     }
131
132     printf("Invoke\n");
133
134     if (v3_hvm_ros_invoke_hrt_async(buf,0)) { 
135         printf("failed to invoke HRT\n");
136         return -1;
137     }
138
139     printf("Unmerge\n");
140
141     if (v3_hvm_ros_unmerge_address_spaces()) { 
142         printf("failed to unmerge address spaces\n");
143         return -1;
144     }
145     
146     
147     printf("Done.\n");
148     
149
150     return 0;
151 }
152
153 int timing_test_async(uint64_t num_merge, uint64_t num_call)
154 {
155     char buf[4096];  
156     unsigned long long start,end,i;
157     
158     memset(buf,1,4096);
159     memset(buf,0,4096);
160     strcpy(buf,"hello world\n");
161
162     printf("Executing %lu address space merges\n",num_merge);
163     rdtscll(start);
164     for (i=0;i<num_merge;i++) {
165         if (v3_hvm_ros_merge_address_spaces()) { 
166             return -1;
167         } 
168         //fprintf(stderr,"%llu\n",i+1);
169     }
170     rdtscll(end);
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);
172     
173     printf("Executing %lu HRT calls\n",num_call);
174     rdtscll(start);
175     for (i=0;i<num_call;i++) {
176         if (v3_hvm_ros_invoke_hrt_async(buf,0)) {
177             return -1;
178         } 
179         //fprintf(stderr,"%llu\n",i+1);
180     }
181     rdtscll(end);
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);
183
184     if (v3_hvm_ros_unmerge_address_spaces()) { 
185         return -1;
186     } 
187
188     return 0;
189 }
190
191 int main(int argc, char *argv[]) 
192 {
193     int rc;
194     
195     if (argc!=3 && argc!=5) { 
196         printf("usage: test simple|time sync|async num_merges num_calls\n");
197         return -1;
198     }
199     
200     v3_hvm_ros_user_init();
201     
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();
207         } else {
208             printf("Unknown type %s\n",argv[2]);
209             rc=-1;
210         }
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]));
216         } else {
217             printf("Unknown type %s\n",argv[2]);
218             rc=-1;
219         }
220     } else {
221         printf("Unknown mode %s\n",argv[1]);
222         rc=-1;
223     }
224     
225     v3_hvm_ros_user_deinit();
226
227     return rc;
228 }