1.0.45.36: Fix solaris x86-64 page size issue
[sbcl.git] / src / runtime / x86-64-assem.S
index d0cc742..c29aceb 100644 (file)
 #include "genesis/thread.h"
        
 /* Minimize conditionalization for different OS naming schemes. */
-#if defined __linux__  || defined __FreeBSD__ /* (but *not* OpenBSD) */
+#if defined __linux__  || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __sun
 #define GNAME(var) var
 #else
 #define GNAME(var) _##var
 #endif
 
-/* Get the right type of alignment. Linux and FreeBSD (but not OpenBSD)
+/* Get the right type of alignment. Linux, FreeBSD and OpenBSD
  * want alignment in bytes. */
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined __NetBSD__ || defined(__sun)
 #define align_4byte    4
 #define align_8byte    8
 #define align_16byte   16
@@ -67,7 +67,7 @@
  * for this instruction in the SIGILL handler and if we see it, we
  * advance the EIP by two bytes to skip over ud2 instruction and
  * call sigtrap_handler. */
-#if defined(LISP_FEATURE_DARWIN)
+#if defined(LISP_FEATURE_UD2_BREAKPOINTS)
 #define TRAP ud2
 #else
 #define TRAP int3
        .globl  GNAME(call_into_c)
        TYPE(GNAME(call_into_c))
 GNAME(call_into_c):
-        /* ABI requires that the direction flag be clear on function
-         * entry and exit. */
-        cld
        push    %rbp            # Save old frame pointer.
        mov     %rsp,%rbp       # Establish new frame.
 
@@ -131,8 +128,7 @@ GNAME(call_into_c):
        .globl  GNAME(call_into_lisp_first_time)
        TYPE(GNAME(call_into_lisp_first_time))
                
-/* 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 
+/* We don't worry too much about saving registers 
  * here, because we never expect to return from the initial call to lisp 
  * anyway */
        
@@ -140,12 +136,12 @@ GNAME(call_into_c):
 GNAME(call_into_lisp_first_time):
        push    %rbp            # Save old frame pointer.
        mov     %rsp,%rbp       # Establish new frame.
-       mov     %rsp,ALIEN_STACK + SYMBOL_VALUE_OFFSET
+#if defined(LISP_FEATURE_DARWIN)
        movq    GSYM(GNAME(all_threads)),%rax
-       mov     THREAD_CONTROL_STACK_START_OFFSET(%rax) ,%rsp
-       /* don't think too hard about what happens if we get interrupted
-       * here */
-        add    $(THREAD_CONTROL_STACK_SIZE)-16,%rsp
+#else
+        movq    GNAME(all_threads),%rax
+#endif
+       mov     THREAD_CONTROL_STACK_END_OFFSET(%rax) ,%rsp
        jmp     Lstack
 \f
        .text   
@@ -178,10 +174,19 @@ Lstack:
        push    %rsi    #
        push    %rdx    #
 #ifdef LISP_FEATURE_SB_THREAD
+#ifdef LISP_FEATURE_GCC_TLS
+       movq    %fs:0, %rax
+       movq    GNAME(current_thread)@TPOFF(%rax), %r12
+#else
+#ifdef LISP_FEATURE_DARWIN
+       mov     GSYM(GNAME(specials)),%rdi
+#else
        mov     specials,%rdi
-       call    pthread_getspecific
+#endif
+       call    GNAME(pthread_getspecific)
        mov     %rax,%r12
 #endif
+#endif
        pop     %rcx    # num args
        pop     %rbx    # arg vector
        pop     %rax    # function ptr/lexenv
@@ -204,10 +209,10 @@ Ldone:
        xor     %rbx,%rbx       # available
 
        /* Alloc new frame. */
-       mov     %rsp,%rbx       # The current sp marks start of new frame.
-       push    %rbp            # fp in save location S0
-       sub     $16,%rsp        # Ensure 3 slots are allocated, one above.
-       mov     %rbx,%rbp       # Switch to new frame.
+       push    %rbp            # Dummy for return address
+       push    %rbp            # fp in save location S1
+       mov     %rsp,%rbp       # The current sp marks start of new frame.
+       sub     $8,%rsp         # Ensure 3 slots are allocated, two above.
 
 Lcall:
        call    *CLOSURE_FUN_OFFSET(%rax)
@@ -228,13 +233,9 @@ LsingleValue:
        pop     %r12
        pop     %rbx
 
-        /* ABI requires that the direction flag be clear on function
-         * entry and exit. */
-        cld
-        
 /* FIXME Restore the NPX state. */
 
-       /* return value is already in rax where lisp expects it */
+       mov     %rdx,%rax       # c-val
        leave
        ret
        SIZE(GNAME(call_into_lisp))
@@ -243,19 +244,17 @@ LsingleValue:
        .text
        .globl  GNAME(fpu_save)
        TYPE(GNAME(fpu_save))
-       .align  2,0x90
+       .align  align_16byte,0x90
 GNAME(fpu_save):
-       mov     4(%rsp),%rax
-       fnsave  (%rax)          # Save the NPX state. (resets NPX)
+       fnsave  (%rdi)          # Save the NPX state. (resets NPX)
        ret
        SIZE(GNAME(fpu_save))
 
        .globl  GNAME(fpu_restore)
        TYPE(GNAME(fpu_restore))
-       .align  2,0x90
+       .align  align_16byte,0x90
 GNAME(fpu_restore):
-       mov     4(%rsp),%rax
-       frstor  (%rax)          # Restore the NPX state.
+       frstor  (%rdi)          # Restore the NPX state.
        ret
        SIZE(GNAME(fpu_restore))
 \f
@@ -263,10 +262,11 @@ GNAME(fpu_restore):
  * the undefined-function trampoline
  */
        .text
-       .align  align_8byte,0x90
+       .align  align_16byte,0x90
        .globl  GNAME(undefined_tramp)
        TYPE(GNAME(undefined_tramp))
 GNAME(undefined_tramp):
+       pop     8(%rbp)         # Save return PC for backtrace.
        TRAP
        .byte   trap_Error
         .byte   2
@@ -277,7 +277,7 @@ GNAME(undefined_tramp):
 
 
        .text
-       .align  align_8byte,0x90
+       .align  align_16byte,0x90
        .globl  GNAME(alloc_tramp)
        TYPE(GNAME(alloc_tramp))
 GNAME(alloc_tramp):
@@ -313,7 +313,7 @@ GNAME(alloc_tramp):
  * the closure trampoline
  */
        .text
-       .align  align_8byte,0x90
+       .align  align_16byte,0x90
        .globl  GNAME(closure_tramp)
        TYPE(GNAME(closure_tramp))
 GNAME(closure_tramp):
@@ -328,7 +328,7 @@ GNAME(closure_tramp):
        SIZE(GNAME(closure_tramp))
 
        .text
-       .align  align_8byte,0x90
+       .align  align_16byte,0x90
        .globl  GNAME(funcallable_instance_tramp)
 #if !defined(LISP_FEATURE_DARWIN)
         .type  GNAME(funcallable_instance_tramp),@function
@@ -346,7 +346,7 @@ GNAME(closure_tramp):
  */
        .text
        .globl  GNAME(fun_end_breakpoint_guts)
-       .align  align_8byte
+       .align  align_16byte
 GNAME(fun_end_breakpoint_guts):
        /* Multiple Value return */
        jc      multiple_value_return
@@ -366,6 +366,7 @@ GNAME(fun_end_breakpoint_guts):
 multiple_value_return:
        
        .globl  GNAME(fun_end_breakpoint_trap)
+       .align  align_16byte,0x90
 GNAME(fun_end_breakpoint_trap):
        TRAP
        .byte   trap_FunEndBreakpoint
@@ -377,7 +378,7 @@ GNAME(fun_end_breakpoint_end):
 \f
        .globl  GNAME(do_pending_interrupt)
        TYPE(GNAME(do_pending_interrupt))
-       .align  align_8byte,0x90
+       .align  align_16byte,0x90
 GNAME(do_pending_interrupt):
        TRAP
        .byte   trap_PendingInterrupt
@@ -386,7 +387,7 @@ GNAME(do_pending_interrupt):
 \f
        .globl  GNAME(post_signal_tramp)
        TYPE(GNAME(post_signal_tramp))
-       .align  align_8byte,0x90
+       .align  align_16byte,0x90
 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 
@@ -412,7 +413,7 @@ GNAME(post_signal_tramp):
        SIZE(GNAME(post_signal_tramp))
 \f
        .text
-       .align  align_8byte,0x90
+       .align  align_16byte,0x90
        .globl  GNAME(fast_bzero)
        TYPE(GNAME(fast_bzero))