]> rtime.felk.cvut.cz Git - hercules2020/jailhouse-build.git/blob - test/memguard-test.c
Current memguard version + updated test
[hercules2020/jailhouse-build.git] / test / memguard-test.c
1 /* Run this as: for i in $(seq 0 5); do prem-test $i & done */
2
3 #define _GNU_SOURCE         /* See feature_test_macros(7) */
4 #include <err.h>
5 #include <sched.h>
6 #include <stdint.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10 #include <time.h>
11
12 #ifndef SYS_prem_memguard_check
13 #define SYS_prem_memguard_check 793
14 #endif
15
16 #define RANDOM_ARRAY_SIZE 16777216 // 16M * 8 = 128 MB array
17
18 uint64_t random_values[RANDOM_ARRAY_SIZE];
19 volatile uint64_t sum;
20
21 enum prem_phase {
22         PREM_COMPATIBLE = 0,
23         PREM_MEMORY     = 1,
24         PREM_COMPUTE    = 2,
25 };
26
27 void compute_kernel(int time_ms){
28     struct timespec ts;
29     uint64_t current_us, end_us;
30     clock_gettime(CLOCK_MONOTONIC, &ts);
31     end_us = ts.tv_sec * 1000000 + ts.tv_nsec / 1000 + time_ms * 1000;
32     do {
33         clock_gettime(CLOCK_MONOTONIC, &ts);
34         current_us = ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
35     } while (current_us < end_us);
36 }
37
38 long memory_kernel(long lines){
39     for(int i = 0; i < lines; i++){
40         sum += random_values[(i*8) % RANDOM_ARRAY_SIZE];
41     }
42     return sum;
43 }
44
45 void random_memory_kernel(long lines) {
46     uint32_t index;
47
48     for(long i=0; i<lines; i++) {
49         index = (uint32_t)rand();
50         index = index % RANDOM_ARRAY_SIZE;
51         sum += random_values[index];
52     }
53 }
54
55 /* Memguard flags */
56 #define MGF_PERIODIC  (1 << 0) /* Chooses between periodic or one-shot budget replenishment */
57 #define MGF_RET_STATS (1 << 1) /* Return statistics since the last call (cache misses, time, ...?) */
58 #define MGF_MASK_INT  (1 << 2) /* Mask (disable) low priority interrupts until next memguard call */
59
60 long prem_memguard_check(unsigned long timeout,
61                     unsigned long memory_budget,
62                     unsigned long flags)
63 {
64     return syscall(SYS_prem_memguard_check, timeout, memory_budget, flags);
65 }
66
67 int main(int argc, char *argv[])
68 {
69     cpu_set_t set;
70     int cpu = 0;
71
72     if (argc > 1)
73         cpu = atoi(argv[1]);
74
75     /* Ensure that memory phase starts and ends on the same CPU */
76     CPU_ZERO(&set);
77     CPU_SET(cpu, &set);
78     if (sched_setaffinity(getpid(), sizeof(set), &set) < 0)
79         err(1, "sched_setaffinity");
80     printf("Pinned to CPU %d\n", cpu);
81
82     printf("X1\n");
83     fflush(stdout);
84     //prem_memguard_check(950000, 1933440000, 1);
85     prem_memguard_check(100000, 1000, MGF_PERIODIC);
86     compute_kernel(1000);
87     //prem_memguard_check(0, 0, 1);
88
89     printf("X2\n");
90     fflush(stdout);
91     //prem_memguard_check(1050000, 2136960000, 1);
92     prem_memguard_check(1050000, 2136960000, 0);
93     compute_kernel(1000);
94     //prem_memguard_check(0, 0, 1);
95
96     printf("X3\n");
97     fflush(stdout);
98     //prem_memguard_check(1000000, 500, 1);
99     prem_memguard_check(100000, 500, MGF_PERIODIC);
100     memory_kernel(100000000);
101     //prem_memguard_check(0, 0, 1);
102
103     printf("X4\n");
104     fflush(stdout);
105     //prem_memguard_check(1000000, 1500, 1);
106     prem_memguard_check(1000000, 15000000, 0);
107     memory_kernel(100000000);
108     //prem_memguard_check(0, 0, 1);
109
110     printf("X5\n");
111     fflush(stdout);
112     //prem_memguard_check(1000000, 10000, 1);
113     prem_memguard_check(1000000, 100000, 0);
114     random_memory_kernel(100000000);
115     //prem_memguard_check(0, 0, 1);
116
117     printf("X6\n");
118     fflush(stdout);
119     //prem_memguard_check(1000000, 10000000, 1);
120     prem_memguard_check(1000000, 100000000, 0);
121     random_memory_kernel(100000000);
122
123     prem_memguard_check(0, 0, 0);
124
125     return 0;
126 }