footer.S revision 5dfcc78af479937ba8dafceefd9b1931a88dfaaf
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 move rTEMP, a2 # preserve a2 33 34 move a0, rTEMP 35 move a1, rSELF 36 la t9, dvmFastMethodTraceEnter 37 JALR(t9) 38 lw gp, STACK_OFFSET_GP(sp) 39 40 # restore a0-a3 41 SCRATCH_LOAD(a3, 12) 42 SCRATCH_LOAD(a2, 8) 43 SCRATCH_LOAD(a1, 4) 44 SCRATCH_LOAD(a0, 0) 45 46 lw t9, offMethod_nativeFunc(a2) 47 JALR(t9) # call methodToCall->nativeFunc 48 lw gp, STACK_OFFSET_GP(sp) 49 50 move a0, rTEMP 51 move a1, rSELF 52 la t9, dvmFastNativeMethodTraceExit 53 JALR(t9) 54 lw gp, STACK_OFFSET_GP(sp) 55 b 212f 56 57121: 58 lw t9, offMethod_nativeFunc(a2) 59 JALR(t9) # call methodToCall->nativeFunc 60 lw gp, STACK_OFFSET_GP(sp) 61 62212: 63 # native return; rBIX=newSaveArea 64 # equivalent to dvmPopJniLocals 65 lw a2, offStackSaveArea_returnAddr(rBIX) # a2 = chaining cell ret addr 66 lw a0, offStackSaveArea_localRefCookie(rBIX) # a0<- saved->top 67 lw a1, offThread_exception(rSELF) # check for exception 68 sw rFP, offThread_curFrame(rSELF) # self->curFrame = fp 69 sw a0, offThread_jniLocal_topCookie(rSELF) # new top <- old top 70 lw a0, offStackSaveArea_savedPc(rBIX) # reload rPC 71 72 # a0 = dalvikCallsitePC 73 bnez a1, .LhandleException # handle exception if any 74 75 sw a2, offThread_inJitCodeCache(rSELF) # set the mode properly 76 beqz a2, 3f 77 jr a2 # go if return chaining cell still exist 78 793: 80 # continue executing the next instruction through the interpreter 81 la a1, .LdvmJitToInterpTraceSelectNoChain # defined in footer.S 82 lw a1, (a1) 83 add rPC, a0, 3*2 # reconstruct new rPC 84 85#if defined(WITH_JIT_TUNING) 86 li a0, kCallsiteInterpreted 87#endif 88 jr a1 89 90 91/* 92 * On entry: 93 * a0 Faulting Dalvik PC 94 */ 95.LhandleException: 96#if defined(WITH_SELF_VERIFICATION) 97 la t0, .LdeadFood 98 lw t0, (t0) # should not see this under self-verification mode 99 jr t0 100.LdeadFood: 101 .word 0xdeadf00d 102#endif 103 sw zero, offThread_inJitCodeCache(rSELF) # in interpreter land 104 la a1, .LdvmMterpCommonExceptionThrown # PIC way of getting &func 105 lw a1, (a1) 106 la rIBASE, .LdvmAsmInstructionStart # PIC way of getting &func 107 lw rIBASE, (rIBASE) 108 move rPC, a0 # reload the faulting Dalvid address 109 jr a1 # branch to dvmMterpCommonExeceptionThrown 110 111 .align 4 112.LdvmAsmInstructionStart: 113 .word dvmAsmInstructionStart 114.LdvmJitToInterpNoChainNoProfile: 115 .word dvmJitToInterpNoChainNoProfile 116.LdvmJitToInterpTraceSelectNoChain: 117 .word dvmJitToInterpTraceSelectNoChain 118.LdvmJitToInterpNoChain: 119 .word dvmJitToInterpNoChain 120.LdvmMterpStdBail: 121 .word dvmMterpStdBail 122.LdvmMterpCommonExceptionThrown: 123 .word dvmMterpCommonExceptionThrown 124.LdvmLockObject: 125 .word dvmLockObject 126#if defined(WITH_JIT_TUNING) 127.LdvmICHitCount: 128 .word gDvmICHitCount 129#endif 130#if defined(WITH_SELF_VERIFICATION) 131.LdvmSelfVerificationMemOpDecode: 132 .word dvmSelfVerificationMemOpDecode 133#endif 134 135 .global dmvCompilerTemplateEnd 136dmvCompilerTemplateEnd: 137 138#endif /* WITH_JIT */ 139