projects
/
sbcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
1.0.26.21: fix ERROR leaking memory
[sbcl.git]
/
src
/
runtime
/
x86-64-assem.S
diff --git
a/src/runtime/x86-64-assem.S
b/src/runtime/x86-64-assem.S
index
2e8e1c7
..
1b4ac54
100644
(file)
--- a/
src/runtime/x86-64-assem.S
+++ b/
src/runtime/x86-64-assem.S
@@
-25,15
+25,15
@@
#include "genesis/thread.h"
/* Minimize conditionalization for different OS naming schemes. */
#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 __sun
#define GNAME(var) var
#else
#define GNAME(var) _##var
#endif
#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. */
* want alignment in bytes. */
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun)
#define align_4byte 4
#define align_8byte 8
#define align_16byte 16
#define align_4byte 4
#define align_8byte 8
#define align_16byte 16
@@
-105,9
+105,6
@@
.globl GNAME(call_into_c)
TYPE(GNAME(call_into_c))
GNAME(call_into_c):
.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.
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))
.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 */
* here, because we never expect to return from the initial call to lisp
* anyway */
@@
-140,16
+136,12
@@
GNAME(call_into_c):
GNAME(call_into_lisp_first_time):
push %rbp # Save old frame pointer.
mov %rsp,%rbp # Establish new frame.
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
#else
movq GNAME(all_threads),%rax
#endif
#if defined(LISP_FEATURE_DARWIN)
movq GSYM(GNAME(all_threads)),%rax
#else
movq GNAME(all_threads),%rax
#endif
- 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
+ mov THREAD_CONTROL_STACK_END_OFFSET(%rax) ,%rsp
jmp Lstack
\f
.text
jmp Lstack
\f
.text
@@
-182,10
+174,19
@@
Lstack:
push %rsi #
push %rdx #
#ifdef LISP_FEATURE_SB_THREAD
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
mov specials,%rdi
- call pthread_getspecific
+#endif
+ call GNAME(pthread_getspecific)
mov %rax,%r12
#endif
mov %rax,%r12
#endif
+#endif
pop %rcx # num args
pop %rbx # arg vector
pop %rax # function ptr/lexenv
pop %rcx # num args
pop %rbx # arg vector
pop %rax # function ptr/lexenv
@@
-232,10
+233,6
@@
LsingleValue:
pop %r12
pop %rbx
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 */
/* FIXME Restore the NPX state. */
/* return value is already in rax where lisp expects it */
@@
-247,19
+244,17
@@
LsingleValue:
.text
.globl GNAME(fpu_save)
TYPE(GNAME(fpu_save))
.text
.globl GNAME(fpu_save)
TYPE(GNAME(fpu_save))
- .align 2,0x90
+ .align align_16byte,0x90
GNAME(fpu_save):
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))
ret
SIZE(GNAME(fpu_save))
.globl GNAME(fpu_restore)
TYPE(GNAME(fpu_restore))
- .align 2,0x90
+ .align align_16byte,0x90
GNAME(fpu_restore):
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
ret
SIZE(GNAME(fpu_restore))
\f
@@
-267,7
+262,7
@@
GNAME(fpu_restore):
* the undefined-function trampoline
*/
.text
* the undefined-function trampoline
*/
.text
- .align align_8byte,0x90
+ .align align_16byte,0x90
.globl GNAME(undefined_tramp)
TYPE(GNAME(undefined_tramp))
GNAME(undefined_tramp):
.globl GNAME(undefined_tramp)
TYPE(GNAME(undefined_tramp))
GNAME(undefined_tramp):
@@
-281,7
+276,7
@@
GNAME(undefined_tramp):
.text
.text
- .align align_8byte,0x90
+ .align align_16byte,0x90
.globl GNAME(alloc_tramp)
TYPE(GNAME(alloc_tramp))
GNAME(alloc_tramp):
.globl GNAME(alloc_tramp)
TYPE(GNAME(alloc_tramp))
GNAME(alloc_tramp):
@@
-317,7
+312,7
@@
GNAME(alloc_tramp):
* the closure trampoline
*/
.text
* the closure trampoline
*/
.text
- .align align_8byte,0x90
+ .align align_16byte,0x90
.globl GNAME(closure_tramp)
TYPE(GNAME(closure_tramp))
GNAME(closure_tramp):
.globl GNAME(closure_tramp)
TYPE(GNAME(closure_tramp))
GNAME(closure_tramp):
@@
-332,7
+327,7
@@
GNAME(closure_tramp):
SIZE(GNAME(closure_tramp))
.text
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
.globl GNAME(funcallable_instance_tramp)
#if !defined(LISP_FEATURE_DARWIN)
.type GNAME(funcallable_instance_tramp),@function
@@
-350,7
+345,7
@@
GNAME(closure_tramp):
*/
.text
.globl GNAME(fun_end_breakpoint_guts)
*/
.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
GNAME(fun_end_breakpoint_guts):
/* Multiple Value return */
jc multiple_value_return
@@
-370,6
+365,7
@@
GNAME(fun_end_breakpoint_guts):
multiple_value_return:
.globl GNAME(fun_end_breakpoint_trap)
multiple_value_return:
.globl GNAME(fun_end_breakpoint_trap)
+ .align align_16byte,0x90
GNAME(fun_end_breakpoint_trap):
TRAP
.byte trap_FunEndBreakpoint
GNAME(fun_end_breakpoint_trap):
TRAP
.byte trap_FunEndBreakpoint
@@
-381,7
+377,7
@@
GNAME(fun_end_breakpoint_end):
\f
.globl GNAME(do_pending_interrupt)
TYPE(GNAME(do_pending_interrupt))
\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
GNAME(do_pending_interrupt):
TRAP
.byte trap_PendingInterrupt
@@
-390,7
+386,7
@@
GNAME(do_pending_interrupt):
\f
.globl GNAME(post_signal_tramp)
TYPE(GNAME(post_signal_tramp))
\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
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
@@
-416,7
+412,7
@@
GNAME(post_signal_tramp):
SIZE(GNAME(post_signal_tramp))
\f
.text
SIZE(GNAME(post_signal_tramp))
\f
.text
- .align align_8byte,0x90
+ .align align_16byte,0x90
.globl GNAME(fast_bzero)
TYPE(GNAME(fast_bzero))
.globl GNAME(fast_bzero)
TYPE(GNAME(fast_bzero))