aboutsummaryrefslogtreecommitdiff
path: root/test/shadowcallstack/minimal_runtime.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/shadowcallstack/minimal_runtime.h')
-rw-r--r--test/shadowcallstack/minimal_runtime.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/test/shadowcallstack/minimal_runtime.h b/test/shadowcallstack/minimal_runtime.h
new file mode 100644
index 000000000000..f36fa5a7d245
--- /dev/null
+++ b/test/shadowcallstack/minimal_runtime.h
@@ -0,0 +1,43 @@
+// A shadow call stack runtime is not yet included with compiler-rt, provide a
+// minimal runtime to allocate a shadow call stack and assign an
+// architecture-specific register to point at it.
+
+#pragma once
+
+#ifdef __x86_64__
+#include <asm/prctl.h>
+int arch_prctl(int code, void *addr);
+#endif
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/prctl.h>
+
+#include "libc_support.h"
+
+__attribute__((no_sanitize("shadow-call-stack")))
+static void __shadowcallstack_init() {
+ void *stack = mmap(NULL, 8192, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (stack == MAP_FAILED)
+ abort();
+
+#if defined(__x86_64__)
+ if (arch_prctl(ARCH_SET_GS, stack))
+ abort();
+#elif defined(__aarch64__)
+ __asm__ __volatile__("mov x18, %0" ::"r"(stack));
+#else
+#error Unsupported platform
+#endif
+}
+
+int scs_main(void);
+
+__attribute__((no_sanitize("shadow-call-stack"))) int main(void) {
+ __shadowcallstack_init();
+
+ // We can't simply return scs_main() because scs_main might have corrupted our
+ // return address for testing purposes (see overflow.c), so we need to exit
+ // ourselves.
+ exit(scs_main());
+}