//-----Time-and-and-randomization-overrides-------------------------------\r
static inline unsigned long time(unsigned long * seconds)\r
{\r
- return (*seconds) = tsc_read();\r
+ u64 time_sec = tsc_read();\r
+ if (seconds != NULL){\r
+ (*seconds) = time_sec;\r
+ }\r
+ return time_sec;\r
}\r
\r
/*\r
static inline void __assert(const char *msg, const char *file, int line)\r
{\r
printk("Assertion %s in %s:%s failed.\n", msg, file, line);\r
+ exit(-1);\r
}\r
//-END:-Assertion-overrides-------------------------------------------------\r
\r
\r
_Static_assert(sizeof(struct s) == 64, "Struct size differs from cacheline size");\r
\r
+#ifdef JAILHOUSE\r
+#define MAX_CPUS 1\r
+#else\r
#define MAX_CPUS 8\r
+#endif\r
\r
#ifdef __aarch64__\r
#define MRS32(reg) ({ uint32_t v; asm volatile ("mrs %0," # reg : "=r" (v)); v; })\r
int count = size / sizeof(struct s);\r
\r
if (sequential) {\r
- for (i = 0; i < count - 1; i++)\r
- array[i].ptr = &array[i+1];\r
- array[count - 1].ptr = &array[0];\r
+ for (i = 0; i < count - 1; i++){\r
+ array[i].ptr = &array[i+1];\r
+ }\r
+ array[count - 1].ptr = &array[0];\r
} else {\r
memset(array, 0, size);\r
struct s *p = &array[0];\r
struct benchmark_thread {\r
pthread_t id;\r
unsigned cpu;\r
- double result;\r
+ uint64_t result_integral;\r
+ uint64_t result_fractional;\r
struct cfg *cfg;\r
};\r
\r
pthread_barrier_t barrier;\r
-\r
+#ifdef JAILHOUSE\r
+struct s array[MAX_CPUS][64*0x100000/sizeof(struct s)] __attribute__ ((aligned (2*1024*1024))) __attribute__ ((section (".bench-array")));\r
+#else\r
struct s array[MAX_CPUS][64*0x100000/sizeof(struct s)] __attribute__ ((aligned (2*1024*1024)));\r
-\r
+#endif\r
bool print = true;\r
\r
static void *benchmark_thread(void *arg)\r
cpu_set_t set;\r
\r
CPU_ZERO(&set);\r
- CPU_SET(me->cpu, &set);\r
+ CPU_SET(me->cpu, &set);\r
\r
if (pthread_setaffinity_np(me->id, sizeof(set), &set) != 0) {\r
perror("pthread_setaffinity_np");\r
exit(1);\r
}\r
\r
- prepare(array[me->cpu], me->cfg->size, me->cfg->sequential);\r
-\r
- pthread_barrier_wait(&barrier);\r
+ prepare(array[me->cpu], me->cfg->size, me->cfg->sequential);\r
\r
- if (print)\r
- printf("CPU %d starts measurement\n", me->cpu);\r
+ pthread_barrier_wait(&barrier);\r
\r
- uint64_t tic, tac;\r
- tic = get_time(me->cfg);\r
- if (me->cfg->write == false)\r
- do_read(array[me->cpu], me->cfg->read_count);\r
- else\r
- do_write(array[me->cpu], me->cfg->read_count, me->cfg->ofs);\r
+ if (print)\r
+ printf("CPU %d starts measurement\n", me->cpu);\r
\r
- tac = get_time(me->cfg);\r
- me->result = (double)(tac - tic) / me->cfg->read_count;\r
+ uint64_t tic, tac;\r
+ tic = get_time(me->cfg);\r
+ if (me->cfg->write == false)\r
+ do_read(array[me->cpu], me->cfg->read_count);\r
+ else\r
+ do_write(array[me->cpu], me->cfg->read_count, me->cfg->ofs);\r
\r
- return NULL;\r
+ tac = get_time(me->cfg);\r
+ me->result_integral = (tac - tic) / me->cfg->read_count;\r
+ me->result_fractional = (((tac - tic) * 1000) / me->cfg->read_count) % 1000;\r
+ return NULL;\r
}\r
\r
static void run_benchmark(struct cfg *cfg)\r
\r
printf("%d", cfg->size);\r
for (i = 0; i < cfg->num_threads; i++) {\r
- printf("\t%#.3g", thread[i].result);\r
+ //NOTE: Jailhouse is not able to print doubles.\r
+ //printf("\t%#.3g", thread[i].result);\r
+ printf("\t%lu.%03u", thread[i].result_integral, thread[i].result_fractional);\r
}\r
printf("\n");\r
fflush(stdout);\r
.read_count = 0x2000000,\r
.write = false,\r
.ofs = 0,\r
- .use_cycles = false, /* i.e. use nanoseconds */\r
+ .use_cycles = false, // i.e. use nanoseconds /\r
};\r
-\r
#ifdef JAILHOUSE\r
//initialize UART\r
unsigned long tsc_freq;\r
unsigned int n;\r
-\r
printk_uart_base = UART_BASE;\r
do {\r
for (n = 0; n < UART_IDLE_LOOPS; n++)\r
if (!(inb(UART_BASE + UART_LSR) & UART_LSR_THRE))\r
break;\r
} while (n < UART_IDLE_LOOPS);\r
+\r
+ printk("cmdline opts: '%s'\n", cmdline);\r
+ comm_region->pm_timer_address = 0x408;\r
//parse cmdline\r
cfg.read_count = cmdline_parse_int("-c", cfg.read_count);\r
cfg.ofs = cmdline_parse_int("-o", cfg.ofs);\r
- cfg.sequential = cmdline_parse_bool("-r");\r
+ cfg.sequential = !cmdline_parse_bool("-r");\r
cfg.size = cmdline_parse_int("-s", cfg.size);\r
if (cmdline_parse_bool("-t")) {\r
printk("Threads are not supported. '-t' was ignored.\n");\r
tsc_freq = tsc_init();\r
printk("Calibrated TSC frequency: %lu.%03u kHz\n", tsc_freq / 1000,\r
tsc_freq % 1000);\r
+\r
+ u8 * start_memreg = (u8 *) array;\r
+\r
+ while ( ((u64) start_memreg )< 0x4000000) {\r
+ //printk("%p\n",start_memreg);\r
+ map_range(start_memreg, HUGE_PAGE_SIZE, MAP_CACHED);\r
+ start_memreg += HUGE_PAGE_SIZE;\r
+\r
+ }\r
+\r
#else //Linux param's parsing\r
CPU_ZERO(&cfg.cpu_set);\r
\r
case 'o':\r
cfg.ofs = atol(optarg);\r
break;\r
- case 'r': /* random */\r
+ case 'r': // random //\r
cfg.sequential = false;\r
break;\r
case 's':\r
case 'y':\r
cfg.use_cycles = true;\r
break;\r
- default: /* '?' */\r
+ default: // '?' //\r
fprintf(stderr, "Usage: %s ... TODO\n", argv[0]);\r
exit(1);\r
}\r
if (cfg.size != 0) {\r
run_benchmark(&cfg);\r
} else {\r
- unsigned order, size, step;\r
- for (order = 10; order <= 24; order++) {\r
+ unsigned order, size, step;\r
+ for (order = 10; order <= 24; order++) {\r
for (step = 0; step < 2; step++) {\r
size = 1 << order;\r
if (step == 1)\r
size += size / 2;\r
\r
cfg.size = size;\r
- run_benchmark(&cfg);\r
+ run_benchmark(&cfg);\r
}\r
}\r
}\r
+\r
#ifndef JAILHOUSE\r
return 0;\r
+#else\r
+ comm_region->cell_state = JAILHOUSE_CELL_SHUT_DOWN;\r
+ printk("done!");\r
#endif\r
}\r