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