]> rtime.felk.cvut.cz Git - hercules2020/jailhouse-build.git/commitdiff
Simple memguard test
authorJoel Matejka <joel.matejka@cvut.cz>
Thu, 25 Oct 2018 09:47:51 +0000 (11:47 +0200)
committerJoel Matejka <joel.matejka@cvut.cz>
Thu, 25 Oct 2018 09:47:51 +0000 (11:47 +0200)
test/Makefile
test/memguard-test.c [new file with mode: 0644]

index ae44b675e0a38f014f2d4b7973157a106117d034..90fce606037462eaf951053e9de72539895e07d5 100644 (file)
@@ -1,4 +1,4 @@
 CC = /opt/OSELAS.Toolchain-2014.12.2/aarch64-v8a-linux-gnu/gcc-4.9.2-glibc-2.20-binutils-2.24-kernel-3.16-sanitized/bin/aarch64-v8a-linux-gnu-gcc
 CFLAGS = -Wall -O2 -g -std=gnu99
 
-all: prem-test
+all: prem-test memguard-test
diff --git a/test/memguard-test.c b/test/memguard-test.c
new file mode 100644 (file)
index 0000000..d24e43d
--- /dev/null
@@ -0,0 +1,120 @@
+/* Run this as: for i in $(seq 0 5); do prem-test $i & done */
+
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <err.h>
+#include <sched.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+
+#ifndef SYS_prem_memguard_check
+#define SYS_prem_memguard_check 793
+#endif
+
+#define RANDOM_ARRAY_SIZE 16777216 // 16M * 8 = 128 MB array
+
+uint64_t random_values[RANDOM_ARRAY_SIZE];
+volatile uint64_t sum;
+
+enum prem_phase {
+       PREM_COMPATIBLE = 0,
+       PREM_MEMORY     = 1,
+       PREM_COMPUTE    = 2,
+};
+
+void compute_kernel(int time_ms){
+    struct timespec ts;
+    uint64_t current_us, end_us;
+    clock_gettime(CLOCK_MONOTONIC, &ts);
+    end_us = ts.tv_sec * 1000000 + ts.tv_nsec / 1000 + time_ms * 1000;
+    do{
+        clock_gettime(CLOCK_MONOTONIC, &ts);
+        current_us = ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
+    }while(current_us < end_us);
+}
+
+long memory_kernel(long lines){
+    for(int i = 0; i < lines; i++){
+        sum += random_values[(i*8) % RANDOM_ARRAY_SIZE];
+    }
+    return sum;
+}
+
+void random_memory_kernel(long lines) {
+    uint32_t index;
+    
+    for(long i=0; i<lines; i++) {
+        index = (uint32_t)rand();
+        index = index % RANDOM_ARRAY_SIZE;
+        sum += random_values[index];
+    }
+}
+
+long prem_memguard_check(unsigned long phase,
+                   unsigned long memory_budget,
+                   unsigned long timeout)
+{
+       return syscall(SYS_prem_memguard_check, phase, memory_budget, timeout);
+}
+
+int main(int argc, char *argv[])
+{
+    cpu_set_t set;
+       int cpu = 0;
+
+       if (argc > 1)
+               cpu = atoi(argv[1]);
+
+       /* Ensure that memory phase starts and ends on the same CPU */
+       CPU_ZERO(&set);
+       CPU_SET(cpu, &set);
+       if (sched_setaffinity(getpid(), sizeof(set), &set) < 0)
+               err(1, "sched_setaffinity");
+       printf("Pinned to CPU %d\n", cpu);
+
+    printf("X1\n");
+    fflush(stdout);
+       //prem_memguard_check(950000, 1933440000, 1);
+    prem_memguard_check(950000, 1933440000, 1);
+    compute_kernel(1000);
+    prem_memguard_check(0, 0, 1);
+    
+    printf("X2\n");
+    fflush(stdout);
+    //prem_memguard_check(1050000, 2136960000, 1);
+    prem_memguard_check(1050000, 2136960000, 1);
+    compute_kernel(1000);
+    prem_memguard_check(0, 0, 1);
+    
+    printf("X3\n");
+    fflush(stdout);
+    //prem_memguard_check(1000000, 500, 1);
+    prem_memguard_check(1000000, 5000000, 1);
+    memory_kernel(100000000);
+    prem_memguard_check(0, 0, 1);
+    
+    printf("X4\n");
+    fflush(stdout);
+    //prem_memguard_check(1000000, 1500, 1);
+    prem_memguard_check(1000000, 15000000, 1);
+    memory_kernel(100000000);
+    prem_memguard_check(0, 0, 1);
+    
+    printf("X5\n");
+    fflush(stdout);
+    //prem_memguard_check(1000000, 10000, 1);
+    prem_memguard_check(1000000, 100000, 1);
+    random_memory_kernel(100000000);
+    prem_memguard_check(0, 0, 1);
+    
+    printf("X6\n");
+    fflush(stdout);
+    //prem_memguard_check(1000000, 10000000, 1);
+    prem_memguard_check(1000000, 100000000, 1);
+    random_memory_kernel(100000000);
+    prem_memguard_check(0, 0, 1);
+
+       return 0;
+}