about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Chugunov <vadimcn@gmail.com>2014-07-05 00:47:09 -0700
committerVadim Chugunov <vadimcn@gmail.com>2014-08-04 17:43:47 -0700
commitbf76e0023114fb47cc8fc766dc2f3d5db8c696a2 (patch)
treecd269e2e354f879eacc6a8afa1e628f45cd3ae7b
parentbf420e58c2f88c8f37f83aaf947e7abba1cd7f79 (diff)
downloadrust-bf76e0023114fb47cc8fc766dc2f3d5db8c696a2.tar.gz
rust-bf76e0023114fb47cc8fc766dc2f3d5db8c696a2.zip
libnative should not mess with stack limits in the TIB. Only libgreen has a legitimate need to set them.
-rw-r--r--src/libgreen/context.rs4
-rw-r--r--src/librustrt/stack.rs7
2 files changed, 8 insertions, 3 deletions
diff --git a/src/libgreen/context.rs b/src/libgreen/context.rs
index 45f41181bf8..d681e53af42 100644
--- a/src/libgreen/context.rs
+++ b/src/libgreen/context.rs
@@ -105,11 +105,11 @@ impl Context {
             // invalid for the current task. Lucky for us `rust_swap_registers`
             // is a C function so we don't have to worry about that!
             match in_context.stack_bounds {
-                Some((lo, hi)) => stack::record_stack_bounds(lo, hi),
+                Some((lo, hi)) => stack::record_stack_bounds_green(lo, hi),
                 // If we're going back to one of the original contexts or
                 // something that's possibly not a "normal task", then reset
                 // the stack limit to 0 to make morestack never fail
-                None => stack::record_stack_bounds(0, uint::MAX),
+                None => stack::record_stack_bounds_green(0, uint::MAX),
             }
             rust_swap_registers(out_regs, in_regs)
         }
diff --git a/src/librustrt/stack.rs b/src/librustrt/stack.rs
index 6544c020e09..a79f453cf1e 100644
--- a/src/librustrt/stack.rs
+++ b/src/librustrt/stack.rs
@@ -125,7 +125,7 @@ extern fn stack_exhausted() {
 }
 
 #[inline(always)]
-pub unsafe fn record_stack_bounds(stack_lo: uint, stack_hi: uint) {
+pub unsafe fn record_stack_bounds_green(stack_lo: uint, stack_hi: uint) {
     // When the old runtime had segmented stacks, it used a calculation that was
     // "limit + RED_ZONE + FUDGE". The red zone was for things like dynamic
     // symbol resolution, llvm function calls, etc. In theory this red zone
@@ -154,6 +154,11 @@ pub unsafe fn record_stack_bounds(stack_lo: uint, stack_hi: uint) {
     }
 }
 
+#[inline(always)]
+pub unsafe fn record_stack_bounds(stack_lo: uint, _stack_hi: uint) {
+    record_sp_limit(stack_lo + RED_ZONE);
+}
+
 /// Records the current limit of the stack as specified by `end`.
 ///
 /// This is stored in an OS-dependent location, likely inside of the thread