From 5e863808789052caa8681209a648947fdfd7914d Mon Sep 17 00:00:00 2001 From: Joel Matejka Date: Thu, 25 Oct 2018 11:47:51 +0200 Subject: [PATCH] Simple memguard test --- test/Makefile | 2 +- test/memguard-test.c | 120 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 test/memguard-test.c diff --git a/test/Makefile b/test/Makefile index ae44b67..90fce60 100644 --- a/test/Makefile +++ b/test/Makefile @@ -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 index 0000000..d24e43d --- /dev/null +++ b/test/memguard-test.c @@ -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 +#include +#include +#include +#include +#include +#include + +#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 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; +} -- 2.39.2