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 #define HVM_SIG_STACK_SIZE 8192
192 static char hvm_sig_stack[HVM_SIG_STACK_SIZE] __attribute__((aligned(4096)));
194 static void my_hvm_sig_handler(uint64_t code)
196 printf("HVM Signal Handler Invoked: code=0x%lx\n",code);
199 int main(int argc, char *argv[])
203 if (argc!=3 && argc!=5) {
204 printf("usage: test simple|time sync|async num_merges num_calls\n");
208 v3_hvm_ros_user_init();
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);
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();
219 printf("Unknown type %s\n",argv[2]);
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]));
228 printf("Unknown type %s\n",argv[2]);
232 printf("Unknown mode %s\n",argv[1]);
236 v3_hvm_ros_unregister_signal();
238 v3_hvm_ros_user_deinit();