1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *  Common subroutines and data
4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
75dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .section .data.rel.ro
8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LinvokeNative:
10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Prep for the native call
11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall
127a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
139f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
149f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache
1530bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
16d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
17d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
18389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    lr, [rSELF, #offThread_subMode]
19ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
20ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r2, r0                      @ r2<- methodToCall
22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r1                      @ r0<- newFP
239f601a917c8878204482c37aec7005054b6776fabuzbee    add     r1, rSELF, #offThread_retval  @ r1<- &retval
249f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r3, rSELF                   @ arg3<- self
2518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ands    lr, #kSubModeMethodTrace
2618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     121f                        @ hop if not profiling
279f601a917c8878204482c37aec7005054b6776fabuzbee    @ r2: methodToCall, r6: rSELF
285cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r2,r6}
295cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r3}
305cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r0, r2
315cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
328b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceEnter
338b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
345cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}
35ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
368b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, [r2, #offMethod_nativeFunc]
378b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
38ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
395cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r1}
408b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastNativeMethodTraceExit
418b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
4218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    b       212f
4318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee121:
448b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, [r2, #offMethod_nativeFunc]
458b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
4618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee212:
47964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
489f601a917c8878204482c37aec7005054b6776fabuzbee    @ native return; r10=newSaveArea
49ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ equivalent to dvmPopJniLocals
50ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
51d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
529f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception] @ check for exception
5330bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
54ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #0                      @ null?
559f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
564f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
5760c24f436d603c564d5351a6f81821f12635733cBen Cheng
5860c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
5960c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
6060c24f436d603c564d5351a6f81821f12635733cBen Cheng
619f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ set the new mode
6260c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
6360c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
6460c24f436d603c564d5351a6f81821f12635733cBen Cheng
6560c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
6640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
6760c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
68978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
697a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
707a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
718b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    bx      r1
72ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
734f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/*
744f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * On entry:
754f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * r0  Faulting Dalvik PC
764f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */
77ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LhandleException:
7811d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#if defined(WITH_SELF_VERIFICATION)
7911d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    ldr     pc, .LdeadFood @ should not see this under self-verification mode
8011d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng.LdeadFood:
8111d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    .word   0xdeadf00d
8211d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#endif
837a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
849f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ in interpreter land
854f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func
86cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    ldr     rIBASE, .LdvmAsmInstructionStart    @ same as above
874f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     rPC, r0                 @ reload the faulting Dalvik address
888b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    bx      r1                  @ branch to dvmMterpCommonExceptionThrown
89ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
90ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
91ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmAsmInstructionStart:
92ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmAsmInstructionStart
937a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng.LdvmJitToInterpNoChainNoProfile:
947a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .word   dvmJitToInterpNoChainNoProfile
9540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng.LdvmJitToInterpTraceSelectNoChain:
9640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .word   dvmJitToInterpTraceSelectNoChain
97ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmJitToInterpNoChain:
98ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmJitToInterpNoChain
99ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmMterpStdBail:
100ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmMterpStdBail
101cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng.LdvmMterpCommonExceptionThrown:
102cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    .word   dvmMterpCommonExceptionThrown
103c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee.LdvmLockObject:
104c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .word   dvmLockObject
1052e152baec01433de9c63633ebc6f4adf1cea3a87buzbee.LdvmJitTraceProfilingOff:
1062e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .word   dvmJitTraceProfilingOff
107978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
108978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng.LdvmICHitCount:
109978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    .word   gDvmICHitCount
110978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#endif
1119e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
1129e45c0b968d63ea38353c99252d233879c2efdafjeffhao.LdvmSelfVerificationMemOpDecode:
1139e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .word   dvmSelfVerificationMemOpDecode
1149e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
1155cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastMethodTraceEnter:
1165cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastMethodTraceEnter
1175cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastNativeMethodTraceExit:
1185cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastNativeMethodTraceExit
1199a3147c7412f4794434b4c2604aa2ba784867774buzbee.LdvmFastMethodTraceExit:
1209a3147c7412f4794434b4c2604aa2ba784867774buzbee    .word   dvmFastMethodTraceExit
121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cdcmple:
122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cdcmple
123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cfcmple:
124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cfcmple
125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
126d585beda3690b8b5b978e3c59af224336614ba72Yanchuan Nian    .global dvmCompilerTemplateEnd
127d585beda3690b8b5b978e3c59af224336614ba72Yanchuan NiandvmCompilerTemplateEnd:
128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /* WITH_JIT */
130