1 /* 2 * =========================================================================== 3 * Common subroutines and data 4 * =========================================================================== 5 */ 6 7 .text 8 .align 2 9 .LinvokeNative: 10 @ Prep for the native call 11 @ r1 = newFP, r0 = methodToCall 12 mov r2, #0 13 ldr r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->... 14 str r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache 15 str r1, [rSELF, #offThread_curFrame] @ curFrame = newFp 16 str r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)] 17 @ newFp->localRefCookie=top 18 ldrh lr, [rSELF, #offThread_subMode] 19 SAVEAREA_FROM_FP(r10, r1) @ r10<- new stack save area 20 21 mov r2, r0 @ r2<- methodToCall 22 mov r0, r1 @ r0<- newFP 23 add r1, rSELF, #offThread_retval @ r1<- &retval 24 mov r3, rSELF @ arg3<- self 25 ands lr, #kSubModeMethodTrace 26 beq 121f @ hop if not profiling 27 @ r2: methodToCall, r6: rSELF 28 stmfd sp!, {r2,r6} 29 stmfd sp!, {r0-r3} 30 mov r0, r2 31 mov r1, r6 32 mov lr, pc 33 ldr pc, .LdvmFastMethodTraceEnter 34 ldmfd sp!, {r0-r3} 35 36 mov lr, pc 37 ldr pc, [r2, #offMethod_nativeFunc] 38 39 ldmfd sp!, {r0-r1} 40 mov lr, pc 41 ldr pc, .LdvmFastNativeMethodTraceExit 42 b 212f 43 121: 44 mov lr, pc 45 ldr pc, [r2, #offMethod_nativeFunc] 46 212: 47 48 @ native return; r10=newSaveArea 49 @ equivalent to dvmPopJniLocals 50 ldr r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret 51 ldr r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top 52 ldr r1, [rSELF, #offThread_exception] @ check for exception 53 str rFP, [rSELF, #offThread_curFrame] @ curFrame = fp 54 cmp r1, #0 @ null? 55 str r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top 56 ldr r0, [r10, #offStackSaveArea_savedPc] @ reload rPC 57 58 @ r0 = dalvikCallsitePC 59 bne .LhandleException @ no, handle exception 60 61 str r2, [rSELF, #offThread_inJitCodeCache] @ set the new mode 62 cmp r2, #0 @ return chaining cell still exists? 63 bxne r2 @ yes - go ahead 64 65 @ continue executing the next instruction through the interpreter 66 ldr r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S 67 add rPC, r0, #6 @ reconstruct new rPC (advance 6 bytes) 68 #if defined(WITH_JIT_TUNING) 69 mov r0, #kCallsiteInterpreted 70 #endif 71 mov pc, r1 72 73 /* 74 * On entry: 75 * r0 Faulting Dalvik PC 76 */ 77 .LhandleException: 78 #if defined(WITH_SELF_VERIFICATION) 79 ldr pc, .LdeadFood @ should not see this under self-verification mode 80 .LdeadFood: 81 .word 0xdeadf00d 82 #endif 83 mov r2, #0 84 str r2, [rSELF, #offThread_inJitCodeCache] @ in interpreter land 85 ldr r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func 86 ldr rIBASE, .LdvmAsmInstructionStart @ same as above 87 mov rPC, r0 @ reload the faulting Dalvik address 88 mov pc, r1 @ branch to dvmMterpCommonExceptionThrown 89 90 .align 2 91 .LdvmAsmInstructionStart: 92 .word dvmAsmInstructionStart 93 .LdvmJitToInterpNoChainNoProfile: 94 .word dvmJitToInterpNoChainNoProfile 95 .LdvmJitToInterpTraceSelectNoChain: 96 .word dvmJitToInterpTraceSelectNoChain 97 .LdvmJitToInterpNoChain: 98 .word dvmJitToInterpNoChain 99 .LdvmMterpStdBail: 100 .word dvmMterpStdBail 101 .LdvmMterpCommonExceptionThrown: 102 .word dvmMterpCommonExceptionThrown 103 .LdvmLockObject: 104 .word dvmLockObject 105 .LdvmJitTraceProfilingOff: 106 .word dvmJitTraceProfilingOff 107 #if defined(WITH_JIT_TUNING) 108 .LdvmICHitCount: 109 .word gDvmICHitCount 110 #endif 111 #if defined(WITH_SELF_VERIFICATION) 112 .LdvmSelfVerificationMemOpDecode: 113 .word dvmSelfVerificationMemOpDecode 114 #endif 115 .LdvmFastMethodTraceEnter: 116 .word dvmFastMethodTraceEnter 117 .LdvmFastNativeMethodTraceExit: 118 .word dvmFastNativeMethodTraceExit 119 .LdvmFastMethodTraceExit: 120 .word dvmFastMethodTraceExit 121 .L__aeabi_cdcmple: 122 .word __aeabi_cdcmple 123 .L__aeabi_cfcmple: 124 .word __aeabi_cfcmple 125 126 .global dmvCompilerTemplateEnd 127 dmvCompilerTemplateEnd: 128 129 #endif /* WITH_JIT */ 130