diff --git a/src/libcore/gc.rs b/src/libcore/gc.rs index 9fd9ac3a8c8ec..7262c4f58f50a 100644 --- a/src/libcore/gc.rs +++ b/src/libcore/gc.rs @@ -73,6 +73,7 @@ pub mod rustrt { pub unsafe fn rust_gc_metadata() -> *Word; pub unsafe fn rust_get_stack_segment() -> *StackSegment; + pub unsafe fn rust_get_c_stack() -> *StackSegment; } } diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index 3c6cc9d924522..a2bbaf80c0aa8 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -544,6 +544,11 @@ rust_get_stack_segment() { return rust_get_current_task()->stk; } +extern "C" CDECL stk_seg * +rust_get_c_stack() { + return rust_get_current_task()->get_c_stack(); +} + extern "C" CDECL void start_task(rust_task *target, fn_env_pair *f) { target->start(f->f, f->env, NULL); diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h index 00d20fefc0ee5..a529db7d31752 100644 --- a/src/rt/rust_task.h +++ b/src/rt/rust_task.h @@ -367,6 +367,7 @@ rust_task : public kernel_owned void call_on_c_stack(void *args, void *fn_ptr); void call_on_rust_stack(void *args, void *fn_ptr); bool have_c_stack() { return c_stack != NULL; } + stk_seg *get_c_stack() { return c_stack; } rust_task_state get_state() { return state; } rust_cond *get_cond() { return cond; } diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index 73dbe661d3f86..b7ca28d5960da 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -48,6 +48,7 @@ rust_task_yield rust_task_is_unwinding rust_get_task rust_get_stack_segment +rust_get_c_stack rust_log_str start_task vec_reserve_shared_actual