Update of /cvsroot/sbcl/sbcl/src/runtime
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8613/src/runtime
Modified Files:
interrupt.c x86-assem.S
Log Message:
0.8.15.7
Threading fixes :
- bind *restart-clusters* *handler-clusters*
*condition-restarts* at thread entry: inter-thread restarts
don't work (nor is it clear what they'd do if they did)
- threads exit when their initial function returns, no need to
call unix-exit (which may do interesting things with file
buffers that we'd rather didn't happen)
arrange_return_to_lisp_function wasn't restoring esp
properly. Not sure it ever makes a difference in practice,
but fix it anyway.
Index: interrupt.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/interrupt.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -d -r1.63 -r1.64
--- interrupt.c 14 Sep 2004 18:11:25 -0000 1.63
+++ interrupt.c 3 Oct 2004 00:57:14 -0000 1.64
@@ -625,10 +625,31 @@
#ifdef LISP_FEATURE_X86
/* Suppose the existence of some function that saved all
* registers, called call_into_lisp, then restored GP registers and
- * returned. We shortcut this: fake the stack that call_into_lisp
- * would see, then arrange to have it called directly. post_signal_tramp
- * is the second half of this function
+ * returned. It would look something like this:
+
+ push ebp
+ mov ebp esp
+ pushad
+ push $0
+ push $0
+ pushl {address of function to call}
+ call 0x8058db0 <call_into_lisp>
+ addl $12,%esp
+ popa
+ leave
+ ret
+
+ * What we do here is set up the stack that call_into_lisp would
+ * expect to see if it had been called by this code, and frob the
+ * signal context so that signal return goes directly to call_into_lisp,
+ * and when that function (and the lisp function it invoked) returns,
+ * it returns to the second half of this imaginary function which
+ * restores all registers and returns to C
+
+ * For this to work, the latter part of the imaginary function
+ * must obviously exist in reality. That would be post_signal_tramp
*/
+
u32 *sp=(u32 *)*os_context_register_addr(context,reg_ESP);
*(sp-14) = post_signal_tramp; /* return address for call_into_lisp */
@@ -638,9 +659,9 @@
/* this order matches that used in POPAD */
*(sp-10)=*os_context_register_addr(context,reg_EDI);
*(sp-9)=*os_context_register_addr(context,reg_ESI);
- /* this gets overwritten again before it's used, anyway */
- *(sp-8)=*os_context_register_addr(context,reg_EBP);
- *(sp-7)=0 ; /* POPAD doesn't set ESP, but expects a gap for it anyway */
+
+ *(sp-8)=*os_context_register_addr(context,reg_ESP)-8;
+ *(sp-7)=0;
*(sp-6)=*os_context_register_addr(context,reg_EBX);
*(sp-5)=*os_context_register_addr(context,reg_EDX);
Index: x86-assem.S
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-assem.S,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- x86-assem.S 29 Jul 2004 22:41:27 -0000 1.18
+++ x86-assem.S 3 Oct 2004 00:57:14 -0000 1.19
@@ -801,7 +801,7 @@
* using return_to_lisp_function */
addl $12,%esp /* clear call_into_lisp args from stack */
popa /* restore registers */
- popl %ebp
+ leave
ret
.size GNAME(post_signal_tramp),.-GNAME(post_signal_tramp)
|