rt: Don't zero new stacks

This commit is contained in:
Brian Anderson 2012-02-27 15:42:22 -08:00
parent b3f77bf927
commit 7e9aa6c3c2
5 changed files with 27 additions and 32 deletions

View File

@ -59,6 +59,7 @@ public:
void *malloc(size_t size, const char *tag);
void *realloc(void *mem, size_t size);
void free(void *mem);
memory_region *region() { return &_region; }
void fail();

View File

@ -41,3 +41,20 @@ void
check_stack_canary(stk_seg *stk) {
assert(stk->canary == canary_value && "Somebody killed the canary");
}
stk_seg *
create_stack(memory_region *region, size_t sz) {
size_t total_sz = sizeof(stk_seg) + sz;
stk_seg *stk = (stk_seg *)region->malloc(total_sz, "stack", false);
memset(stk, 0, sizeof(stk_seg));
stk->end = (uintptr_t) &stk->data[sz];
add_stack_canary(stk);
register_valgrind_stack(stk);
return stk;
}
void
destroy_stack(memory_region *region, stk_seg *stk) {
deregister_valgrind_stack(stk);
region->free(stk);
}

View File

@ -1,6 +1,8 @@
#ifndef RUST_STACK_H
#define RUST_STACK_H
#include "memory_region.h"
struct stk_seg {
stk_seg *prev;
stk_seg *next;
@ -15,36 +17,11 @@ struct stk_seg {
uint8_t data[];
};
// Used by create_stack
void
register_valgrind_stack(stk_seg *stk);
// Used by destroy_stack
void
deregister_valgrind_stack(stk_seg *stk);
// Used by create_stack
void
add_stack_canary(stk_seg *stk);
template <class T>
stk_seg *
create_stack(T allocer, size_t sz) {
size_t total_sz = sizeof(stk_seg) + sz;
stk_seg *stk = (stk_seg *)allocer->malloc(total_sz, "stack");
memset(stk, 0, sizeof(stk_seg));
stk->end = (uintptr_t) &stk->data[sz];
add_stack_canary(stk);
register_valgrind_stack(stk);
return stk;
}
create_stack(memory_region *region, size_t sz);
template <class T>
void
destroy_stack(T allocer, stk_seg *stk) {
deregister_valgrind_stack(stk);
allocer->free(stk);
}
destroy_stack(memory_region *region, stk_seg *stk);
// Must be called before each time a stack is reused to tell valgrind
// that the stack is accessible.

View File

@ -552,7 +552,7 @@ void
rust_task::free_stack(stk_seg *stk) {
LOGPTR(thread, "freeing stk segment", (uintptr_t)stk);
total_stack_sz -= user_stack_size(stk);
destroy_stack(this, stk);
destroy_stack(&local_region, stk);
}
void
@ -596,7 +596,7 @@ rust_task::new_stack(size_t requested_sz) {
}
size_t sz = rust_stk_sz + RED_ZONE_SIZE;
stk_seg *new_stk = create_stack(this, sz);
stk_seg *new_stk = create_stack(&local_region, sz);
LOGPTR(thread, "new stk", (uintptr_t)new_stk);
new_stk->prev = NULL;
new_stk->next = stk;

View File

@ -290,7 +290,7 @@ rust_task_thread::start_main_loop() {
I(this, !extra_c_stack);
if (cached_c_stack) {
destroy_stack(kernel, cached_c_stack);
destroy_stack(kernel->region(), cached_c_stack);
cached_c_stack = NULL;
}
}
@ -369,7 +369,7 @@ void
rust_task_thread::prepare_c_stack(rust_task *task) {
I(this, !extra_c_stack);
if (!cached_c_stack && !task->have_c_stack()) {
cached_c_stack = create_stack(kernel, C_STACK_SIZE);
cached_c_stack = create_stack(kernel->region(), C_STACK_SIZE);
prepare_valgrind_stack(cached_c_stack);
}
}
@ -377,7 +377,7 @@ rust_task_thread::prepare_c_stack(rust_task *task) {
void
rust_task_thread::unprepare_c_stack() {
if (extra_c_stack) {
destroy_stack(kernel, extra_c_stack);
destroy_stack(kernel->region(), extra_c_stack);
extra_c_stack = NULL;
}
}