X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-assem.S;h=0669b4446e375481fc192c95a08705a668a0aa1e;hb=d501bef3a93da4f14f1e85b852c2e01ee1df2907;hp=cd0656387750ca3ea4bcf642c139c0e975de2eab;hpb=3c65762b927af861c9c8bc416e4cbac9a14ec0c3;p=sbcl.git diff --git a/src/runtime/x86-assem.S b/src/runtime/x86-assem.S index cd06563..0669b44 100644 --- a/src/runtime/x86-assem.S +++ b/src/runtime/x86-assem.S @@ -16,7 +16,12 @@ #define LANGUAGE_ASSEMBLY #include "validate.h" #include "sbcl.h" - +#include "genesis/closure.h" +#include "genesis/fdefn.h" +#include "genesis/static-symbols.h" +#include "genesis/symbol.h" +#include "genesis/thread.h" + /* Minimize conditionalization for different OS naming schemes. */ #if defined __linux__ || defined __FreeBSD__ /* (but *not* OpenBSD) */ #define GNAME(var) var @@ -38,6 +43,7 @@ .text .global GNAME(foreign_function_call_active) + .global GNAME(all_threads) /* @@ -122,19 +128,38 @@ 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. @@ -173,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. */ @@ -262,11 +278,7 @@ GNAME(undefined_tramp): int3 .byte trap_Error .byte 2 -#ifdef LONG_FLOAT_WIDETAG - .byte 24 -#else - .byte 23 -#endif + .byte UNDEFINED_FUN_ERROR .byte sc_DescriptorReg # eax in the Descriptor-reg SC ret .size GNAME(undefined_tramp), .-GNAME(undefined_tramp) @@ -328,11 +340,13 @@ GNAME(do_pending_interrupt): ret .size GNAME(do_pending_interrupt),.-GNAME(do_pending_interrupt) -#ifdef GENCGC +#ifdef LISP_FEATURE_GENCGC /* This is a fast bzero using the FPU. The first argument is the start * address which needs to be aligned on an 8 byte boundary, the second * argument is the number of bytes, which must be a nonzero multiple * of 8 bytes. */ +/* FIXME whether this is still faster than using the OS's bzero or + * equivalent, we don't know */ .text .globl GNAME(i586_bzero) .type GNAME(i586_bzero),@function @@ -659,7 +673,7 @@ GNAME(alloc_16_to_edi): -#ifdef GENCGC +#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.