about summary refs log tree commit diff
path: root/src/rt/rust_stack.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-02-08 15:28:25 -0800
committerBrian Anderson <banderson@mozilla.com>2012-02-09 19:00:15 -0800
commite0d5b92b84424b5b1dbd2dec7d32e92e1550832b (patch)
tree82e9a9ba272b53b0c87871503ec8fb649cca12ee /src/rt/rust_stack.cpp
parent2983e77383edd852bb30a022e4599e7c42670ac5 (diff)
downloadrust-e0d5b92b84424b5b1dbd2dec7d32e92e1550832b.tar.gz
rust-e0d5b92b84424b5b1dbd2dec7d32e92e1550832b.zip
rt: Begin moving stack-building functions to rust_stack.cpp
Diffstat (limited to 'src/rt/rust_stack.cpp')
-rw-r--r--src/rt/rust_stack.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/rt/rust_stack.cpp b/src/rt/rust_stack.cpp
new file mode 100644
index 00000000000..c3cde81925f
--- /dev/null
+++ b/src/rt/rust_stack.cpp
@@ -0,0 +1,42 @@
+#include "rust_internal.h"
+
+#include "vg/valgrind.h"
+#include "vg/memcheck.h"
+
+// A value that goes at the end of the stack and must not be touched
+const uint8_t stack_canary[] = {0xAB, 0xCD, 0xAB, 0xCD,
+                                0xAB, 0xCD, 0xAB, 0xCD,
+                                0xAB, 0xCD, 0xAB, 0xCD,
+                                0xAB, 0xCD, 0xAB, 0xCD};
+
+void
+config_valgrind_stack(stk_seg *stk) {
+    stk->valgrind_id =
+        VALGRIND_STACK_REGISTER(&stk->data[0],
+                                stk->end);
+#ifndef NVALGRIND
+    // Establish that the stack is accessible.  This must be done when reusing
+    // old stack segments, since the act of popping the stack previously
+    // caused valgrind to consider the whole thing inaccessible.
+    size_t sz = stk->end - (uintptr_t)&stk->data[0];
+    VALGRIND_MAKE_MEM_UNDEFINED(stk->data + sizeof(stack_canary),
+                                sz - sizeof(stack_canary));
+#endif
+}
+
+void
+unconfig_valgrind_stack(stk_seg *stk) {
+    VALGRIND_STACK_DEREGISTER(stk->valgrind_id);
+}
+
+void
+add_stack_canary(stk_seg *stk) {
+    memcpy(stk->data, stack_canary, sizeof(stack_canary));
+    assert(sizeof(stack_canary) == 16 && "Stack canary was not the expected size");
+}
+
+void
+check_stack_canary(stk_seg *stk) {
+    assert(!memcmp(stk->data, stack_canary, sizeof(stack_canary))
+      && "Somebody killed the canary");
+}