diff --git a/src/libcore/gc.rs b/src/libcore/gc.rs index ec2658147c5a5..71d9ab439f34f 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 a0db6f64f69fc..ee025a39ff472 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -549,6 +549,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 34d5a5a86f2d7..7aa216042039f 100644 --- a/src/rt/rust_task.h +++ b/src/rt/rust_task.h @@ -374,6 +374,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 cfc7abac6eb81..977e0248ca206 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -49,6 +49,7 @@ rust_task_is_unwinding rust_get_task rust_try_get_task rust_get_stack_segment +rust_get_c_stack rust_log_str start_task vec_reserve_shared_actual