1#include <stdio.h>
2#include <stdlib.h>
3#include <assert.h>
4#include <string.h>
5#include <inttypes.h>
6#include <errors/errno.h>
7#include <storage/storage.h>
8
9static struct storage_vsic vsic;
10static struct storage_vsa vsa;
11
12#define BUF_SIZE	1024
13#define ITERATIONS	10000
14
15#ifndef BARRELFISH
16void *user_alloc(size_t size, uintptr_t *paddr);
17#endif
18
19static uint64_t timestamps1[ITERATIONS], timestamps2[ITERATIONS];
20
21#ifndef BARRELFISH
22static inline uint64_t rdtsc(void)
23{
24    uint32_t eax, edx;
25    __asm volatile ("rdtsc" : "=a" (eax), "=d" (edx));
26    return ((uint64_t)edx << 32) | eax;
27}
28#endif
29
30int main(int argc, const char *argv[])
31{
32  errval_t err = storage_vsic_driver_init(argc, argv, &vsic);
33  assert(err_is_ok(err));
34  err = storage_vsa_acquire(&vsa, "0", 1 * 1024 * 1024);
35  assert(err_is_ok(err));
36
37#ifndef BARRELFISH
38  uintptr_t paddr;
39  uint8_t *buf = user_alloc(BUF_SIZE, &paddr);
40#else
41  uint8_t *buf = malloc(BUF_SIZE);
42#endif
43  assert(buf != NULL);
44
45  memset(buf, 0, BUF_SIZE);
46
47  for(int i = 0; i < ITERATIONS; i++) {
48    /* printf("Iteration %u...\n", i); */
49    uint64_t begin = rdtsc();
50    err = vsic.ops.write(&vsic, &vsa, 0, BUF_SIZE, buf);
51    assert(err_is_ok(err));
52    err = vsic.ops.flush(&vsic, &vsa);
53    assert(err_is_ok(err));
54    uint64_t start = rdtsc();
55    err = vsic.ops.wait(&vsic);
56    assert(err_is_ok(err));
57    timestamps2[i] = rdtsc() - start;
58    timestamps1[i] = start - begin;
59  }
60
61  printf("# write size = %u\n", BUF_SIZE);
62  for(int i = 0; i < ITERATIONS; i++) {
63      printf("%" PRIu64 "\t%" PRIu64 "\n", timestamps1[i], timestamps2[i]);
64  }
65
66  return 0;
67}
68