X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-assem.S;h=f5c6b63037bbf850b9013fd575cab763a3cdfd48;hb=c3699db2053ff3b5ac6a98d4431c3789496002d8;hp=19584b94d2929dd7f8c0350ba1e7805af45a78f2;hpb=3bb2fb5b9ecdeebecaded4ac6e5af0f653be8867;p=sbcl.git diff --git a/src/runtime/x86-assem.S b/src/runtime/x86-assem.S index 19584b9..f5c6b63 100644 --- a/src/runtime/x86-assem.S +++ b/src/runtime/x86-assem.S @@ -19,8 +19,8 @@ #include "genesis/closure.h" #include "genesis/fdefn.h" #include "genesis/static-symbols.h" -#include "genesis/symbol.h" - +#include "genesis/symbol.h" +#include "genesis/thread.h" /* Minimize conditionalization for different OS naming schemes. */ #if defined __linux__ || defined __FreeBSD__ /* (but *not* OpenBSD) */ @@ -43,6 +43,7 @@ .text .global GNAME(foreign_function_call_active) + .global GNAME(all_threads) /* @@ -127,23 +128,42 @@ Lfp_rtn_value: .text + .global GNAME(call_into_lisp_first_time) + .type GNAME(call_into_lisp_first_time),@function + +/* The *ALIEN-STACK* pointer is set up on the first call_into_lisp when + * the stack changes. We don't worry too much about saving registers + * here, because we never expect to return from the initial call to lisp + * anyway */ + + .align align_16byte,0x90 +GNAME(call_into_lisp_first_time): + pushl %ebp # Save old frame pointer. + movl %esp,%ebp # Establish new frame. + movl %esp,ALIEN_STACK + SYMBOL_VALUE_OFFSET + movl GNAME(all_threads),%eax + movl THREAD_CONTROL_STACK_START_OFFSET(%eax) ,%esp + /* don't think too hard about what happens if we get interrupted + * here */ + addl $THREAD_CONTROL_STACK_SIZE-4,%esp + jmp Lstack + + .text .global GNAME(call_into_lisp) .type GNAME(call_into_lisp),@function /* The C conventions require that ebx, esi, edi, and ebp be preserved * across function calls. */ -/* The *ALIEN-STACK* pointer is set up on the first call_into_lisp when - * the stack changes. */ .align align_16byte,0x90 GNAME(call_into_lisp): pushl %ebp # Save old frame pointer. movl %esp,%ebp # Establish new frame. - +Lstack: /* Save the NPX state */ fwait # Catch any pending NPX exceptions. subl $108,%esp # Make room for the NPX state. - fnsave (%esp) # resets NPX + fnsave (%esp) # save and reset NPX movl (%esp),%eax # Load NPX control word. andl $0xfffff3ff,%eax # Set rounding mode to nearest. @@ -178,15 +198,6 @@ GNAME(call_into_lisp): movl %eax, GNAME(foreign_function_call_active) movl %esp,%ebx # remember current stack - cmpl $CONTROL_STACK_START,%esp - jbe ChangeToLispStack - cmpl $CONTROL_STACK_END,%esp - jbe OnLispStack -ChangeToLispStack: - /* Setup the *alien-stack* pointer */ - movl %esp,ALIEN_STACK + SYMBOL_VALUE_OFFSET - movl $CONTROL_STACK_END,%esp # new stack -OnLispStack: pushl %ebx # Save entry stack on (maybe) new stack. /* Establish Lisp args. */ @@ -212,12 +223,12 @@ Ldone: sub $8,%esp # Ensure 3 slots are allocated, one above. mov %ebx,%ebp # Switch to new frame. - /* Indirect the closure. */ call *CLOSURE_FUN_OFFSET(%eax) - /* Multi-value return; blow off any extra values. */ + /* If the function returned multiple values, it will return to + this point. Lose them */ mov %ebx, %esp - /* single value return */ + /* A singled value function returns here */ /* Restore the stack, in case there was a stack change. */ popl %esp # c-sp @@ -661,8 +672,22 @@ GNAME(alloc_16_to_edi): .size GNAME(alloc_16_to_edi),.-GNAME(alloc_16_to_edi) + .align align_4byte,0x90 + .globl GNAME(post_signal_tramp) + .type GNAME(post_signal_tramp),@function +GNAME(post_signal_tramp): + /* this is notionally the second half of a function whose first half + * doesn't exist. This is where call_into_lisp returns when called + * using return_to_lisp_function */ + addl $12,%esp /* clear call_into_lisp args from stack */ + popa /* restore registers */ + popl %ebp + ret + .size GNAME(post_signal_tramp),.-GNAME(post_signal_tramp) + + -#ifdef LISP_FEATURE_GENCGC_INLINE_ALLOC /* disabled at present */ +#ifdef GENCGC_INLINE_ALLOC /* LISP_FEATURE_GENCGC */ /* These routines are called from Lisp when an inline allocation * overflows. Every register except the result needs to be preserved.