diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-02-08 15:28:25 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-02-09 19:00:15 -0800 |
| commit | e0d5b92b84424b5b1dbd2dec7d32e92e1550832b (patch) | |
| tree | 82e9a9ba272b53b0c87871503ec8fb649cca12ee /src/rt/rust_stack.cpp | |
| parent | 2983e77383edd852bb30a022e4599e7c42670ac5 (diff) | |
| download | rust-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.cpp | 42 |
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"); +} |
