#include #include #include #include #include #include #include "v3_hvm_ros_user.h" typedef unsigned char uchar_t; #define rdtscll(val) \ do { \ uint64_t tsc; \ uint32_t a, d; \ asm volatile("rdtsc" : "=a" (a), "=d" (d)); \ *(uint32_t *)&(tsc) = a; \ *(uint32_t *)(((uchar_t *)&tsc) + 4) = d; \ val = tsc; \ } while (0) int simple_test_sync() { char buf[4096]; memset(buf,1,4096); memset(buf,0,4096); strcpy(buf,"hello world\n"); printf("Merge\n"); if (v3_hvm_ros_merge_address_spaces()) { printf("failed to merge address spaces\n"); return -1; } printf("Synchronize\n"); if (v3_hvm_ros_synchronize()) { printf("failed to synchronize\n"); return -1; } printf("Invoke\n"); if (v3_hvm_ros_invoke_hrt_sync(buf,0)) { printf("failed to invoke HRT\n"); return -1; } printf("Desynchonize\n"); if (v3_hvm_ros_desynchronize()) { printf("failed to desynchronize\n"); return -1; } printf("Unmerge\n"); if (v3_hvm_ros_unmerge_address_spaces()) { printf("failed to merge address spaces\n"); return -1; } printf("Done.\n"); return 0; } int timing_test_sync(uint64_t num_merge, uint64_t num_call) { char buf[4096]; unsigned long long start,end,i; memset(buf,1,4096); memset(buf,0,4096); strcpy(buf,"hello world\n"); printf("Executing %lu address space merges\n",num_merge); rdtscll(start); for (i=0;i