| |
| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| /* |
| * Interpreter entry point. |
| */ |
| |
| #define ASSIST_DEBUGGER 1 |
| |
| .text |
| .align 2 |
| .global dvmMterpStdRun |
| .ent dvmMterpStdRun |
| .frame sp, STACK_SIZE, ra |
| /* |
| * On entry: |
| * r0 Thread* self |
| * |
| * The return comes via a call to dvmMterpStdBail(). |
| */ |
| |
| dvmMterpStdRun: |
| .set noreorder |
| .cpload t9 |
| .set reorder |
| /* Save to the stack. Frame size = STACK_SIZE */ |
| STACK_STORE_FULL() |
| /* This directive will make sure all subsequent jal restore gp at a known offset */ |
| .cprestore STACK_OFFSET_GP |
| |
| addu fp, sp, STACK_SIZE # Move Frame Pointer to the base of frame |
| /* save stack pointer, add magic word for debuggerd */ |
| sw sp, offThread_bailPtr(a0) # Save SP |
| |
| /* set up "named" registers, figure out entry point */ |
| move rSELF, a0 # set rSELF |
| LOAD_PC_FROM_SELF() |
| LOAD_FP_FROM_SELF() |
| lw rIBASE, offThread_curHandlerTable(rSELF) |
| |
| #if defined(WITH_JIT) |
| .LentryInstr: |
| /* Entry is always a possible trace start */ |
| lw a0, offThread_pJitProfTable(rSELF) |
| FETCH_INST() # load rINST from rPC |
| sw zero, offThread_inJitCodeCache(rSELF) |
| #if !defined(WITH_SELF_VERIFICATION) |
| bnez a0, common_updateProfile # profiling is enabled |
| #else |
| lw a2, offThread_shadowSpace(rSELF) # to find out the jit exit state |
| beqz a0, 1f # profiling is disabled |
| lw a3, offShadowSpace_jitExitState(a2) # jit exit state |
| li t0, kSVSTraceSelect |
| bne a3, t0, 2f |
| li a2, kJitTSelectRequestHot # ask for trace selection |
| b common_selectTrace # go build the trace |
| 2: |
| li a4, kSVSNoProfile |
| beq a3, a4, 1f # don't profile the next instruction? |
| b common_updateProfile # collect profiles |
| #endif |
| 1: |
| GET_INST_OPCODE(t0) # extract opcode from rINST |
| GOTO_OPCODE(t0) # jump to next instruction |
| #else |
| /* start executing the instruction at rPC */ |
| FETCH_INST() # load rINST from rPC |
| GET_INST_OPCODE(t0) # extract opcode from rINST |
| GOTO_OPCODE(t0) # jump to next instruction |
| #endif |
| |
| .Lbad_arg: |
| la a0, .LstrBadEntryPoint |
| #a1 holds value of entryPoint |
| JAL(printf) |
| JAL(dvmAbort) |
| |
| .end dvmMterpStdRun |
| |
| .global dvmMterpStdBail |
| .ent dvmMterpStdBail |
| |
| /* Restore the stack pointer and all the registers stored at sp from the save |
| * point established on entry. Return to whoever called dvmMterpStdRun. |
| * |
| * On entry: |
| * a0 Thread* self |
| */ |
| dvmMterpStdBail: |
| lw sp, offThread_bailPtr(a0) # Restore sp |
| STACK_LOAD_FULL() |
| jr ra |
| |
| .end dvmMterpStdBail |