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 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .text 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmMterpStdRun 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmMterpStdRun, %function 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 229f601a917c8878204482c37aec7005054b6776fabuzbee * bool dvmMterpStdRun(Thread* self) 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point. Returns changeInterp. 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun: 28f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee push %ebp # save caller base pointer 29f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl %esp, %ebp # set our %ebp 309a3147c7412f4794434b4c2604aa2ba784867774buzbee movl rSELF, %ecx # get incoming rSELF 31f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee/* 324570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin * At this point we've allocated one slot on the stack 33f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee * via push and stack is 8-byte aligned. Allocate space 344570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin * for 9 spill slots, 4 local slots, 5 arg slots to bring 354570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin * us to 16-byte alignment 36f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee */ 374570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin subl $$(FRAME_SIZE-4), %esp 38f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee 39f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee/* Spill callee save regs */ 40f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl %edi,EDI_SPILL(%ebp) 41f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl %esi,ESI_SPILL(%ebp) 42f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl %ebx,EBX_SPILL(%ebp) 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Set up "named" registers */ 459f601a917c8878204482c37aec7005054b6776fabuzbee movl offThread_pc(%ecx),rPC 4630bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee movl offThread_curFrame(%ecx),rFP 47a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movl offThread_curHandlerTable(%ecx),rIBASE 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 490c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen /* Remember %esp for future "longjmp" */ 509f601a917c8878204482c37aec7005054b6776fabuzbee movl %esp,offThread_bailPtr(%ecx) 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 520c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen /* Fetch next instruction before potential jump */ 53f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee FETCH_INST 540c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#if defined(WITH_JIT) 550c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen GET_JIT_PROF_TABLE %ecx %eax 560c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl $$0, offThread_inJitCodeCache(%ecx) 570c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen cmpl $$0, %eax 580c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen jne common_updateProfile # set up %ebx & %edx & rPC 590c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#endif 600c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen 610c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen /* Normal case: start executing the instruction at rPC */ 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_NEXT 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmMterpStdBail 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmMterpStdBail, %function 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 679f601a917c8878204482c37aec7005054b6776fabuzbee * void dvmMterpStdBail(Thread* self, bool changeInterp) 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry. 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper. The 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We're not going to build a standard frame here, so the arg accesses will 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * look a little strange. 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 779f601a917c8878204482c37aec7005054b6776fabuzbee * esp+4 (arg0) Thread* self 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * esp+8 (arg1) bool changeInterp 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail: 819f601a917c8878204482c37aec7005054b6776fabuzbee movl 4(%esp),%ecx # grab self 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl 8(%esp),%eax # changeInterp to return reg 830c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl offThread_bailPtr(%ecx),%esp # Restore "setjmp" esp 84c11e0e14df2c0c4264e5cc6c3e96d14832cbecadbuzbee movl %esp,%ebp 859a3147c7412f4794434b4c2604aa2ba784867774buzbee addl $$(FRAME_SIZE-4), %ebp # Restore %ebp at point of setjmp 86f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl EDI_SPILL(%ebp),%edi 87f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl ESI_SPILL(%ebp),%esi 88f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl EBX_SPILL(%ebp),%ebx 894570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin movl %ebp, %esp # strip frame 904570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin pop %ebp # restore caller's ebp 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ret # return to dvmMterpStdRun's caller 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 940c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#ifdef WITH_JIT 950c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen .global dvmNcgInvokeInterpreter 960c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen .type dvmNcgInvokeInterpreter, %function 970c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen/* input: start of method in %eax */ 980c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan ChendvmNcgInvokeInterpreter: 990c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl %eax, rPC 1000c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl rSELF, %ecx 1010c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl offThread_curHandlerTable(%ecx),rIBASE 1020c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen FETCH_INST_R %ecx # %edx<- opcode 1030c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen GOTO_NEXT_R %ecx # start executing the instruction at rPC 1040c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#endif 1050c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .section .rodata 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint: 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Bad entry point %d\n" 112f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee 113