about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-09-28 12:26:36 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-09-28 12:26:36 -0700
commitd8a80cb31fd8a7a0e6e07df7d5a6aeff6609507e (patch)
tree160a98015f9ce8ecbd9da1435a368478c5b006f5 /src
parent1eaaae860fb725f5afdd8912fb2200f4f9929daa (diff)
downloadrust-d8a80cb31fd8a7a0e6e07df7d5a6aeff6609507e.tar.gz
rust-d8a80cb31fd8a7a0e6e07df7d5a6aeff6609507e.zip
rt: Add a call stub that switches to the C stack, untested as of yet
Diffstat (limited to 'src')
-rw-r--r--src/rt/arch/i386/ccall.S14
-rw-r--r--src/rt/arch/i386/context.h1
-rw-r--r--src/rt/rustrt.def.in1
3 files changed, 16 insertions, 0 deletions
diff --git a/src/rt/arch/i386/ccall.S b/src/rt/arch/i386/ccall.S
new file mode 100644
index 00000000000..7adecc4c5d2
--- /dev/null
+++ b/src/rt/arch/i386/ccall.S
@@ -0,0 +1,14 @@
+    .text
+
+// upcall_call_c_stack(void (*fn)(), void *new_esp)
+.globl _upcall_call_c_stack
+_upcall_call_c_stack:
+    movl %esp,%ecx          // grab esp
+    movl 8(%esp),%eax       // save fn
+    movl 12(%esp),%esp      // switch stack
+    pushl %ecx              // save esp on stack
+    calll *%eax
+    popl %esp               // restore esp
+    ret
+
+
diff --git a/src/rt/arch/i386/context.h b/src/rt/arch/i386/context.h
index a31b4c48d14..9a225b79606 100644
--- a/src/rt/arch/i386/context.h
+++ b/src/rt/arch/i386/context.h
@@ -37,6 +37,7 @@ public:
 
   void swap(context &out);
   void call(void *f, void *arg, void *sp);
+  void call(void *f, void *sp);
 
   // Note that this doesn't actually adjust esp. Instead, we adjust esp when
   // we actually do the call. This is needed for exception safety -- if the
diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in
index f5f75d61c94..d7caebe41a1 100644
--- a/src/rt/rustrt.def.in
+++ b/src/rt/rustrt.def.in
@@ -66,6 +66,7 @@ task_yield
 task_join
 unsupervise
 upcall_alloc_c_stack
+upcall_call_c_stack
 upcall_cmp_type
 upcall_dynastack_alloc
 upcall_dynastack_alloc_2