diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2015-03-03 17:28:05 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-03-03 17:28:06 +0000 |
commit | dc47e986941b1a3754447fabea272485f3f0f382 (patch) | |
tree | 6d5b3e5e93202bc33e73c1726d8a2ca3913dcbf6 | |
parent | 775f1d4096efce112a3bd1e5897c84f898c5f7ce (diff) | |
parent | 126d65952a03b3e44d5021208673c01920a982a4 (diff) | |
download | art-dc47e986941b1a3754447fabea272485f3f0f382.zip art-dc47e986941b1a3754447fabea272485f3f0f382.tar.gz art-dc47e986941b1a3754447fabea272485f3f0f382.tar.bz2 |
Merge "Fix generic JNI stubs to not discard the Java native frame."
-rw-r--r-- | runtime/arch/arm/quick_entrypoints_arm.S | 19 | ||||
-rw-r--r-- | runtime/arch/arm64/quick_entrypoints_arm64.S | 24 | ||||
-rw-r--r-- | runtime/arch/mips/quick_entrypoints_mips.S | 9 | ||||
-rw-r--r-- | runtime/arch/mips64/quick_entrypoints_mips64.S | 7 | ||||
-rw-r--r-- | runtime/arch/x86/quick_entrypoints_x86.S | 19 | ||||
-rw-r--r-- | runtime/arch/x86_64/quick_entrypoints_x86_64.S | 48 |
6 files changed, 48 insertions, 78 deletions
diff --git a/runtime/arch/arm/quick_entrypoints_arm.S b/runtime/arch/arm/quick_entrypoints_arm.S index fec1ce5..539b607 100644 --- a/runtime/arch/arm/quick_entrypoints_arm.S +++ b/runtime/arch/arm/quick_entrypoints_arm.S @@ -890,7 +890,7 @@ ENTRY art_quick_generic_jni_trampoline // r1: pointer to the bottom of the used area of the alloca, can restore stack till there. // Check for error = 0. - cbz r0, .Lentry_error + cbz r0, .Lexception_in_native // Release part of the alloca. mov sp, r1 @@ -920,10 +920,6 @@ ENTRY art_quick_generic_jni_trampoline blx artQuickGenericJniEndTrampoline - // Tear down the alloca. - mov sp, r10 - .cfi_def_cfa_register sp - // Restore self pointer. mov r9, r11 @@ -931,6 +927,10 @@ ENTRY art_quick_generic_jni_trampoline ldr r2, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ cbnz r2, .Lexception_in_native + // Tear down the alloca. + mov sp, r10 + .cfi_def_cfa_register sp + // Tear down the callee-save frame. Skip arg registers. add sp, #FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE-FRAME_SIZE_REFS_ONLY_CALLEE_SAVE .cfi_adjust_cfa_offset -(FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE-FRAME_SIZE_REFS_ONLY_CALLEE_SAVE) @@ -943,14 +943,11 @@ ENTRY art_quick_generic_jni_trampoline .cfi_def_cfa_register r10 .cfi_adjust_cfa_offset FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE-FRAME_SIZE_REFS_ONLY_CALLEE_SAVE -.Lentry_error: - mov sp, r10 - .cfi_def_cfa_register sp - mov r9, r11 .Lexception_in_native: - RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME + ldr sp, [r9, #THREAD_TOP_QUICK_FRAME_OFFSET] + .cfi_def_cfa_register sp + # This will create a new save-all frame, required by the runtime. DELIVER_PENDING_EXCEPTION - END art_quick_generic_jni_trampoline .extern artQuickToInterpreterBridge diff --git a/runtime/arch/arm64/quick_entrypoints_arm64.S b/runtime/arch/arm64/quick_entrypoints_arm64.S index 770073b..ec25a33 100644 --- a/runtime/arch/arm64/quick_entrypoints_arm64.S +++ b/runtime/arch/arm64/quick_entrypoints_arm64.S @@ -1510,7 +1510,7 @@ ENTRY art_quick_generic_jni_trampoline // x1: pointer to the bottom of the used area of the alloca, can restore stack till there. // Check for error = 0. - cbz x0, .Lentry_error + cbz x0, .Lexception_in_native // Release part of the alloca. mov sp, x1 @@ -1545,15 +1545,15 @@ ENTRY art_quick_generic_jni_trampoline bl artQuickGenericJniEndTrampoline + // Pending exceptions possible. + // Use xETR as xSELF might be scratched by native code + ldr x2, [xETR, THREAD_EXCEPTION_OFFSET] + cbnz x2, .Lexception_in_native + // Tear down the alloca. mov sp, x28 .cfi_def_cfa_register sp - // Pending exceptions possible. - // Use xETR as xSELF might be scratched by native code - ldr x1, [xETR, THREAD_EXCEPTION_OFFSET] - cbnz x1, .Lexception_in_native - // Tear down the callee-save frame. RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME @@ -1561,13 +1561,15 @@ ENTRY art_quick_generic_jni_trampoline fmov d0, x0 ret -.Lentry_error: - mov sp, x28 - .cfi_def_cfa_register sp .Lexception_in_native: - RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME + // Restore xSELF. It might have been scratched by native code. + mov xSELF, xETR + // Move to x1 then sp to please assembler. + ldr x1, [xSELF, # THREAD_TOP_QUICK_FRAME_OFFSET] + mov sp, x1 + .cfi_def_cfa_register sp + # This will create a new save-all frame, required by the runtime. DELIVER_PENDING_EXCEPTION - END art_quick_generic_jni_trampoline /* diff --git a/runtime/arch/mips/quick_entrypoints_mips.S b/runtime/arch/mips/quick_entrypoints_mips.S index df2feb7..16f0e70 100644 --- a/runtime/arch/mips/quick_entrypoints_mips.S +++ b/runtime/arch/mips/quick_entrypoints_mips.S @@ -1142,10 +1142,10 @@ ENTRY art_quick_generic_jni_trampoline addiu $sp, $sp, -24 # reserve arg slots jal artQuickGenericJniEndTrampoline s.d $f0, 16($sp) # pass result_f - addiu $sp, $sp, 24 # remove arg slots lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ - bne $t0, $zero, 2f # check for pending exceptions + bne $t0, $zero, 1f # check for pending exceptions + move $sp, $s8 # tear down the alloca # tear dpown the callee-save frame @@ -1156,9 +1156,8 @@ ENTRY art_quick_generic_jni_trampoline nop 1: - move $sp, $s8 # tear down the alloca -2: - RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME + lw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF) + # This will create a new save-all frame, required by the runtime. DELIVER_PENDING_EXCEPTION END art_quick_generic_jni_trampoline diff --git a/runtime/arch/mips64/quick_entrypoints_mips64.S b/runtime/arch/mips64/quick_entrypoints_mips64.S index 60e692b..6f1b826 100644 --- a/runtime/arch/mips64/quick_entrypoints_mips64.S +++ b/runtime/arch/mips64/quick_entrypoints_mips64.S @@ -849,7 +849,7 @@ ENTRY art_quick_generic_jni_trampoline dmfc1 $a2, $f0 ld $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ - bne $t0, $zero, 2f # check for pending exceptions + bne $t0, $zero, 1f # check for pending exceptions move $sp, $s8 # tear down the alloca # tear dpown the callee-save frame @@ -859,9 +859,8 @@ ENTRY art_quick_generic_jni_trampoline dmtc1 $v0, $f0 # place return value to FP return value 1: - move $sp, $s8 # tear down the alloca -2: - RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME + ld $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF) + # This will create a new save-all frame, required by the runtime. DELIVER_PENDING_EXCEPTION END art_quick_generic_jni_trampoline diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S index c2acdd1..47bc5ea 100644 --- a/runtime/arch/x86/quick_entrypoints_x86.S +++ b/runtime/arch/x86/quick_entrypoints_x86.S @@ -1349,7 +1349,7 @@ DEFINE_FUNCTION art_quick_generic_jni_trampoline // Check for error = 0. test %eax, %eax - jz .Lentry_error + jz .Lexception_in_native // Release part of the alloca. movl %edx, %esp @@ -1371,15 +1371,16 @@ DEFINE_FUNCTION art_quick_generic_jni_trampoline pushl %fs:THREAD_SELF_OFFSET // Pass Thread::Current(). call SYMBOL(artQuickGenericJniEndTrampoline) - // Tear down the alloca. - movl %ebp, %esp - CFI_DEF_CFA_REGISTER(esp) - // Pending exceptions possible. mov %fs:THREAD_EXCEPTION_OFFSET, %ebx testl %ebx, %ebx jnz .Lexception_in_native + // Tear down the alloca. + movl %ebp, %esp + CFI_DEF_CFA_REGISTER(esp) + + // Tear down the callee-save frame. // Remove space for FPR args and EAX addl LITERAL(4 + 4 * 8), %esp @@ -1397,11 +1398,11 @@ DEFINE_FUNCTION art_quick_generic_jni_trampoline movd %edx, %xmm1 punpckldq %xmm1, %xmm0 ret -.Lentry_error: - movl %ebp, %esp - CFI_DEF_CFA_REGISTER(esp) .Lexception_in_native: - RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME + movl %fs:THREAD_TOP_QUICK_FRAME_OFFSET, %esp + // Do a call to push a new save-all frame required by the runtime. + call .Lexception_call +.Lexception_call: DELIVER_PENDING_EXCEPTION END_FUNCTION art_quick_generic_jni_trampoline diff --git a/runtime/arch/x86_64/quick_entrypoints_x86_64.S b/runtime/arch/x86_64/quick_entrypoints_x86_64.S index c865541..406126b 100644 --- a/runtime/arch/x86_64/quick_entrypoints_x86_64.S +++ b/runtime/arch/x86_64/quick_entrypoints_x86_64.S @@ -1361,7 +1361,7 @@ DEFINE_FUNCTION art_quick_generic_jni_trampoline // Check for error = 0. test %rax, %rax - jz .Lentry_error + jz .Lexception_in_native // Release part of the alloca. movq %rdx, %rsp @@ -1398,16 +1398,16 @@ DEFINE_FUNCTION art_quick_generic_jni_trampoline movq %xmm0, %rdx call SYMBOL(artQuickGenericJniEndTrampoline) - // Tear down the alloca. - movq %rbp, %rsp - CFI_DEF_CFA_REGISTER(rsp) - // Pending exceptions possible. // TODO: use cmpq, needs direct encoding because of gas bug movq %gs:THREAD_EXCEPTION_OFFSET, %rcx test %rcx, %rcx jnz .Lexception_in_native + // Tear down the alloca. + movq %rbp, %rsp + CFI_DEF_CFA_REGISTER(rsp) + // Tear down the callee-save frame. // Load FPRs. // movq %xmm0, 16(%rsp) // doesn't make sense!!! @@ -1440,40 +1440,12 @@ DEFINE_FUNCTION art_quick_generic_jni_trampoline // store into fpr, for when it's a fpr return... movq %rax, %xmm0 ret -.Lentry_error: - movq %rbp, %rsp - CFI_DEF_CFA_REGISTER(rsp) .Lexception_in_native: - // TODO: the handle scope contains the this pointer which is used by the debugger for exception - // delivery. - movq %xmm0, 16(%rsp) // doesn't make sense!!! - movq 24(%rsp), %xmm1 // neither does this!!! - movq 32(%rsp), %xmm2 - movq 40(%rsp), %xmm3 - movq 48(%rsp), %xmm4 - movq 56(%rsp), %xmm5 - movq 64(%rsp), %xmm6 - movq 72(%rsp), %xmm7 - movq 80(%rsp), %xmm12 - movq 88(%rsp), %xmm13 - movq 96(%rsp), %xmm14 - movq 104(%rsp), %xmm15 - // was 80 + 32 bytes - addq LITERAL(80 + 4*8), %rsp - CFI_ADJUST_CFA_OFFSET(-80 - 4*8) - // Save callee and GPR args, mixed together to agree with core spills bitmap. - POP rcx // Arg. - POP rdx // Arg. - POP rbx // Callee save. - POP rbp // Callee save. - POP rsi // Arg. - POP r8 // Arg. - POP r9 // Arg. - POP r12 // Callee save. - POP r13 // Callee save. - POP r14 // Callee save. - POP r15 // Callee save. - + movq %gs:THREAD_TOP_QUICK_FRAME_OFFSET, %rsp + CFI_DEF_CFA_REGISTER(rsp) + // Do a call to push a new save-all frame required by the runtime. + call .Lexception_call +.Lexception_call: DELIVER_PENDING_EXCEPTION END_FUNCTION art_quick_generic_jni_trampoline |