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.


HVM capability enhancement: asynchronous upcalls to ROS userspace
[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 #define HVM_SIG_STACK_SIZE 8192
192 static char hvm_sig_stack[HVM_SIG_STACK_SIZE] __attribute__((aligned(4096)));
193
194 static void my_hvm_sig_handler(uint64_t code)
195 {
196     printf("HVM Signal Handler Invoked: code=0x%lx\n",code);
197 }
198
199 int main(int argc, char *argv[]) 
200 {
201     int rc;
202     
203     if (argc!=3 && argc!=5) { 
204         printf("usage: test simple|time sync|async num_merges num_calls\n");
205         return -1;
206     }
207     
208     v3_hvm_ros_user_init();
209
210     v3_hvm_ros_unregister_signal(); // remove any existing signal handler
211     v3_hvm_ros_register_signal(my_hvm_sig_handler,hvm_sig_stack,HVM_SIG_STACK_SIZE);
212
213     if (argv[1][0]=='s') {
214         if (argv[2][0]=='s') { 
215             rc=simple_test_sync();
216         } else if (argv[2][0]=='a') {
217             rc=simple_test_async();
218         } else {
219             printf("Unknown type %s\n",argv[2]);
220             rc=-1;
221         }
222     } else if (argv[1][0]=='t') {
223         if (argv[2][0]=='s') { 
224             rc=timing_test_sync(atoi(argv[3]),atoi(argv[4]));
225         } else if (argv[2][0]=='a') {
226             rc=timing_test_async(atoi(argv[3]),atoi(argv[4]));
227         } else {
228             printf("Unknown type %s\n",argv[2]);
229             rc=-1;
230         }
231     } else {
232         printf("Unknown mode %s\n",argv[1]);
233         rc=-1;
234     }
235     
236     v3_hvm_ros_unregister_signal();
237
238     v3_hvm_ros_user_deinit();
239
240     return rc;
241 }