rt: Don't zero new stacks
This commit is contained in:
parent
b3f77bf927
commit
7e9aa6c3c2
5 changed files with 27 additions and 32 deletions
|
@ -59,6 +59,7 @@ public:
|
||||||
void *malloc(size_t size, const char *tag);
|
void *malloc(size_t size, const char *tag);
|
||||||
void *realloc(void *mem, size_t size);
|
void *realloc(void *mem, size_t size);
|
||||||
void free(void *mem);
|
void free(void *mem);
|
||||||
|
memory_region *region() { return &_region; }
|
||||||
|
|
||||||
void fail();
|
void fail();
|
||||||
|
|
||||||
|
|
|
@ -41,3 +41,20 @@ void
|
||||||
check_stack_canary(stk_seg *stk) {
|
check_stack_canary(stk_seg *stk) {
|
||||||
assert(stk->canary == canary_value && "Somebody killed the canary");
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef RUST_STACK_H
|
#ifndef RUST_STACK_H
|
||||||
#define RUST_STACK_H
|
#define RUST_STACK_H
|
||||||
|
|
||||||
|
#include "memory_region.h"
|
||||||
|
|
||||||
struct stk_seg {
|
struct stk_seg {
|
||||||
stk_seg *prev;
|
stk_seg *prev;
|
||||||
stk_seg *next;
|
stk_seg *next;
|
||||||
|
@ -15,36 +17,11 @@ struct stk_seg {
|
||||||
uint8_t data[];
|
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 *
|
stk_seg *
|
||||||
create_stack(T allocer, size_t sz) {
|
create_stack(memory_region *region, 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
void
|
void
|
||||||
destroy_stack(T allocer, stk_seg *stk) {
|
destroy_stack(memory_region *region, stk_seg *stk);
|
||||||
deregister_valgrind_stack(stk);
|
|
||||||
allocer->free(stk);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must be called before each time a stack is reused to tell valgrind
|
// Must be called before each time a stack is reused to tell valgrind
|
||||||
// that the stack is accessible.
|
// that the stack is accessible.
|
||||||
|
|
|
@ -552,7 +552,7 @@ void
|
||||||
rust_task::free_stack(stk_seg *stk) {
|
rust_task::free_stack(stk_seg *stk) {
|
||||||
LOGPTR(thread, "freeing stk segment", (uintptr_t)stk);
|
LOGPTR(thread, "freeing stk segment", (uintptr_t)stk);
|
||||||
total_stack_sz -= user_stack_size(stk);
|
total_stack_sz -= user_stack_size(stk);
|
||||||
destroy_stack(this, stk);
|
destroy_stack(&local_region, stk);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -596,7 +596,7 @@ rust_task::new_stack(size_t requested_sz) {
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t sz = rust_stk_sz + RED_ZONE_SIZE;
|
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);
|
LOGPTR(thread, "new stk", (uintptr_t)new_stk);
|
||||||
new_stk->prev = NULL;
|
new_stk->prev = NULL;
|
||||||
new_stk->next = stk;
|
new_stk->next = stk;
|
||||||
|
|
|
@ -290,7 +290,7 @@ rust_task_thread::start_main_loop() {
|
||||||
|
|
||||||
I(this, !extra_c_stack);
|
I(this, !extra_c_stack);
|
||||||
if (cached_c_stack) {
|
if (cached_c_stack) {
|
||||||
destroy_stack(kernel, cached_c_stack);
|
destroy_stack(kernel->region(), cached_c_stack);
|
||||||
cached_c_stack = NULL;
|
cached_c_stack = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,7 +369,7 @@ void
|
||||||
rust_task_thread::prepare_c_stack(rust_task *task) {
|
rust_task_thread::prepare_c_stack(rust_task *task) {
|
||||||
I(this, !extra_c_stack);
|
I(this, !extra_c_stack);
|
||||||
if (!cached_c_stack && !task->have_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);
|
prepare_valgrind_stack(cached_c_stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -377,7 +377,7 @@ rust_task_thread::prepare_c_stack(rust_task *task) {
|
||||||
void
|
void
|
||||||
rust_task_thread::unprepare_c_stack() {
|
rust_task_thread::unprepare_c_stack() {
|
||||||
if (extra_c_stack) {
|
if (extra_c_stack) {
|
||||||
destroy_stack(kernel, extra_c_stack);
|
destroy_stack(kernel->region(), extra_c_stack);
|
||||||
extra_c_stack = NULL;
|
extra_c_stack = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue