X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fx86_64%2Fasmpart.S;h=d03cf2e1ed68cad543d2692a838f4938fad8b387;hb=56f36393b3193056068f0f3712360d9929aec170;hp=9908172d25f5b71857891100309a676f87251f02;hpb=f6595d9a35e4a9b0af9b556b78dc4207534aa233;p=cacao.git diff --git a/src/vm/jit/x86_64/asmpart.S b/src/vm/jit/x86_64/asmpart.S index 9908172d2..d03cf2e1e 100644 --- a/src/vm/jit/x86_64/asmpart.S +++ b/src/vm/jit/x86_64/asmpart.S @@ -1,9 +1,9 @@ /* src/vm/jit/x86_64/asmpart.S - Java-C interface functions for x86_64 - Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates, - R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner, - C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger, - Institut f. Computersprachen - TU Wien + Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel, + C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring, + E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, + J. Wenninger, Institut f. Computersprachen - TU Wien This file is part of CACAO. @@ -19,162 +19,53 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. - Contact: cacao@complang.tuwien.ac.at + Contact: cacao@cacaojvm.org Authors: Andreas Krall Reinhard Grafl Christian Thalinger - $Id: asmpart.S 2285 2005-04-12 20:32:34Z twisti $ + Changes: Edwin Steiner + + $Id: asmpart.S 4643 2006-03-16 18:38:42Z edwin $ */ #include "config.h" -#include "vm/jit/x86_64/arch.h" -#include "vm/jit/x86_64/offsets.h" -#include "vm/jit/x86_64/asmoffsets.h" - - -/* XXX Don't remove this!!! ***************************************************/ - -#if offobjvftbl != 0 -#error OFFSET(java_objectheader, vftbl) != 0: this will break code patching! -#endif - -#if offvftblinterfacetable != 0 -#error OFFSET(vftbl_t, interfacetable[0]) != 0: this will break code patching! -#endif - -/******************************************************************************/ - - -/* define it like the risc way */ - -#define v0 %rax -#define v0l %eax - -#define a0 %rdi -#define a1 %rsi -#define a2 %rdx -#define a3 %rcx -#define a4 %r8 -#define a5 %r9 - -#define fa0 %xmm0 -#define fa1 %xmm1 -#define fa2 %xmm2 -#define fa3 %xmm3 -#define fa4 %xmm4 -#define fa5 %xmm5 -#define fa6 %xmm6 -#define fa7 %xmm7 - -#define itmp1 %rax -#define itmp2 %r10 -#define itmp3 %r11 - -#define itmp1l %eax -#define itmp2l %r10d -#define itmp3l %r11d - -#define itmp1b %al -#define itmp2b %r10b -#define itmp3b %r11b - -#define xptr itmp1 -#define xpc itmp2 - - -/* save and restore macros ****************************************************/ - -#define SAVE_ARGUMENT_REGISTERS \ - mov a0,0*8(%rsp) ; \ - mov a1,1*8(%rsp) ; \ - mov a2,2*8(%rsp) ; \ - mov a3,3*8(%rsp) ; \ - mov a4,4*8(%rsp) ; \ - mov a5,5*8(%rsp) ; \ - movq fa0,6*8(%rsp) ; \ - movq fa1,7*8(%rsp) ; \ - movq fa2,8*8(%rsp) ; \ - movq fa3,9*8(%rsp) ; \ - movq fa4,10*8(%rsp) ; \ - movq fa5,11*8(%rsp) ; \ - movq fa6,12*8(%rsp) ; \ - movq fa7,13*8(%rsp) ; - -#define RESTORE_ARGUMENT_REGISTERS \ - mov 0*8(%rsp),a0 ; \ - mov 1*8(%rsp),a1 ; \ - mov 2*8(%rsp),a2 ; \ - mov 3*8(%rsp),a3 ; \ - mov 4*8(%rsp),a4 ; \ - mov 5*8(%rsp),a5 ; \ - movq 6*8(%rsp),fa0 ; \ - movq 7*8(%rsp),fa1 ; \ - movq 8*8(%rsp),fa2 ; \ - movq 9*8(%rsp),fa3 ; \ - movq 10*8(%rsp),fa4 ; \ - movq 11*8(%rsp),fa5 ; \ - movq 12*8(%rsp),fa6 ; \ - movq 13*8(%rsp),fa7 ; - - -#define SAVE_TEMPORARY_REGISTERS \ - mov %rbx,14*8(%rsp) +#include "md-abi.h" +#include "md-asm.h" +#include "vm/jit/abi.h" +#include "vm/jit/x86_64/arch.h" +#include "vm/jit/x86_64/offsets.h" -#define RESTORE_TEMPORARY_REGISTERS \ - mov 14*8(%rsp),%rbx +#include "vm/jit/methodheader.h" .text -/********************* exported functions and variables ***********************/ - - .globl asm_calljavafunction - .globl asm_calljavafunction_int +/* exported functions and variables *******************************************/ - .globl asm_calljavafunction2 - .globl asm_calljavafunction2int - .globl asm_calljavafunction2long - .globl asm_calljavafunction2float - .globl asm_calljavafunction2double + .globl asm_vm_call_method + .globl asm_vm_call_method_int + .globl asm_vm_call_method_long + .globl asm_vm_call_method_float + .globl asm_vm_call_method_double .globl asm_call_jit_compiler .globl asm_handle_exception .globl asm_handle_nat_exception - .globl asm_patcher_get_putstatic - .globl asm_patcher_get_putfield - .globl asm_patcher_builtin_new - .globl asm_patcher_builtin_newarray - .globl asm_patcher_builtin_multianewarray - .globl asm_patcher_builtin_checkarraycast - .globl asm_patcher_builtin_arrayinstanceof - .globl asm_patcher_invokestatic_special - .globl asm_patcher_invokevirtual - .globl asm_patcher_invokeinterface - .globl asm_patcher_checkcast_instanceof_flags - .globl asm_patcher_checkcast_instanceof_interface - .globl asm_patcher_checkcast_class - .globl asm_patcher_instanceof_class - - .globl asm_check_clinit - - .globl asm_builtin_checkarraycast - .globl asm_builtin_aastore - -#if defined(USE_THREADS) - .globl asm_builtin_monitorenter - .globl asm_builtin_monitorexit -#endif + .globl asm_wrapper_patcher + + .globl asm_replacement_out + .globl asm_replacement_in .globl asm_builtin_f2i .globl asm_builtin_f2l @@ -186,66 +77,6 @@ .globl asm_switchstackandcall .globl asm_criticalsections .globl asm_getclassvalues_atomic - - -/********************* function asm_calljavafunction *************************** -* * -* This function calls a Java-method (which possibly needs compilation) * -* with up to 4 address parameters. * -* * -* This functions calls the JIT-compiler which eventually translates the * -* method into machine code. * -* * -* C-prototype: * -* javaobject_header *asm_calljavamethod (methodinfo *m, * -* void *arg1, void *arg2, void *arg3, void *arg4); * -* * -*******************************************************************************/ - -call_name: - .align 8 - - .quad 0 /* catch type all */ - .quad calljava_xhandler /* handler pc */ - .quad calljava_xhandler /* end pc */ - .quad asm_calljavafunction /* start pc */ - .long 1 /* extable size */ - .long 0 /* fltsave */ - .long 0 /* intsave */ - .long 0 /* isleaf */ - .long 0 /* IsSync */ - .long 8 /* frame size */ - .quad 0 /* method pointer (pointer to name) */ - -asm_calljavafunction: -asm_calljavafunction_int: - sub $(3*8),%rsp /* keep stack 16-byte aligned */ - mov %rbp,0*8(%rsp) - mov %rbx,1*8(%rsp) /* %rbx is not a callee saved in cacao */ - mov %rdi,%rax /* move function pointer to %rax */ - /* compilerstub uses this */ - - mov %rsi,%rdi /* pass remaining parameters */ - mov %rdx,%rsi - mov %rcx,%rdx - mov %r8,%rcx - - lea asm_call_jit_compiler,%r11 - call *%r11 /* call JIT compiler */ - - mov 0*8(%rsp),%rbp - mov 1*8(%rsp),%rbx - add $(3*8),%rsp /* free stack space */ - ret - -calljava_xhandler: - mov %rax,%rdi /* pass exception pointer */ - call builtin_throw_exception - mov 0*8(%rsp),%rbp - mov 1*8(%rsp),%rbx - add $(3*8),%rsp - xor %rax,%rax /* return NULL */ - ret /********************* function asm_calljavafunction *************************** @@ -262,62 +93,66 @@ calljava_xhandler: * * *******************************************************************************/ -call_name2: .align 8 - .quad 0 /* catch type all */ - .quad calljava_xhandler2 /* handler pc */ - .quad calljava_xhandler2 /* end pc */ - .quad asm_calljavafunction2 /* start pc */ - .long 1 /* extable size */ - .long 0 /* fltsave */ - .long 0 /* intsave */ - .long 0 /* isleaf */ - .long 0 /* IsSync */ - .long 24 /* frame size */ - .quad 0 /* method pointer (pointer to name) */ - -asm_calljavafunction2: -asm_calljavafunction2int: -asm_calljavafunction2long: -asm_calljavafunction2float: -asm_calljavafunction2double: - sub $(7*8),%rsp /* keep stack 16-byte aligned */ - mov %rbx,0*8(%rsp) /* %rbx is not a callee saved in cacao */ - mov %rbp,1*8(%rsp) - mov %r12,2*8(%rsp) - mov %r13,3*8(%rsp) - mov %r14,4*8(%rsp) - mov %r15,5*8(%rsp) - - mov %rdi,%rax /* move method pointer for compiler */ - xor %rbp,%rbp /* set argument stack frame to zero */ - - test %rsi,%rsi /* maybe we have no args... */ + .quad 0 /* catch type all */ + .quad calljava_xhandler2 /* handler pc */ + .quad calljava_xhandler2 /* end pc */ + .quad L_asm_vm_call_method /* start pc */ + .long 1 /* extable size */ + .long 0 + .quad 0 /* line number table start */ + .quad 0 /* line number table size */ + .long 0 + .long 0 /* fltsave */ + .long 0 /* intsave */ + .long 0 /* isleaf */ + .long 0 /* IsSync */ + .long 24 /* frame size */ + .quad 0 /* method pointer (pointer to name) */ + +asm_vm_call_method: +asm_vm_call_method_int: +asm_vm_call_method_long: +asm_vm_call_method_float: +asm_vm_call_method_double: +L_asm_vm_call_method: /* required for PIC code */ + sub $(7*8),sp /* keep stack 16-byte aligned */ + mov %rbx,0*8(sp) /* %rbx is not a callee saved in cacao*/ + mov s0,1*8(sp) + mov s1,2*8(sp) + mov s2,3*8(sp) + mov s3,4*8(sp) + mov s4,5*8(sp) + + mov a0,itmp1 /* move method pointer for compiler */ + xor %rbp,%rbp /* set argument stack frame to zero */ + + test a1,a1 /* maybe we have no args... */ jle L_copy_done - mov %rsi,itmp3 /* arg count */ - mov %rcx,itmp2 /* pointer to arg block */ + mov a1,itmp3 /* arg count */ + mov a2,itmp2 /* pointer to arg block */ - mov itmp2,%r14 /* save argument block pointer */ - mov itmp3,%r15 /* save argument count */ + mov itmp2,%r14 /* save argument block pointer */ + mov itmp3,%r15 /* save argument count */ - sub $sizejniblock,itmp2 /* initialize pointer (smaller code) */ - add $1,itmp3 /* initialize argument count */ - xor %r12,%r12 /* initialize integer argument counter */ - xor %r13,%r13 /* initialize float argument counter */ + sub $sizevmarg,itmp2 /* initialize pointer (smaller code) */ + add $1,itmp3 /* initialize argument count */ + xor %r12,%r12 /* initialize integer argument counter*/ + xor %r13,%r13 /* initialize float argument counter */ L_register_copy: - add $sizejniblock,itmp2 /* goto next argument block */ - dec itmp3 /* argument count - 1 */ + add $sizevmarg,itmp2 /* goto next argument block */ + dec itmp3 /* argument count - 1 */ jz L_register_copy_done - andb $0x02,offjniitemtype(itmp2) /* is this a float/double type? */ - jnz L_register_handle_float /* yes, handle it */ + andb $0x02,offvmargtype(itmp2) /* is this a float/double type? */ + jnz L_register_handle_float /* yes, handle it */ - cmp $INT_ARG_CNT,%r12 /* are we out of integer argument */ - je L_register_copy /* register? yes, next loop */ + cmp $INT_ARG_CNT,%r12 /* are we out of integer argument */ + je L_register_copy /* register? yes, next loop */ - lea jumptable_integer,%rbp + lea jumptable_integer(%rip),%rbp mov 0(%rbp,%r12,8),%rbx inc %r12 /* integer argument counter + 1 */ jmp *%rbx @@ -326,7 +161,7 @@ L_register_handle_float: cmp $FLT_ARG_CNT,%r13 /* are we out of float argument */ je L_register_copy /* register? yes, next loop */ - lea jumptable_float,%rbp + lea jumptable_float(%rip),%rbp mov 0(%rbp,%r13,8),%rbx inc %r13 /* float argument counter + 1 */ jmp *%rbx @@ -337,62 +172,57 @@ L_register_copy_done: sub %r13,%rbp /* - float arguments in registers */ jle L_copy_done /* are all assigned to registers? */ + and $0xfffffffffffffffe,%rbp /* keep stack 16-byte aligned */ shl $3,%rbp /* calculate stack size */ - sub %rbp,%rsp /* stack frame for arguments */ - mov %rsp,%rbx /* use %rbx as temp sp */ + sub %rbp,sp /* stack frame for arguments */ + mov sp,%rbx /* use %rbx as temp sp */ - sub $sizejniblock,%r14 /* initialize pointer (smaller code) */ + sub $sizevmarg,%r14 /* initialize pointer (smaller code) */ add $1,%r15 /* initialize argument count */ L_stack_copy_loop: - add $sizejniblock,%r14 /* goto next argument block */ + add $sizevmarg,%r14 /* goto next argument block */ dec %r15 /* are there any arguments left? */ jz L_copy_done /* no test needed after dec */ - andb $0x02,offjniitemtype(%r14) /* is this a float/double type? */ + andb $0x02,offvmargtype(%r14) /* is this a float/double type? */ jnz L_stack_handle_float - dec %r12 /* arguments assigned to registers */ + dec %r12 /* arguments assigned to registers */ jge L_stack_copy_loop jmp L_stack_copy L_stack_handle_float: - dec %r13 /* arguments assigned to registers */ + dec %r13 /* arguments assigned to registers */ jge L_stack_copy_loop L_stack_copy: - mov offjniitem(%r14),itmp3 /* copy s8 argument onto stack */ - mov itmp3,0(%rbx) - add $8,%rbx /* increase sp to next argument */ + mov offvmargdata(%r14),itmp3 /* copy s8 argument onto stack */ + mov itmp3,0(%rbx) + add $8,%rbx /* increase sp to next argument */ jmp L_stack_copy_loop L_copy_done: - lea asm_call_jit_compiler,%r11/* %rax still contains method pointer */ - call *%r11 /* call JIT compiler */ - - add %rbp,%rsp /* remove argument stack frame if any */ - - mov 5*8(%rsp),%r15 /* restore callee saved registers */ - mov 4*8(%rsp),%r14 - mov 3*8(%rsp),%r13 - mov 2*8(%rsp),%r12 - mov 1*8(%rsp),%rbp - mov 0*8(%rsp),%rbx - add $(7*8),%rsp /* free stack space */ + /* itmp1 still contains method pointer*/ + lea L_asm_call_jit_compiler(%rip),itmp3 + call *itmp3 /* call JIT compiler */ + + add bp,sp /* remove argument stack frame if any */ + +L_asm_vm_call_method_return: + mov 0*8(sp),%rbx /* restore callee saved registers */ + mov 1*8(sp),s0 + mov 2*8(sp),s1 + mov 3*8(sp),s2 + mov 4*8(sp),s3 + mov 5*8(sp),s4 + add $(7*8),sp /* free stack space */ ret calljava_xhandler2: - mov %rax,%rdi /* pass exception pointer */ - call builtin_throw_exception - - mov 5*8(%rsp),%r15 /* restore callee saved registers */ - mov 4*8(%rsp),%r14 - mov 3*8(%rsp),%r13 - mov 2*8(%rsp),%r12 - mov 1*8(%rsp),%rbp - mov 0*8(%rsp),%rbx - add $(7*8),%rsp /* free stack space */ - xor %rax,%rax /* return NULL */ - ret + mov xptr,a0 /* pass exception pointer */ + call builtin_throw_exception@PLT + xor v0,v0 /* return NULL */ + jmp L_asm_vm_call_method_return jumptable_integer: @@ -404,22 +234,22 @@ jumptable_integer: .quad handle_a5 handle_a0: - mov offjniitem(itmp2),a0 + mov offvmargdata(itmp2),a0 jmp L_register_copy handle_a1: - mov offjniitem(itmp2),a1 + mov offvmargdata(itmp2),a1 jmp L_register_copy handle_a2: - mov offjniitem(itmp2),a2 + mov offvmargdata(itmp2),a2 jmp L_register_copy handle_a3: - mov offjniitem(itmp2),a3 + mov offvmargdata(itmp2),a3 jmp L_register_copy handle_a4: - mov offjniitem(itmp2),a4 + mov offvmargdata(itmp2),a4 jmp L_register_copy handle_a5: - mov offjniitem(itmp2),a5 + mov offvmargdata(itmp2),a5 jmp L_register_copy @@ -434,28 +264,28 @@ jumptable_float: .quad handle_fa7 handle_fa0: - movq offjniitem(itmp2),fa0 + movq offvmargdata(itmp2),fa0 jmp L_register_copy handle_fa1: - movq offjniitem(itmp2),fa1 + movq offvmargdata(itmp2),fa1 jmp L_register_copy handle_fa2: - movq offjniitem(itmp2),fa2 + movq offvmargdata(itmp2),fa2 jmp L_register_copy handle_fa3: - movq offjniitem(itmp2),fa3 + movq offvmargdata(itmp2),fa3 jmp L_register_copy handle_fa4: - movq offjniitem(itmp2),fa4 + movq offvmargdata(itmp2),fa4 jmp L_register_copy handle_fa5: - movq offjniitem(itmp2),fa5 + movq offvmargdata(itmp2),fa5 jmp L_register_copy handle_fa6: - movq offjniitem(itmp2),fa6 + movq offvmargdata(itmp2),fa6 jmp L_register_copy handle_fa7: - movq offjniitem(itmp2),fa7 + movq offvmargdata(itmp2),fa7 jmp L_register_copy @@ -487,123 +317,91 @@ handle_fa7: *******************************************************************************/ asm_call_jit_compiler: - sub $8,%rsp /* keep stack 16-byte aligned */ +L_asm_call_jit_compiler: /* required for PIC code */ + /* keep stack 16-byte aligned */ + sub $((3+ARG_CNT)*8+sizestackframeinfo),sp - mov %rbx,(%rsp) /* save register */ - - mov 8(%rsp),%r11 /* get return address */ - mov -1(%r11),%bl /* get function code */ - cmp $0xd2,%bl /* called with `call *REG_ITMP2' (%r10)? */ - jne L_not_static_special + mov t0,0*8(sp) /* save register */ - sub $11,%r11 /* calculate address of immediate */ - jmp L_call_jit_compile + mov (3+ARG_CNT)*8+sizestackframeinfo(sp),itmp3 /* get return address */ + mov -1(itmp3),%bl /* get function code */ + cmp $0xd2,%bl /* called with `call *REG_ITMP2'? */ + jne L_not_static_special + + sub $11,itmp3 /* calculate address of immediate */ + jmp L_call_jit_compile L_not_static_special: - cmp $0xd0,%bl /* called with `call *REG_ITMP1' (%rax) */ - jne L_not_virtual_interface + cmp $0xd0,%bl /* called with `call *REG_ITMP1' */ + jne L_not_virtual_interface - sub $7,%r11 /* calculate address of offset */ - mov (%r11),%r11d /* get offset (32-bit) */ - add %r10,%r11 /* add base address to get method address */ - jmp L_call_jit_compile + sub $7,itmp3 /* calculate address of offset */ + mov (itmp3),itmp3l /* get offset (32-bit) */ + add itmp2,itmp3 /* add base address to get method addr*/ + jmp L_call_jit_compile -L_not_virtual_interface: /* a call from asm_calljavamethod */ - xor %r11,%r11 +L_not_virtual_interface: /* a call from asm_calljavamethod */ + xor itmp3,itmp3 L_call_jit_compile: - mov (%rsp),%rbx /* restore register */ - - sub $(24*8),%rsp /* 8 + 6*8 + 8*8 + 8*8 */ - - mov %r11,0*8(%rsp) /* save address for method pointer */ - - mov a0,1*8(%rsp) /* save arguments */ - mov a1,2*8(%rsp) - mov a2,3*8(%rsp) - mov a3,4*8(%rsp) - mov a4,5*8(%rsp) - mov a5,6*8(%rsp) - - movq fa0,7*8(%rsp) - movq fa1,8*8(%rsp) - movq fa2,9*8(%rsp) - movq fa3,10*8(%rsp) - movq fa4,11*8(%rsp) - movq fa5,12*8(%rsp) - movq fa6,13*8(%rsp) - movq fa7,14*8(%rsp) - - movq %xmm8,15*8(%rsp)/* we use them as callee saved registers */ - movq %xmm9,16*8(%rsp) - movq %xmm10,17*8(%rsp) - movq %xmm11,18*8(%rsp) - movq %xmm12,19*8(%rsp) - movq %xmm13,20*8(%rsp) - movq %xmm14,21*8(%rsp) - movq %xmm15,22*8(%rsp) - - mov %rax,%rdi /* pass method pointer */ - call jit_compile - - mov 0*8(%rsp),%r11 - - mov 1*8(%rsp),a0 - mov 2*8(%rsp),a1 - mov 3*8(%rsp),a2 - mov 4*8(%rsp),a3 - mov 5*8(%rsp),a4 - mov 6*8(%rsp),a5 - - movq 7*8(%rsp),fa0 - movq 8*8(%rsp),fa1 - movq 9*8(%rsp),fa2 - movq 10*8(%rsp),fa3 - movq 11*8(%rsp),fa4 - movq 12*8(%rsp),fa5 - movq 13*8(%rsp),fa6 - movq 14*8(%rsp),fa7 - - movq 15*8(%rsp),%xmm8 - movq 16*8(%rsp),%xmm9 - movq 17*8(%rsp),%xmm10 - movq 18*8(%rsp),%xmm11 - movq 19*8(%rsp),%xmm12 - movq 20*8(%rsp),%xmm13 - movq 21*8(%rsp),%xmm14 - movq 22*8(%rsp),%xmm15 - - add $(24*8),%rsp - add $8,%rsp /* keep stack 16-byte aligned */ - - test %rax,%rax /* check for exception */ + mov 0*8(sp),t0 /* restore register */ + mov itmp3,0*8(sp) /* save address for method pointer */ + mov itmp1,1*8(sp) /* save method pointer */ + + SAVE_ARGUMENT_REGISTERS(3) + + mov sp,a0 /* create stackframe info */ + add $((3+ARG_CNT)*8),a0 /* pass sfi */ + xor a1,a1 /* if pv is NULL, use findmethod */ + mov sp,a2 /* pass java sp */ + add $((1+3+ARG_CNT)*8+sizestackframeinfo),a2 + /* pass ra to java function */ + mov ((3+ARG_CNT)*8+sizestackframeinfo)(sp),a3 + mov a3,a4 /* xpc is equal to ra */ + call stacktrace_create_extern_stackframeinfo@PLT + + mov 1*8(sp),a0 /* pass method pointer */ + call jit_compile@PLT + mov v0,1*8(sp) /* save return value */ + + mov sp,a0 /* remove stackframe info */ + add $((3+ARG_CNT)*8),a0 /* pass sfi */ + call stacktrace_remove_stackframeinfo@PLT + + mov 0*8(sp),itmp3 /* restore address for method pointer */ + mov 1*8(sp),v0 /* restore return value */ + + RESTORE_ARGUMENT_REGISTERS(3) + + add $((3+ARG_CNT)*8+sizestackframeinfo),sp /* remove stack frame */ + + test v0,v0 /* check for exception */ je L_asm_call_jit_compiler_exception - test %r11,%r11 /* is address == 0 (asm_calljavamethod) */ + test itmp3,itmp3 /* is address == 0 (asm_calljavamethod*/ je L_call_method - mov %rax,(%r11) /* and now save the new pointer */ + mov v0,(itmp3) /* and now save the new pointer */ L_call_method: - jmp *%rax /* ...and now call the new method */ + jmp *v0 /* ...and now call the new method */ L_asm_call_jit_compiler_exception: #if defined(USE_THREADS) && defined(NATIVE_THREADS) - call builtin_asm_get_exceptionptrptr - mov %rax,itmp2 + call builtin_asm_get_exceptionptrptr@PLT + mov v0,itmp2 /* v0 == xptr */ #else - lea _exceptionptr,itmp2 + lea _no_threads_exceptionptr(%rip),itmp2 #endif mov (itmp2),xptr /* get the exception pointer */ - movl $0,(itmp2) /* clear the exception pointer */ + movl $0,(itmp2) /* clear exception pointer */ pop xpc /* delete return address */ sub $5,xpc /* faulting address is ra - 5 */ - - jmp asm_handle_exception + jmp L_asm_handle_exception -/********************* function asm_handle_exception *************************** +/* asm_handle_exception ******************************************************** * * * This function handles an exception. It does not use the usual calling * * conventions. The exception pointer is passed in REG_ITMP1 and the * @@ -611,1069 +409,409 @@ L_asm_call_jit_compiler_exception: * the local exception table for a handler. If no one is found, it unwinds * * stacks and continues searching the callers. * * * -* void asm_handle_exception (exceptionptr, exceptionpc); * -* * *******************************************************************************/ asm_handle_nat_exception: - add $8,%rsp /* clear return address of native stub*/ + add $8,sp /* clear return address of native stub*/ asm_handle_exception: - sub $(4*8),%rsp - mov xptr,0*8(%rsp) /* save exception pointer */ - mov xpc,1*8(%rsp) /* save exception pc */ +L_asm_handle_exception: /* required for PIC code */ + sub $((ARG_CNT+TMP_CNT)*8),sp /* create maybe-leaf stackframe */ + + SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */ + SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */ + + mov $((ARG_CNT+TMP_CNT)*8),a3 /* prepare a3 for handle_exception */ + mov $1,t0 /* set maybe-leaf flag */ + +L_asm_handle_exception_stack_loop: + sub $(6*8),sp + mov xptr,0*8(sp) /* save exception pointer */ + mov xpc,1*8(sp) /* save exception pc */ + add sp,a3 /* calculate Java sp into a3... */ + add $(6*8),a3 + mov a3,3*8(sp) /* ...and save it */ + mov t0,4*8(sp) /* save maybe-leaf flag */ + + mov xpc,a0 /* exception pc */ + call codegen_findmethod@PLT + mov v0,2*8(sp) /* save data segment pointer */ - mov xpc,%rdi /* exception pc */ - call codegen_findmethod - mov %rax,itmp3 - mov %rax,2*8(%rsp) /* save data segment pointer */ - - mov 0*8(%rsp),%rax /* restore exception pointer */ - mov 1*8(%rsp),%r10 /* restore exception pc */ - -ex_stack_loop: - mov %rax,%rdi /* exception pointer */ - mov MethodPointer(itmp3),%rsi /* method pointer */ - mov xpc,%rdx /* exception pc */ - mov $0,%rcx - mov $1,%r8 /* set noindent flag */ - call builtin_trace_exception - - mov 2*8(%rsp),itmp3 /* %r11 = data segment pointer */ - mov ExTableSize(itmp3),%rcx /* %rcx = exception table size */ - test %rcx,%rcx /* if empty table skip */ - je empty_table - - lea ExTableStart(itmp3),%rdi /* %rdi = start of exception table */ - mov 0*8(%rsp),xptr /* get xptr */ - -ex_table_loop: - mov 1*8(%rsp),xpc /* get xpc */ - - mov ExStartPC(%rdi),%rdx /* %rdx = exception start pc */ - cmp xpc,%rdx /* %rdx = (startpc <= xpc) */ - jg ex_table_cont /* if (false) continue */ - mov ExEndPC(%rdi),%rdx /* %rdx = exception end pc */ - cmp %rdx,xpc /* %rdx = (xpc < endpc) */ - jge ex_table_cont /* if (false) continue */ - mov ExCatchType(%rdi),%rdx /* %rdx = exception catch type */ - test %rdx,%rdx /* NULL catches everything */ - je ex_handle_it - - cmpl $0,offclassloaded(%rdx) /* check if class is loaded */ - jne L_class_loaded - - sub $(4*8),%rsp - mov %rax,0*8(%rsp) - mov %rcx,1*8(%rsp) - mov %rdx,2*8(%rsp) - mov %rdi,3*8(%rsp) - - mov %rdx,%rdi - call load_class_bootstrap - - mov 0*8(%rsp),%rax - mov 1*8(%rsp),%rcx - mov 2*8(%rsp),%rdx - mov 3*8(%rsp),%rdi - add $(4*8),%rsp - -L_class_loaded: - cmpl $0,offclasslinked(%rdx) /* check if class is linked */ - jne L_class_linked - - sub $(4*8),%rsp - mov %rax,0*8(%rsp) - mov %rcx,1*8(%rsp) - mov %rdx,2*8(%rsp) - mov %rdi,3*8(%rsp) - - mov %rdx,%rdi - call link_class - - mov 0*8(%rsp),%rax - mov 1*8(%rsp),%rcx - mov 2*8(%rsp),%rdx - mov 3*8(%rsp),%rdi - add $(4*8),%rsp - -L_class_linked: -#if defined(USE_THREADS) && defined(NATIVE_THREADS) - push %rdx + mov 0*8(sp),a0 /* pass exception pointer */ + mov 1*8(sp),a1 /* pass exception pc */ + mov v0,a2 /* pass data segment pointer */ + mov 3*8(sp),a3 /* pass Java stack pointer */ + call exceptions_handle_exception@PLT -_crit_restart1: - mov 0(%rsp),%rdx -#endif + test v0,v0 + jz L_asm_handle_exception_not_catched -_crit_begin1: - mov offobjvftbl(%rax),%rsi /* %rsi = vftblptr(xptr) */ - mov offclassvftbl(%rdx),%rdx /* %rdx = vftblptr(catchtype) class (not obj) */ - mov offbaseval(%rsi),%esi /* %esi = baseval(xptr) */ - mov offbaseval(%rdx),%r10d /* %r10d = baseval(catchtype) */ - mov offdiffval(%rdx),%edx /* %edx = diffval(catchtype) */ -_crit_end1: - sub %r10d,%esi /* %esi = baseval(xptr) - baseval(catchtype) */ + mov v0,xpc /* move handlerpc into xpc */ + mov 0*8(sp),xptr /* restore exception pointer */ + mov 4*8(sp),t0 /* get maybe-leaf flag */ + add $(6*8),sp /* free stack frame */ -#if defined(USE_THREADS) && defined(NATIVE_THREADS) - add $8,%rsp -#endif + test t0,t0 /* test for maybe-leaf flag */ + jz L_asm_handle_exception_no_leaf - cmp %edx,%esi /* xptr is instanceof catchtype */ - ja ex_table_cont - -ex_handle_it: - mov ExHandlerPC(%rdi),xpc /* xpc = exception handler pc */ + RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */ + RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */ - mov 0*8(%rsp),%rax /* restore exception pointer */ - add $(4*8),%rsp /* free stack frame */ + add $((ARG_CNT+TMP_CNT)*8),sp /* remove maybe-leaf stackframe */ - jmp *xpc /* jump to the handler */ +L_asm_handle_exception_no_leaf: + jmp *xpc /* jump to the handler */ -ex_table_cont: - lea ExEntrySize(%rdi),%rdi /* next exception table entry */ - dec %rcx /* decrement entry counter */ - test %rcx,%rcx /* if (t0 > 0) next entry */ - jg ex_table_loop - -empty_table: - mov 0*8(%rsp),%rax /* restore exception pointer */ - mov 1*8(%rsp),%r10 /* restore exception pc */ - mov 2*8(%rsp),%r11 /* restore data segment pointer */ - add $(4*8),%rsp - - mov %rax,%rcx /* save exception pointer */ - -ex_already_cleared: - movl IsSync(%r11),%eax /* %rax = SyncOffset */ - test %rax,%rax /* if zero no monitorexit */ - je no_monitor_exit - -#if defined(USE_THREADS) - add %rsp,%rax - mov -8(%rax),%rdi - - sub $(4*8),%rsp - mov %rcx,0*8(%rsp) - mov %r10,1*8(%rsp) - mov %r11,2*8(%rsp) - - call builtin_monitorexit +L_asm_handle_exception_not_catched: + mov 0*8(sp),xptr /* restore exception pointer */ + mov 2*8(sp),itmp3 /* restore data segment pointer */ + mov 4*8(sp),t0 /* get maybe-leaf flag */ + add $(6*8),sp - mov 0*8(%rsp),%rcx - mov 1*8(%rsp),%r10 - mov 2*8(%rsp),%r11 - add $(4*8),%rsp -#endif + test t0,t0 + jz L_asm_handle_exception_no_leaf_stack -no_monitor_exit: - mov FrameSize(%r11),%eax /* %eax = frame size */ - add %rax,%rsp /* unwind stack */ - mov %rsp,%rax /* %rax = pointer to save area */ + add $((ARG_CNT+TMP_CNT)*8),sp /* remove maybe-leaf stackframe */ + xor t0,t0 /* clear the isleaf flags */ - mov IntSave(%r11),%edx /* %edx = saved int register count*/ - test %edx,%edx - je noint - - cmp $1,%edx - je int1 - cmp $2,%edx - je int2 - cmp $3,%edx - je int3 - cmp $4,%edx - je int4 - cmp $5,%edx - je int5 - - mov -48(%rax),%rbx -int5: - mov -40(%rax),%rbp +L_asm_handle_exception_no_leaf_stack: + mov FrameSize(itmp3),itmp2l /* get frame size */ + add sp,itmp2 /* pointer to save area */ + + mov IntSave(itmp3),a0l /* a0l = saved int register count */ + test a0l,a0l + je noint + + cmp $1,a0l + je int1 + cmp $2,a0l + je int2 + cmp $3,a0l + je int3 + cmp $4,a0l + je int4 + + mov -5*8(itmp2),s0 int4: - mov -32(%rax),%r12 + mov -4*8(itmp2),s1 int3: - mov -24(%rax),%r13 + mov -3*8(itmp2),s2 int2: - mov -16(%rax),%r14 + mov -2*8(itmp2),s3 int1: - mov -8(%rax),%r15 + mov -1*8(itmp2),s4 - shl $3,%edx /* multiply by 8 bytes */ - sub %rdx,%rax + shl $3,a0l /* multiply by 8 bytes */ + sub a0,itmp2 noint: - mov FltSave(%r11),%edx /* %edx = saved flt register count*/ - test %edx,%edx - je noflt - - cmpl $1,%edx - je flt1 - cmpl $2,%edx - je flt2 - cmpl $3,%edx - je flt3 - cmpl $4,%edx - je flt4 - cmpl $5,%edx - je flt5 - cmpl $6,%edx - je flt7 - cmpl $7,%edx - je flt7 - - movq -64(%rax),%xmm8 -flt7: - movq -56(%rax),%xmm9 -flt6: - movq -48(%rax),%xmm10 -flt5: - movq -40(%rax),%xmm11 +#if 0 + mov FltSave(itmp3),a0l /* a0l = saved flt register count */ + test a0l,a0l + je noflt + + cmpl $1,a0l + je flt1 + cmpl $2,a0l + je flt2 + cmpl $3,a0l + je flt3 + cmpl $4,a0l + je flt4 + + movq -5*8(itmp2),%xmm11 flt4: - movq -32(%rax),%xmm12 + movq -4*8(itmp2),%xmm12 flt3: - movq -24(%rax),%xmm13 + movq -3*8(itmp2),%xmm13 flt2: - movq -16(%rax),%xmm14 + movq -2*8(itmp2),%xmm14 flt1: - movq -8(%rax),%xmm15 + movq -1*8(itmp2),%xmm15 -noflt: - pop %r10 /* the new xpc is return address */ - sub $3,%r10 /* subtract 3 bytes for call */ - - sub $(2*8),%rsp - mov %rcx,0*8(%rsp) - mov %r10,1*8(%rsp) - - mov %r10,%rdi - call codegen_findmethod /* get the new data segment ptr */ - mov %rax,%r11 - - mov 0*8(%rsp),%rcx - mov 1*8(%rsp),%r10 - add $(2*8),%rsp +noflt: +#endif + mov FrameSize(itmp3),itmp2l /* get frame size */ + add itmp2,sp /* unwind stack */ - mov %rcx,%rax /* restore saved exception pointer*/ + /* exception pointer is still set */ + pop xpc /* the new xpc is return address */ + sub $3,xpc /* subtract 3 bytes for call */ - sub $(4*8),%rsp - - mov %rax,0*8(%rsp) /* save exception pointer */ - mov %r10,1*8(%rsp) /* save exception pc */ - mov %r11,2*8(%rsp) /* save data segment pointer */ - - jmp ex_stack_loop + xor a3,a3 /* prepare a3 for handle_exception */ + + jmp L_asm_handle_exception_stack_loop -/* asm_patcher_get_putstatic *************************************************** +/* asm_wrapper_patcher ********************************************************* XXX Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved field reference + 40 return address + 32 pointer to virtual java_objectheader + 24 machine code (which is patched back later) + 16 unresolved class/method/field reference + 8 data segment displacement from load instructions + 0 pointer to patcher function + -8 bp *******************************************************************************/ -asm_patcher_get_putstatic: - sub $(15*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - SAVE_TEMPORARY_REGISTERS - - mov (0+15)*8(%rsp),a0 /* pass unresolved_field pointer */ - call helper_resolve_fieldinfo_value_address /* call the helper function*/ - - RESTORE_ARGUMENT_REGISTERS - RESTORE_TEMPORARY_REGISTERS - - mov (1+15)*8(%rsp),itmp3 /* get machine code */ - add $((2+15)*8),%rsp /* remove stack frame, keep ra */ - - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - movswq 3(itmp2),itmp3 /* get %rip offset */ - add itmp2,itmp3 /* add return address (%rip) */ - add $7,itmp3 /* add mov instruction size */ - mov v0,(itmp3) /* move field address to data segment */ - jmp *itmp2 /* call new patched code */ - -L_asm_patcher_exception: +asm_wrapper_patcher: + push bp /* save base pointer */ + mov sp,bp /* move actual sp to bp */ + sub $((3+ARG_CNT+TMP_CNT)*8+sizestackframeinfo),sp + and $0xfffffffffffffff0,sp /* align sp to 16-byte (this is for */ + /* leaf functions) */ + + SAVE_ARGUMENT_REGISTERS(3) + SAVE_TEMPORARY_REGISTERS(3+ARG_CNT) + + mov itmp1,0*8(sp) /* save itmp1 and itmp2 */ + mov itmp2,1*8(sp) /* can be used by some instructions */ + + mov sp,a0 /* create stackframe info */ + add $((3+ARG_CNT+TMP_CNT)*8),a0 + xor a1,a1 /* if pv is NULL, use findmethod */ + mov bp,a2 /* pass java sp */ + add $((6+1)*8),a2 + mov ((5+1)*8)(bp),a3 /* pass ra to java function */ + mov a3,a4 /* xpc is equal to ra */ + call stacktrace_create_extern_stackframeinfo@PLT + + mov bp,a0 /* pass stack pointer */ + add $((1+1)*8),a0 /* skip function pointer */ + mov 1*8(bp),itmp3 /* get function pointer */ + call *itmp3 /* call the patcher function */ + mov v0,2*8(sp) /* save return value */ + + mov sp,a0 /* remove stackframe info */ + add $((3+ARG_CNT+TMP_CNT)*8),a0 + call stacktrace_remove_stackframeinfo@PLT + + RESTORE_ARGUMENT_REGISTERS(3) + RESTORE_TEMPORARY_REGISTERS(3+ARG_CNT) + + mov 0*8(sp),itmp1 /* restore itmp1 and itmp2 */ + mov 1*8(sp),itmp2 /* can be used by some instructions */ + mov 2*8(sp),itmp3 /* restore return value */ + + mov bp,sp /* restore original sp */ + pop bp /* restore bp */ + add $(5*8),sp /* remove patcher stackframe, keep ra */ + + test itmp3,itmp3 /* exception thrown? */ + jz L_asm_wrapper_patcher_exception + ret /* call new patched code */ + +L_asm_wrapper_patcher_exception: #if defined(USE_THREADS) && defined(NATIVE_THREADS) - call builtin_asm_get_exceptionptrptr - mov v0,itmp2 + call builtin_asm_get_exceptionptrptr@PLT + mov v0,itmp2 /* v0 == xptr */ #else - lea _exceptionptr,itmp2 + mov _no_threads_exceptionptr,itmp2 #endif mov (itmp2),xptr /* get the exception pointer */ - movl $0,(itmp2) /* clear the exception pointer */ + movl $0,(itmp2) /* clear exception pointer */ pop xpc /* get and remove return address */ - sub $5,xpc /* faulting address is ra - 5 */ - jmp asm_handle_exception - - -/* asm_patcher_get_putfield **************************************************** - - XXX - - Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved field reference - -*******************************************************************************/ - -asm_patcher_get_putfield: - sub $(17*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - SAVE_TEMPORARY_REGISTERS - - mov itmp1,15*8(%rsp) /* save itmp1 and itmp2 */ - mov itmp2,16*8(%rsp) /* can be used by field instructions */ - - mov (0+17)*8(%rsp),a0 /* pass unresolved_method pointer */ - call helper_resolve_fieldinfo_offset /* call the helper function */ - - RESTORE_ARGUMENT_REGISTERS - RESTORE_TEMPORARY_REGISTERS - - cmp $-1,v0l /* exception thrown? test for -1, */ - /* because field offset can be 0 */ - jz L_asm_patcher_exception_with_stack_frame - - mov (1+17)*8(%rsp),itmp3 /* get machine code */ - mov (2+17)*8(%rsp),itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - cmpb $0xf2,(itmp2) /* test for movsd */ - je L_asm_patcher_get_putfield_float - cmpb $0xf3,(itmp2) /* test for movss */ - je L_asm_patcher_get_putfield_float - cmpb $0x24,3(itmp2) /* check for (%rsp) or (%r12) */ - je L_asm_patcher_get_putfield_r12_membase - - mov v0l,3(itmp2) /* patch field offset */ - jmp L_asm_patcher_get_putfield_normal - -L_asm_patcher_get_putfield_float: - mov v0l,5(itmp2) /* patch field offset (position + 2) */ - jmp L_asm_patcher_get_putfield_normal - -L_asm_patcher_get_putfield_r12_membase: - mov v0l,4(itmp2) /* patch field offset (position + 1) */ - -L_asm_patcher_get_putfield_normal: - mov itmp2,itmp3 - - mov 15*8(%rsp),itmp1 /* restore itmp1 and itmp2 */ - mov 16*8(%rsp),itmp2 /* can be used by field instructions */ - - add $((3+17)*8),%rsp /* remove stack frame */ - jmp *itmp3 /* call new patched code */ - -L_asm_patcher_exception_with_stack_frame: -#if defined(USE_THREADS) && defined(NATIVE_THREADS) - call builtin_asm_get_exceptionptrptr - mov %rax,itmp2 -#else - lea _exceptionptr,itmp2 -#endif - mov (itmp2),xptr /* get the exception pointer */ - movl $0,(itmp2) /* clear the exception pointer */ - - mov (2+17)*8(%rsp),xpc /* get return address */ - sub $5,xpc /* faulting address is ra - 5 */ - add $((3+17)*8),%rsp /* remove stack frame */ - jmp asm_handle_exception - - -/* asm_patcher_builtin_new ***************************************************** - - XXX - - Arguments: - a0 contains the class reference - -*******************************************************************************/ - -asm_patcher_builtin_new: - sub $(8*1),%rsp /* stack frame (16-byte aligned) */ - call helper_resolve_classinfo /* call the helper function */ - add $(8*1),%rsp /* remove stack frame */ - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $(10+10+3),itmp2 /* 10 (movi) + 10 (movi) + 3 (callq) */ - mov v0,2(itmp2) /* patch in new classinfo*: 2 (mov) */ - - lea builtin_new,itmp1 /* get address from builtin_new */ - mov itmp1,12(itmp2) /* patch back function address */ - jmp *itmp2 /* call new patched code */ - - -/* asm_patcher_builtin_newarray ************************************************ - - XXX - - Arguments: - a1 contains the class reference - -*******************************************************************************/ - -asm_patcher_builtin_newarray: - sub $(8*1),%rsp /* stack frame (16-byte aligned) */ - mov a0,0*8(%rsp) /* save argument */ - mov a1,a0 /* pass class reference */ - call helper_resolve_classinfo_vftbl /* call the helper function */ - mov 0*8(%rsp),a0 /* restore argument */ - add $(8*1),%rsp /* remove stack frame */ - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $(10+10+3),itmp2 /* 10 (movi) + 10 (movi) + 3 (callq) */ - mov v0,2(itmp2) /* patch in new vftbl*: 2 (mov) */ - - lea builtin_newarray,itmp1 /* get address from builtin_newarray */ - mov itmp1,12(itmp2) /* patch back function address */ - jmp *itmp2 /* call new patched code */ - - -/* asm_patcher_builtin_multianewarray ****************************************** - - XXX - - Arguments: - a1 contains the class reference - -*******************************************************************************/ - -asm_patcher_builtin_multianewarray: - sub $(1*8),%rsp /* stack frame (16-byte aligned) */ - mov a1,a0 /* pass class reference */ - call helper_resolve_classinfo_vftbl /* call the helper function */ - add $(1*8),%rsp /* remove stack frame */ - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $(3+10+3+10+10),itmp2 /* go back to a0 mov */ - mov v0,10+2(itmp2) /* patch in new vftbl*: 10 (movi) + 2 */ - - lea builtin_nmultianewarray,itmp1 /* get function address */ - mov itmp1,10+10+3+2(itmp2) /* patch back function address */ - jmp *itmp2 /* call new patched code */ - - -/* asm_patcher_builtin_checkarraycast ****************************************** - - XXX - - Arguments: - a1 contains the class reference - -*******************************************************************************/ - -asm_patcher_builtin_checkarraycast: - sub $(8*1),%rsp /* stack frame (16-byte aligned) */ - mov a0,0*8(%rsp) /* save argument */ - mov a1,a0 /* pass class reference */ - call helper_resolve_classinfo_vftbl /* call the helper function */ - mov 0*8(%rsp),a0 /* restore argument */ - add $(8*1),%rsp /* remove stack frame */ - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $(10+10+3),itmp2 /* 10 (movi) + 10 (movi) + 3 (callq) */ - mov v0,2(itmp2) /* patch in new vftbl*: 2 (mov) */ - - lea asm_builtin_checkarraycast,itmp1 /* get function address */ - mov itmp1,12(itmp2) /* patch back function address */ - jmp *itmp2 /* call new patched code */ - - -/* asm_patcher_builtin_arrayinstanceof ***************************************** - - XXX - - Arguments: - a1 contains the class reference + jmp L_asm_handle_exception -*******************************************************************************/ - -asm_patcher_builtin_arrayinstanceof: - sub $(8*1),%rsp /* stack frame (16-byte aligned) */ - mov a0,0*8(%rsp) /* save argument */ - mov a1,a0 /* pass class reference */ - call helper_resolve_classinfo_vftbl /* call the helper function */ - mov 0*8(%rsp),a0 /* restore argument */ - add $(8*1),%rsp /* remove stack frame */ - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $(10+10+3),itmp2 /* 10 (movi) + 10 (movi) + 3 (callq) */ - mov v0,2(itmp2) /* patch in new vftbl*: 2 (mov) */ - - lea builtin_arrayinstanceof,itmp1 /* get function address */ - mov itmp1,12(itmp2) /* patch back function address */ - jmp *itmp2 /* call new patched code */ - - -/* asm_patcher_invokestatic_special ******************************************** - - XXX - - Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved method reference - -*******************************************************************************/ - -asm_patcher_invokestatic_special: - sub $(15*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - - mov (0+15)*8(%rsp),a0 /* pass unresolved_method pointer */ - call helper_resolve_methodinfo_stubroutine /* call the helper function */ - - RESTORE_ARGUMENT_REGISTERS - - mov (1+15)*8(%rsp),itmp3 /* get machine code */ - add $((2+15)*8),%rsp /* remove stack frame, keep ra */ - - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - mov v0,2(itmp2) /* patch stubroutine: 2 (mov) */ - jmp *itmp2 /* call new patched code */ - - -/* asm_patcher_invokevirtual *************************************************** - - XXX - - Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved method reference - -*******************************************************************************/ - -asm_patcher_invokevirtual: - sub $(15*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - - mov (0+15)*8(%rsp),a0 /* pass unresolved_method pointer */ - call helper_resolve_methodinfo_vftblindex /* call the helper function */ - - RESTORE_ARGUMENT_REGISTERS - - mov (1+15)*8(%rsp),itmp3 /* get machine code */ - add $((2+15)*8),%rsp /* remove stack frame, keep ra */ - - cmp $-1,v0l /* exception thrown? test for -1, */ - /* because vftblindex can be 0 */ - je L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - shl $3,v0l /* sizeof(methodptr) * lm->vftblindex */ - add $offvftbltable,v0l /* + OFFSET(vftbl_t, table[0]) */ - movl v0l,3+3(itmp2) /* patch 32 bit offset: 3 (mov) + 3 */ - jmp *itmp2 /* call new patched code */ - - -/* asm_patcher_invokeinterface ************************************************* - - XXX - - Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved method reference - -*******************************************************************************/ - -asm_patcher_invokeinterface: - sub $(15*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - - mov (0+15)*8(%rsp),a0 /* pass unresolved_method pointer */ - call helper_resolve_methodinfo /* call the helper function */ - - RESTORE_ARGUMENT_REGISTERS - - mov (1+15)*8(%rsp),itmp3 /* get machine code */ - add $((2+15)*8),%rsp /* remove stack frame, keep ra */ - - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception - - pop itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - mov offmethodclass(v0),itmp3 /* ci = lm->class */ - mov offclassindex(itmp3),itmp3l /* ci->index (s4) */ - shl $3,itmp3l /* * sizeof(methodptr) */ - neg itmp3l /* OFFSET(vftbl_t, interfacetable[0]) */ - /* XXX the offset is always 0!!! */ - mov itmp3l,3+3(itmp2) /* patch 32 bit offset: 3 (mov) + 3 */ - - mov offmethodclass(v0),itmp3 /* ci = lm->class */ - sub offclassmethods(itmp3),v0 /* lm - ci->methods */ - - push %rdx - xor %rdx,%rdx - mov $sizemethodinfo,itmp3l - idiv itmp3l - pop %rdx - - shl $3,v0 /* * sizeof(methodptr) */ - mov v0l,3+7+3(itmp2) /* patch 32bit offset: 3 + 7 (mov) + 3*/ - jmp *itmp2 /* call new patched code */ - - -/* asm_patcher_checkcast_instanceof_flags ************************************** - - XXX - - Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved field reference - -*******************************************************************************/ - -asm_patcher_checkcast_instanceof_flags: - sub $(17*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - SAVE_TEMPORARY_REGISTERS - - mov itmp1,15*8(%rsp) /* save itmp1 and itmp2 */ - mov itmp2,16*8(%rsp) /* can be used by CHECKCAST */ - - mov (0+17)*8(%rsp),a0 /* pass unresolved_method pointer */ - call helper_resolve_classinfo_flags /* call the helper function */ - - RESTORE_ARGUMENT_REGISTERS - RESTORE_TEMPORARY_REGISTERS - - cmp $-1,v0l /* exception thrown? test for -1, */ - /* because class flags can be 0 */ - jz L_asm_patcher_exception_with_stack_frame - - mov (1+17)*8(%rsp),itmp3 /* get machine code */ - mov (2+17)*8(%rsp),itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - mov v0l,2(itmp2) /* patch super->flags */ - - mov itmp2,itmp3 /* move return address */ - mov 15*8(%rsp),itmp1 /* restore itmp1 and itmp2 */ - mov 16*8(%rsp),itmp2 /* can be used by field instructions */ - add $((3+17)*8),%rsp /* remove stack frame */ - jmp *itmp3 /* call new patched code */ - - -/* asm_patcher_checkcast_instanceof_interface ********************************** - - XXX - - Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved field reference - -*******************************************************************************/ - -asm_patcher_checkcast_instanceof_interface: - sub $(17*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - SAVE_TEMPORARY_REGISTERS - - mov itmp1,15*8(%rsp) /* save itmp1 and itmp2 */ - mov itmp2,16*8(%rsp) /* can be used by CHECKCAST */ - - mov (0+17)*8(%rsp),a0 /* pass unresolved_method pointer */ - call helper_resolve_classinfo_index /* call the helper function */ - - RESTORE_ARGUMENT_REGISTERS - RESTORE_TEMPORARY_REGISTERS - - cmp $-1,v0l /* exception thrown? test for -1, */ - /* because class index can be 0 */ - jz L_asm_patcher_exception_with_stack_frame - - mov (1+17)*8(%rsp),itmp3 /* get machine code */ - mov (2+17)*8(%rsp),itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - mov v0l,7+3(itmp2) /* patch super->index */ - - shl $3,v0l /* super->index * sizeof(methodptr) */ - neg v0l /* OFFSET(vftbl_t, interfacetable[0]) */ - /* XXX the offset is always 0!!! */ - mov v0l,7+7+3+6+3(itmp2) /* patch calculated value */ - mov itmp2,itmp3 /* move return address */ - mov 15*8(%rsp),itmp1 /* restore itmp1 and itmp2 */ - mov 16*8(%rsp),itmp2 /* can be used by field instructions */ - add $((3+17)*8),%rsp /* remove stack frame */ - jmp *itmp3 /* call new patched code */ +/* asm_replacement_out ********************************************************* + This code is jumped to from the replacement-out stubs that are executed + when a thread reaches an activated replacement point. -/* asm_patcher_checkcast_class ************************************************* - - XXX + The purpose of asm_replacement_out is to read out the parts of the + execution state that cannot be accessed from C code, store this state, + and then call the C function replace_me. Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved field reference + 8 start of stack inside method to replace + 0 rplpoint * info on the replacement point that was reached *******************************************************************************/ -asm_patcher_checkcast_class: - sub $(17*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - SAVE_TEMPORARY_REGISTERS - - mov itmp1,15*8(%rsp) /* save itmp1 and itmp2 */ - mov itmp2,16*8(%rsp) /* can be used by CHECKCAST */ - - mov (0+17)*8(%rsp),a0 /* pass unresolved_method pointer */ - call helper_resolve_classinfo_vftbl /* call the helper function */ - - RESTORE_ARGUMENT_REGISTERS - RESTORE_TEMPORARY_REGISTERS - - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception_with_stack_frame - - mov (1+17)*8(%rsp),itmp3 /* get machine code */ - mov (2+17)*8(%rsp),itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - mov v0,2(itmp2) /* patch super->vftbl */ - mov v0,10+7+7+3+2(itmp2) /* patch super->vftbl */ - - mov itmp2,itmp3 /* move return address */ - mov 15*8(%rsp),itmp1 /* restore itmp1 and itmp2 */ - mov 16*8(%rsp),itmp2 - add $((3+17)*8),%rsp /* remove stack frame */ - jmp *itmp3 /* call new patched code */ - - -/* asm_patcher_instanceof_class ************************************************ - - XXX - - Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 unresolved field reference +/* some room to accomodate changes of the stack frame size during replacement */ + /* XXX we should find a cleaner solution here */ +#define REPLACEMENT_ROOM 512 + +asm_replacement_out: + /* create stack frame */ + sub $(sizeexecutionstate + REPLACEMENT_ROOM),sp + + /* save registers in execution state */ + mov %rax,(RAX*8+offes_intregs)(sp) + mov %rbx,(RBX*8+offes_intregs)(sp) + mov %rcx,(RCX*8+offes_intregs)(sp) + mov %rdx,(RDX*8+offes_intregs)(sp) + mov %rsi,(RSI*8+offes_intregs)(sp) + mov %rdi,(RDI*8+offes_intregs)(sp) + mov %rbp,(RBP*8+offes_intregs)(sp) + movq $0 ,(RSP*8+offes_intregs)(sp) /* not used */ + mov %r8 ,(R8 *8+offes_intregs)(sp) + mov %r9 ,(R9 *8+offes_intregs)(sp) + mov %r10,(R10*8+offes_intregs)(sp) + mov %r11,(R11*8+offes_intregs)(sp) + mov %r12,(R12*8+offes_intregs)(sp) + mov %r13,(R13*8+offes_intregs)(sp) + mov %r14,(R14*8+offes_intregs)(sp) + mov %r15,(R15*8+offes_intregs)(sp) + + movq %xmm0 ,(XMM0 *8+offes_fltregs)(sp) + movq %xmm1 ,(XMM1 *8+offes_fltregs)(sp) + movq %xmm2 ,(XMM2 *8+offes_fltregs)(sp) + movq %xmm3 ,(XMM3 *8+offes_fltregs)(sp) + movq %xmm4 ,(XMM4 *8+offes_fltregs)(sp) + movq %xmm5 ,(XMM5 *8+offes_fltregs)(sp) + movq %xmm6 ,(XMM6 *8+offes_fltregs)(sp) + movq %xmm7 ,(XMM7 *8+offes_fltregs)(sp) + movq %xmm8 ,(XMM8 *8+offes_fltregs)(sp) + movq %xmm9 ,(XMM9 *8+offes_fltregs)(sp) + movq %xmm10,(XMM10*8+offes_fltregs)(sp) + movq %xmm11,(XMM11*8+offes_fltregs)(sp) + movq %xmm12,(XMM12*8+offes_fltregs)(sp) + movq %xmm13,(XMM13*8+offes_fltregs)(sp) + movq %xmm14,(XMM14*8+offes_fltregs)(sp) + movq %xmm15,(XMM15*8+offes_fltregs)(sp) + + /* calculate sp of method */ + mov sp,itmp1 + add $(sizeexecutionstate + REPLACEMENT_ROOM + 8),itmp1 + mov itmp1,(offes_sp)(sp) + + /* pv must be looked up via AVL tree */ + movq $0,(offes_pv)(sp) + + /* call replace_me */ + mov -8(itmp1),a0 /* rplpoint * */ + mov sp,a1 /* arg1: execution state */ + call replace_me@PLT /* call C function replace_me */ + call abort@PLT /* NEVER REACHED */ + +/* asm_replacement_in ********************************************************** + + This code writes the given execution state and jumps to the replacement + code. + + This function never returns! + + C prototype: + void asm_replacement_in(executionstate *es); *******************************************************************************/ -asm_patcher_instanceof_class: - sub $(17*8),%rsp /* stack frame (16-byte aligned) */ - - SAVE_ARGUMENT_REGISTERS - SAVE_TEMPORARY_REGISTERS - - mov itmp1,15*8(%rsp) /* save itmp1 and itmp2 */ - mov itmp2,16*8(%rsp) /* can be used by INSTANCEOF */ - - mov (0+17)*8(%rsp),a0 /* pass unresolved_method pointer */ - call helper_resolve_classinfo_vftbl /* call the helper function */ - - RESTORE_ARGUMENT_REGISTERS - RESTORE_TEMPORARY_REGISTERS - - test v0,v0 /* exception thrown? */ - jz L_asm_patcher_exception_with_stack_frame - - mov (1+17)*8(%rsp),itmp3 /* get machine code */ - mov (2+17)*8(%rsp),itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back original code (8 bytes) */ - - mov v0,2(itmp2) /* patch super->vftbl */ +asm_replacement_in: + mov a0,%rbp /* executionstate *es */ - mov itmp2,itmp3 /* move return address */ - mov 15*8(%rsp),itmp1 /* restore itmp1 and itmp2 */ - mov 16*8(%rsp),itmp2 - add $((3+17)*8),%rsp /* remove stack frame */ - jmp *itmp3 /* call new patched code */ - - -/* asm_check_clinit ************************************************************ - - DOCUMENT ME!!! - - Stack layout: - 16 return address - 8 machine code (which is patched back later) - 0 classinfo pointer - -*******************************************************************************/ - -asm_check_clinit: - mov 0*8(%rsp),itmp1 /* get classinfo pointer */ - mov offclassinit(itmp1),itmp2l /* get initialized flag (int) */ - test itmp2l,itmp2l - jnz L_asm_check_clinit_is_initialized - - sub $(15*8),%rsp /* keep stack 16-byte aligned */ - - SAVE_ARGUMENT_REGISTERS - SAVE_TEMPORARY_REGISTERS - - mov (0+15)*8(%rsp),a0 /* pass classinfo pointer */ - call initialize_class /* call class initialize function */ + /* set new sp */ + mov (offes_sp)(%rbp),%rsp - RESTORE_ARGUMENT_REGISTERS - RESTORE_TEMPORARY_REGISTERS - - add $(15*8),%rsp /* remove stack frame, keep ra */ - - test v0,v0 /* exception thrown? */ - je L_asm_check_clinit_exception - -L_asm_check_clinit_is_initialized: - add $(1*8),%rsp /* remove classinfo pointer */ - pop itmp3 /* get machine code */ - pop itmp2 /* get return address */ - sub $5,itmp2 /* remove size of `call rel32' */ - mov itmp3,(itmp2) /* patch back in 8 bytes */ - jmp *itmp2 /* jump to patched code an execute it */ - -L_asm_check_clinit_exception: -#if defined(USE_THREADS) && defined(NATIVE_THREADS) - call builtin_asm_get_exceptionptrptr - mov v0,itmp2 -#else - lea _exceptionptr,itmp2 -#endif - mov (itmp2),xptr /* get the exception pointer */ - movl $0,(itmp2) /* clear the exception pointer */ - - add $(2*8),%rsp /* remove stack frame, keep ra */ - pop xpc /* delete return address */ - sub $5,xpc /* faulting address is ra - 5 */ - jmp asm_handle_exception - - -/********************* function asm_builtin_monitorenter *********************** -* * -* Does null check and calls monitorenter or throws an exception * -* * -*******************************************************************************/ - -#if defined(USE_THREADS) -asm_builtin_monitorenter: - test %rdi,%rdi - je nb_monitorenter /* if (null) throw exception */ - jmp builtin_monitorenter /* else call builtin_monitorenter */ - -nb_monitorenter: - call new_nullpointerexception - pop %r10 /* delete return address */ - sub $3,%r10 /* faulting address is ra - 3 */ - jmp asm_handle_exception -#endif - - -/********************* function asm_builtin_monitorexit ************************ -* * -* Does null check and calls monitorexit or throws an exception * -* * -*******************************************************************************/ - -#if defined(USE_THREADS) -asm_builtin_monitorexit: - test %rdi,%rdi - je nb_monitorexit /* if (null) throw exception */ - jmp builtin_monitorexit /* else call builtin_monitorenter */ - -nb_monitorexit: - call new_nullpointerexception - pop %r10 /* delete return address */ - sub $3,%r10 /* faulting address is ra - 3 */ - jmp asm_handle_exception -#endif - + /* store address of new code */ + push (offes_pc)(%rbp) + + /* copy registers from execution state */ + movq (XMM0 *8+offes_fltregs)(%rbp),%xmm0 + movq (XMM1 *8+offes_fltregs)(%rbp),%xmm1 + movq (XMM2 *8+offes_fltregs)(%rbp),%xmm2 + movq (XMM3 *8+offes_fltregs)(%rbp),%xmm3 + movq (XMM4 *8+offes_fltregs)(%rbp),%xmm4 + movq (XMM5 *8+offes_fltregs)(%rbp),%xmm5 + movq (XMM6 *8+offes_fltregs)(%rbp),%xmm6 + movq (XMM7 *8+offes_fltregs)(%rbp),%xmm7 + movq (XMM8 *8+offes_fltregs)(%rbp),%xmm8 + movq (XMM9 *8+offes_fltregs)(%rbp),%xmm9 + movq (XMM10*8+offes_fltregs)(%rbp),%xmm10 + movq (XMM11*8+offes_fltregs)(%rbp),%xmm11 + movq (XMM12*8+offes_fltregs)(%rbp),%xmm12 + movq (XMM13*8+offes_fltregs)(%rbp),%xmm13 + movq (XMM14*8+offes_fltregs)(%rbp),%xmm14 + movq (XMM15*8+offes_fltregs)(%rbp),%xmm15 + + mov (RAX*8+offes_intregs)(%rbp),%rax + mov (RBX*8+offes_intregs)(%rbp),%rbx + mov (RCX*8+offes_intregs)(%rbp),%rcx + mov (RDX*8+offes_intregs)(%rbp),%rdx + mov (RSI*8+offes_intregs)(%rbp),%rsi + mov (RDI*8+offes_intregs)(%rbp),%rdi + mov (R8 *8+offes_intregs)(%rbp),%r8 + mov (R9 *8+offes_intregs)(%rbp),%r9 + mov (R10*8+offes_intregs)(%rbp),%r10 + mov (R11*8+offes_intregs)(%rbp),%r11 + mov (R12*8+offes_intregs)(%rbp),%r12 + mov (R13*8+offes_intregs)(%rbp),%r13 + mov (R14*8+offes_intregs)(%rbp),%r14 + mov (R15*8+offes_intregs)(%rbp),%r15 + + mov (RBP*8+offes_intregs)(%rbp),%rbp + + /* jump to new code */ + ret -/********************* function asm_builtin_x2x ******************************** +/* asm_builtin_x2x ************************************************************* * * * Wrapper functions for float to int corner cases * * * *******************************************************************************/ asm_builtin_f2i: - sub $(14*8),%rsp + sub $(ARG_CNT*8),sp - SAVE_ARGUMENT_REGISTERS + SAVE_ARGUMENT_REGISTERS(0) - movq %xmm8,%xmm0 - call builtin_f2i + movq ftmp1,fa0 + call builtin_f2i@PLT - RESTORE_ARGUMENT_REGISTERS + RESTORE_ARGUMENT_REGISTERS(0) - add $(14*8),%rsp + add $(ARG_CNT*8),sp ret asm_builtin_f2l: - sub $(14*8),%rsp + sub $(ARG_CNT*8),sp - SAVE_ARGUMENT_REGISTERS + SAVE_ARGUMENT_REGISTERS(0) - movq %xmm8,%xmm0 - call builtin_f2l + movq ftmp1,fa0 + call builtin_f2l@PLT - RESTORE_ARGUMENT_REGISTERS + RESTORE_ARGUMENT_REGISTERS(0) - add $(14*8),%rsp + add $(ARG_CNT*8),sp ret asm_builtin_d2i: - sub $(14*8),%rsp + sub $(ARG_CNT*8),sp - SAVE_ARGUMENT_REGISTERS + SAVE_ARGUMENT_REGISTERS(0) - movq %xmm8,%xmm0 - call builtin_d2i + movq ftmp1,fa0 + call builtin_d2i@PLT - RESTORE_ARGUMENT_REGISTERS + RESTORE_ARGUMENT_REGISTERS(0) - add $(14*8),%rsp + add $(ARG_CNT*8),sp ret asm_builtin_d2l: - sub $(14*8),%rsp + sub $(ARG_CNT*8),sp - SAVE_ARGUMENT_REGISTERS + SAVE_ARGUMENT_REGISTERS(0) - movq %xmm8,%xmm0 - call builtin_d2l + movq ftmp1,fa0 + call builtin_d2l@PLT - RESTORE_ARGUMENT_REGISTERS + RESTORE_ARGUMENT_REGISTERS(0) - add $(14*8),%rsp - ret - - -/* asm_builtin_checkarraycast ************************************************** - - Does the cast check and eventually throws an exception. - -*******************************************************************************/ - -asm_builtin_checkarraycast: - sub $24,%rsp /* keep stack 16-byte aligned */ - mov %rdi,(%rsp) /* save object pointer */ - call builtin_checkarraycast /* builtin_checkarraycast */ - test %rax,%rax /* if (false) throw exception */ - je nb_carray_throw - mov (%rsp),%rax /* return object pointer */ - add $24,%rsp /* free stack space */ - ret - -nb_carray_throw: - call new_classcastexception - add $24,%rsp - pop %r10 /* delete return address */ - sub $3,%r10 /* faulting address is ra - 3 */ - jmp asm_handle_exception - - -/* asm_builtin_aastore ********************************************************* - - Checks if the object can be stored in the given array and stores the - address if it's possible. This function can also throw some exceptions. - -*******************************************************************************/ - -asm_builtin_aastore: - sub $(3*8),%rsp /* allocate stack space */ - test %rdi,%rdi /* if null pointer throw exception */ - je nb_aastore_null - - movl offarraysize(%rdi),%eax /* load size */ - cmpl %eax,%esi /* do bound check */ - jae nb_aastore_bound /* if out of bounds throw exception */ - - shl $3,%rsi /* index * 8 */ - mov %rdi,%r10 - add %rsi,%r10 /* add index * 8 to arrayref */ - - mov %r10,(%rsp) /* save store position */ - mov %rdx,8(%rsp) /* save object */ - - mov %rdx,%rsi /* object is second argument */ - call builtin_canstore /* builtin_canstore(arrayref,object) */ - test %rax,%rax /* if (false) throw exception */ - je nb_aastore_throw - - mov (%rsp),%r10 /* restore store position */ - mov 8(%rsp),%rdx /* restore object */ - mov %rdx,offobjarrdata(%r10)/* store objectptr in array */ - add $(3*8),%rsp /* free stack space */ + add $(ARG_CNT*8),sp ret -nb_aastore_null: - call new_nullpointerexception - add $24,%rsp - pop %r10 /* delete return address */ - sub $3,%r10 /* faulting address is return adress - 3 */ - jmp asm_handle_exception - -nb_aastore_bound: - mov %rsi,%rdi /* move index into a0 */ - call new_arrayindexoutofboundsexception - add $24,%rsp - pop %r10 /* delete return address */ - sub $3,%r10 /* faulting address is return adress - 3 */ - jmp asm_handle_exception - -nb_aastore_throw: - call new_arraystoreexception - add $24,%rsp - pop %r10 /* delete return address */ - sub $3,%r10 /* faulting address is return adress - 3 */ - jmp asm_handle_exception - /******************* function asm_initialize_thread_stack ********************** * * * initialized a thread stack * @@ -1771,12 +909,12 @@ asm_switchstackandcall: asm_getclassvalues_atomic: -_crit_restart2: -_crit_begin2: +_crit_restart: +_crit_begin: movl offbaseval(a0),itmp1l movl offdiffval(a0),itmp2l movl offbaseval(a1),itmp3l -_crit_end2: +_crit_end: movl itmp1l,offcast_super_baseval(a2) movl itmp2l,offcast_super_diffval(a2) movl itmp3l,offcast_sub_baseval(a2) @@ -1786,16 +924,20 @@ _crit_end2: asm_criticalsections: #if defined(USE_THREADS) && defined(NATIVE_THREADS) - .quad _crit_begin1 - .quad _crit_end1 - .quad _crit_restart1 - .quad _crit_begin2 - .quad _crit_end2 - .quad _crit_restart2 + .quad _crit_begin + .quad _crit_end + .quad _crit_restart #endif .quad 0 - + +/* Disable exec-stacks, required for Gentoo ***********************************/ + +#if defined(__GCC__) && defined(__ELF__) + .section .note.GNU-stack,"",@progbits +#endif + + /* * These are local overrides for various environment variables in Emacs. * Please do not remove this and leave it at the end of the file, where @@ -1807,4 +949,5 @@ asm_criticalsections: * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */