Home | History | Annotate | Download | only in mips
      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