X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-assem.S;h=c4f543593fb90962f45082443d01800888c78c98;hb=d94c1b4a8c534bde146823f56558faf37cd4c4d7;hp=8cfd582f71dd77dc63ae8af80908043da4f84fbc;hpb=1cf1afff10cfc48a2f4a26fd4533531081602219;p=sbcl.git diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index 8cfd582..c4f5435 100644 --- 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. */ -#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 @@ -105,9 +105,6 @@ .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,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. - 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 - 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 .text @@ -182,6 +174,10 @@ 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 @@ -190,6 +186,7 @@ Lstack: call GNAME(pthread_getspecific) mov %rax,%r12 #endif +#endif pop %rcx # num args pop %rbx # arg vector pop %rax # function ptr/lexenv @@ -197,7 +194,7 @@ Lstack: xor %rdx,%rdx # clear any descriptor registers xor %rdi,%rdi # that we can't be sure we'll xor %rsi,%rsi # initialise properly. XX do r8-r15 too? - shl $3,%rcx # (fixnumize num-args) + shl $(N_FIXNUM_TAG_BITS),%rcx # (fixnumize num-args) cmp $0,%rcx je Ldone mov 0(%rbx),%rdx # arg0 @@ -212,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) @@ -236,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)) @@ -251,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)) @@ -275,6 +266,7 @@ GNAME(fpu_restore): .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 @@ -352,6 +344,12 @@ GNAME(closure_tramp): /* * fun-end breakpoint magic */ + +/* + * For an explanation of the magic involved in function-end + * breakpoints, see the implementation in ppc-assem.S. + */ + .text .globl GNAME(fun_end_breakpoint_guts) .align align_16byte @@ -374,6 +372,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