--- /dev/null
+# tests
+set(CMAKE_C_FLAGS "-g -O0 -fno-omit-frame-pointer")
+
+if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -marm")
+endif ()
+
+add_executable(test1-crash test1.c)
+add_executable(test1-sleep test1.c)
+add_executable(test1-ill test1.c)
+
--- /dev/null
+#include <libgen.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int do_sleep=0;
+int do_ill=0;
+
+#if defined(__arm__)
+char ill_buf[] = { 0xf0, 0x00, 0x00, 0xf0 };
+#elif defined(__aarch64__)
+char ill_buf[] = { 0x22, 0x00, 0x00, 0xf9 };
+#elif defined(__i386__) || defined(__x86_64__)
+char ill_buf[] = { 0x06, 0x00, 0x00, 0x00 };
+#else
+#error "Unsupported architecture"
+#endif
+
+int main(int ac, char *av[]);
+
+void(*baz)(void);
+
+int bar(int a, int b){
+ int *c=(int*)0;
+ if (do_ill)
+ baz();
+ if (do_sleep)
+ sleep(-1);
+ return a + b + *c;
+}
+
+int foo(int c){
+ int a=1;
+ int b=2;
+ return bar(a+c,b+c);
+}
+
+int *memory;
+
+int allocate(size_t amount) {
+ size_t i;
+ memory = malloc(amount);
+
+ if (memory == NULL)
+ exit(1);
+
+ for (i=0; i < amount/sizeof(size_t); i++) {
+ memory[i]=i;
+ }
+ return 0;
+}
+
+int main(int ac, char* av[])
+{
+ if (strcmp(basename(av[0]), "test1-sleep") == 0)
+ do_sleep = 1;
+ if (strcmp(basename(av[0]), "test1-ill") == 0)
+ do_ill = 1;
+ baz = mmap(0, sizeof(ill_buf), PROT_READ|PROT_WRITE|PROT_EXEC,
+ MAP_PRIVATE|MAP_ANON, -1, 0);
+ memcpy(baz, ill_buf, sizeof(ill_buf));
+ allocate(256*1024*1024);
+ return foo(2);
+}