1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common subroutines and data. 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backwards branch is taken 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ebx (a.k.a. rINST_FULL) -> PC adjustment in 16-bit words 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch: 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call common_periodicChecks # Note: expects rPC to be preserved 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ADVANCE_PC_INDEXED(rINST_FULL) 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST() 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_NEXT 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common invoke code (old-style). 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING: Rewrite along lines of new armv5 code? 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * eax = Method* methodToCall 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ecx = bool methodCallRange 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rINST trashed, must reload 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeOld: 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %ecx,OUT_ARG1(%esp) # arg1<- methodCallRange 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzwl (rPC),rINST_FULL # recover rINST 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG2(%esp) # arg2<- method 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzwl 4(rPC),%eax # eax<- GFED or CCCC 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_TO_GLUE(%ecx) 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_FP_TO_GLUE(%ecx) 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzbl rINST_HI,rINST_FULL 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl rINST_FULL,OUT_ARG3(%esp)# arg3<- AA 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %ecx,OUT_ARG0(%esp) # arg0<- GLUE 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG4(%esp) # arg4<- GFED/CCCC 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmMterp_invokeMethod 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_resumeAfterGlueCall 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Do we need the thread to be suspended or have debugger/profiling activity? 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ebx -> PC adjustment in 16-bit words (must be preserved) 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ecx -> GLUE pointer 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: A call will normally kill %eax, rPC/%edx and %ecx. To 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * streamline the normal case, this routine will preserve rPC and 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * %ecx in addition to the normal caller save regs. The save/restore 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is a bit ugly, but will happen in the relatively uncommon path. 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING: Might be worthwhile to inline this. 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: Basic-block style Jit will need a hook here as well. Fold it into 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the suspendCount check so we can get both in 1 shot. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks: 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offGlue_pSelfSuspendCount(%ecx),%eax # eax <- &suspendCount 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmpl $$0,(%eax) 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jne 1f 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER) 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offGlue_pDebuggerActive(%ecx),%eax # eax <- &DebuggerActive 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER) 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offGlue_pActiveProfilers(%ecx),%ecx # ecx <- &ActiveProfilers 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) && defined(WITH_PROFILER) 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzbl (%eax),%eax # eax <- debuggerActive (boolean) 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orl (%ecx),%eax # eax <- debuggerActive || activeProfilers 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_DEBUGGER) 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzbl (%eax),%eax # eax <- debuggerActive (boolean) 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_PROFILER) 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl (%ecx),%eax # eax <= activeProfilers 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) # restore rGLUE 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %eax,%eax 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jne 3f # one or both active - switch interp 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ret 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* Check for suspend */ 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* At this point, the return pointer to the caller of 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * common_periodicChecks is on the top of stack. We need to preserve 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rPC(edx) and GLUE(ecx). We'll spill rPC, and reload GLUE. 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The outgoing profile is: 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bool dvmCheckSuspendPending(Thread* self) 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Because we reached here via a call, go ahead and build a new frame. 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offGlue_self(%ecx),%eax # eax<- glue->self 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rPC) # save edx 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project push %ebp 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %esp,%ebp 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subl $$24,%esp 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG0(%esp) 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmCheckSuspendPending 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addl $$24,%esp 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pop %ebp 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rPC) 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ret 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* Switch interpreters */ 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* Note: %ebx contains the 16-bit word offset to be applied to rPC to 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "complete" the interpretation of backwards branches. In effect, we 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are completing the interpretation of the branch instruction here, 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and the new interpreter will resume interpretation at the branch 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * target. However, a switch request recognized during the handling 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of a return from method instruction results in an immediate abort, 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and the new interpreter will resume by re-interpreting the return 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction. 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3: 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project leal (rPC,%ebx,2),rPC # adjust pc to show target 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) # bail expect GLUE already loaded 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$1,rINST_FULL # set changeInterp to true 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_gotoBail 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod: 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* Set entry mode in case we bail */ 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movb $$kInterpEntryReturn,offGlue_entryPoint(%ecx) 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xorl rINST_FULL,rINST_FULL # zero offset in case we switch interps 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call common_periodicChecks # Note: expects %ecx to be preserved 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(%eax,rFP) # eax<- saveArea (old) 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offStackSaveArea_prevFrame(%eax),rFP # rFP<- prevFrame 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST_FULL 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmpl $$0,rINST_FULL # break? 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project je common_gotoBail # break frame, bail out completely 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offStackSaveArea_savedPc(%eax),rPC # pc<- saveArea->savedPC 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offGlue_self(%ecx),%eax # eax<- self 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl rINST_FULL,offGlue_method(%ecx) # glue->method = newSave->meethod 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl rFP,offThread_curFrame(%eax) # self->curFrame = fp 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offMethod_clazz(rINST_FULL),%eax # eax<- method->clazz 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST_WORD(3) 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offClassObject_pDvmDex(%eax),%eax # eax<- method->clazz->pDvmDex 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ADVANCE_PC(3) 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,offGlue_methodClassDex(%ecx) 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* not bailing - restore entry mode to default */ 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movb $$kInterpEntryInstr,offGlue_entryPoint(%ecx) 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_NEXT 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Prepare to strip the current frame and "longjump" back to caller of 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dvmMterpStdRun. 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on entry: 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rINST_FULL holds changeInterp 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ecx holds glue pointer 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected profile: dvmMterpStdBail(MterpGlue *glue, bool changeInterp) 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail: 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_TO_GLUE(%ecx) # export state to glue 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_FP_TO_GLUE(%ecx) 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %ecx,OUT_ARG0(%esp) # glue in arg0 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl rINST_FULL,OUT_ARG1(%esp) # changeInterp in arg1 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmMterpStdBail # bail out.... 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated values 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and start executing at the next instruction. 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project common_resumeAfterGlueCall: 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOAD_PC_FROM_GLUE(%ecx) 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOAD_FP_FROM_GLUE(%ecx) 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST() 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_NEXT 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero: 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$.LstrArithmeticException,%eax 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG0(%esp) 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$.LstrDivideByZero,%eax 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG1(%esp) 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rPC) 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmThrowException 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rPC) 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size. 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize: 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$.LstrNegativeArraySizeException,%eax 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG0(%esp) 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xorl %eax,%eax 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG1(%esp) 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rPC) 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmThrowException 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rPC) 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size. 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod: 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$.LstrNoSuchMethodError,%eax 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG0(%esp) 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xorl %eax,%eax 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG1(%esp) 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rPC) 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmThrowException 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rPC) 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Hit a null object when we weren't expecting one. Export the PC, throw a 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NullPointerException and goto the exception processing code. 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject: 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$.LstrNullPointerException,%eax 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG0(%esp) 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xorl %eax,%eax 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG1(%esp) 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rPC) 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmThrowException 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rPC) 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array index exceeds max. 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex: 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$.LstrArrayIndexException,%eax 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG0(%esp) 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xorl %eax,%eax 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG1(%esp) 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rPC) 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmThrowException 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rPC) 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value. 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore: 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$.LstrArrayStoreException,%eax 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG0(%esp) 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xorl %eax,%eax 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG1(%esp) 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rPC) 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmThrowException 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rPC) 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception. Handle it. 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be. 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return. 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown: 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_TO_GLUE(%ecx) 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_FP_TO_GLUE(%ecx) 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %ecx,OUT_ARG0(%esp) 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmMterp_exceptionThrown 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_resumeAfterGlueCall 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort: 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$0xdeadf00d,%eax 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call *%eax 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .section .rodata 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException: 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NullPointerException;" 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException: 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArithmeticException;" 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero: 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "divide by zero" 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException: 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArrayIndexOutOfBoundsException;" 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException: 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArrayStoreException;" 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException: 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NegativeArraySizeException;" 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError: 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/InstantiationError;" 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException: 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ClassCastException;" 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError: 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NoSuchMethodError;" 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError: 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/InternalError;" 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl: 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "filled-new-array only implemented for 'int'" 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 332