1 /* 2 * =========================================================================== 3 * Common subroutines and data 4 * =========================================================================== 5 */ 6 7 .section .data.rel.ro 8 .align 4 9 .LinvokeNative: 10 # Prep for the native call 11 # a1 = newFP, a0 = methodToCall 12 lw t9, offThread_jniLocal_topCookie(rSELF) # t9<- thread->localRef->... 13 sw zero, offThread_inJitCodeCache(rSELF) # not in jit code cache 14 sw a1, offThread_curFrame(rSELF) # self->curFrame = newFp 15 sw t9, (offStackSaveArea_localRefCookie - sizeofStackSaveArea)(a1) 16 # newFp->localRefCookie=top 17 lhu ra, offThread_subMode(rSELF) 18 SAVEAREA_FROM_FP(rBIX, a1) # rBIX<- new stack save area 19 20 move a2, a0 # a2<- methodToCall 21 move a0, a1 # a0<- newFp 22 add a1, rSELF, offThread_retval # a1<- &retval 23 move a3, rSELF # a3<- self 24 andi ra, kSubModeMethodTrace 25 beqz ra, 121f 26 # a2: methodToCall 27 # preserve a0-a3 28 SCRATCH_STORE(a0, 0) 29 SCRATCH_STORE(a1, 4) 30 SCRATCH_STORE(a2, 8) 31 SCRATCH_STORE(a3, 12) 32 33 move a0, a2 34 move a1, rSELF 35 la t9, dvmFastMethodTraceEnter 36 JALR(t9) 37 lw gp, STACK_OFFSET_GP(sp) 38 39 # restore a0-a3 40 SCRATCH_LOAD(a3, 12) 41 SCRATCH_LOAD(a2, 8) 42 SCRATCH_LOAD(a1, 4) 43 SCRATCH_LOAD(a0, 0) 44 45 lw t9, offMethod_nativeFunc(a2) 46 JALR(t9) # call methodToCall->nativeFunc 47 lw gp, STACK_OFFSET_GP(sp) 48 49 # restore a2 again 50 SCRATCH_LOAD(a2, 8) 51 52 move a0, a2 53 move a1, rSELF 54 la t9, dvmFastNativeMethodTraceExit 55 JALR(t9) 56 lw gp, STACK_OFFSET_GP(sp) 57 b 212f 58 59 121: 60 lw t9, offMethod_nativeFunc(a2) 61 JALR(t9) # call methodToCall->nativeFunc 62 lw gp, STACK_OFFSET_GP(sp) 63 64 212: 65 # native return; rBIX=newSaveArea 66 # equivalent to dvmPopJniLocals 67 lw a2, offStackSaveArea_returnAddr(rBIX) # a2 = chaining cell ret addr 68 lw a0, offStackSaveArea_localRefCookie(rBIX) # a0<- saved->top 69 lw a1, offThread_exception(rSELF) # check for exception 70 sw rFP, offThread_curFrame(rSELF) # self->curFrame = fp 71 sw a0, offThread_jniLocal_topCookie(rSELF) # new top <- old top 72 lw a0, offStackSaveArea_savedPc(rBIX) # reload rPC 73 74 # a0 = dalvikCallsitePC 75 bnez a1, .LhandleException # handle exception if any 76 77 sw a2, offThread_inJitCodeCache(rSELF) # set the mode properly 78 beqz a2, 3f 79 jr a2 # go if return chaining cell still exist 80 81 3: 82 # continue executing the next instruction through the interpreter 83 la a1, .LdvmJitToInterpTraceSelectNoChain # defined in footer.S 84 lw a1, (a1) 85 add rPC, a0, 3*2 # reconstruct new rPC 86 87 #if defined(WITH_JIT_TUNING) 88 li a0, kCallsiteInterpreted 89 #endif 90 jr a1 91 92 93 /* 94 * On entry: 95 * a0 Faulting Dalvik PC 96 */ 97 .LhandleException: 98 #if defined(WITH_SELF_VERIFICATION) 99 la t0, .LdeadFood 100 lw t0, (t0) # should not see this under self-verification mode 101 jr t0 102 .LdeadFood: 103 .word 0xdeadf00d 104 #endif 105 sw zero, offThread_inJitCodeCache(rSELF) # in interpreter land 106 la a1, .LdvmMterpCommonExceptionThrown # PIC way of getting &func 107 lw a1, (a1) 108 la rIBASE, .LdvmAsmInstructionStart # PIC way of getting &func 109 lw rIBASE, (rIBASE) 110 move rPC, a0 # reload the faulting Dalvid address 111 jr a1 # branch to dvmMterpCommonExeceptionThrown 112 113 .align 4 114 .LdvmAsmInstructionStart: 115 .word dvmAsmInstructionStart 116 .LdvmJitToInterpNoChainNoProfile: 117 .word dvmJitToInterpNoChainNoProfile 118 .LdvmJitToInterpTraceSelectNoChain: 119 .word dvmJitToInterpTraceSelectNoChain 120 .LdvmJitToInterpNoChain: 121 .word dvmJitToInterpNoChain 122 .LdvmMterpStdBail: 123 .word dvmMterpStdBail 124 .LdvmMterpCommonExceptionThrown: 125 .word dvmMterpCommonExceptionThrown 126 .LdvmLockObject: 127 .word dvmLockObject 128 #if defined(WITH_JIT_TUNING) 129 .LdvmICHitCount: 130 .word gDvmICHitCount 131 #endif 132 #if defined(WITH_SELF_VERIFICATION) 133 .LdvmSelfVerificationMemOpDecode: 134 .word dvmSelfVerificationMemOpDecode 135 #endif 136 137 .global dvmCompilerTemplateEnd 138 dvmCompilerTemplateEnd: 139 140 #endif /* WITH_JIT */ 141