--- /dev/null
+/* 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;
+}