Mterp.cpp revision 60fc806b679a3655c228b4093058c59941a49cfe
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 * Mterp entry point and support functions. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro#include "Dalvik.h" 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "mterp/Mterp.h" 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stddef.h> 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify some constants used by the mterp interpreter. 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 291e1433e78f560a01744e870c19c162ab88df9dc1Carl Shapirobool dvmCheckAsmConstants() 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 314212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein bool failed = false; 324212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein 334212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein#ifndef DVM_NO_ASM_INTERP 344212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein 359a3147c7412f4794434b4c2604aa2ba784867774buzbee#ifndef DVM_JMP_TABLE_MTERP 36a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee extern void* dvmAsmInstructionStart[]; 37a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee extern void* dvmAsmInstructionEnd[]; 389a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ASM_DEF_VERIFY 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "mterp/common/asm-constants.h" 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (failed) { 4460fc806b679a3655c228b4093058c59941a49cfeDan Bornstein LOGE("Please correct the values in mterp/common/asm-constants.h"); 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#ifndef DVM_JMP_TABLE_MTERP 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 50a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * If we're using computed goto instruction transitions, make sure 51a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * none of the handlers overflows the 64-byte limit. This won't tell 52a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * which one did, but if any one is too big the total size will 53a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * overflow. 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const int width = 64; 56a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee int interpSize = (uintptr_t) dvmAsmInstructionEnd - 57a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee (uintptr_t) dvmAsmInstructionStart; 58ccaab18ae6d203108445fef7682065dfbb007657Dan Bornstein if (interpSize != 0 && interpSize != kNumPackedOpcodes*width) { 5960fc806b679a3655c228b4093058c59941a49cfeDan Bornstein LOGE("ERROR: unexpected asm interp size %d", interpSize); 6060fc806b679a3655c228b4093058c59941a49cfeDan Bornstein LOGE("(did an instruction handler exceed %d bytes?)", width); 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 63a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#endif 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 654212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein#endif // ndef DVM_NO_ASM_INTERP 664212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return !failed; 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 729a3147c7412f4794434b4c2604aa2ba784867774buzbee * "Mterp entry point. 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 749a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmMterpStd(Thread* self) 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* configure mterp items */ 779f601a917c8878204482c37aec7005054b6776fabuzbee self->interpSave.methodClassDex = self->interpSave.method->clazz->pDvmDex; 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IF_LOGVV() { 809f601a917c8878204482c37aec7005054b6776fabuzbee char* desc = dexProtoCopyMethodDescriptor( 819f601a917c8878204482c37aec7005054b6776fabuzbee &self->interpSave.method->prototype); 8260fc806b679a3655c228b4093058c59941a49cfeDan Bornstein LOGVV("mterp threadid=%d : %s.%s %s", 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThreadSelf()->threadId, 849a3147c7412f4794434b4c2604aa2ba784867774buzbee self->interpSave.method->clazz->descriptor, 859a3147c7412f4794434b4c2604aa2ba784867774buzbee self->interpSave.method->name, 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project desc); 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(desc); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 8960fc806b679a3655c228b4093058c59941a49cfeDan Bornstein //LOGI("self is %p, pc=%p, fp=%p", self, self->interpSave.pc, 9030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee // self->interpSave.curFrame); 9160fc806b679a3655c228b4093058c59941a49cfeDan Bornstein //LOGI("first instruction is 0x%04x", self->interpSave.pc[0]); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 93c59931eff9225674b341e3b499e0f66354910ca2buzbee /* 94c59931eff9225674b341e3b499e0f66354910ca2buzbee * Handle any ongoing profiling and prep for debugging 95c59931eff9225674b341e3b499e0f66354910ca2buzbee */ 96c59931eff9225674b341e3b499e0f66354910ca2buzbee if (self->interpBreak.ctl.subMode != 0) { 97c59931eff9225674b341e3b499e0f66354910ca2buzbee TRACE_METHOD_ENTER(self, self->interpSave.method); 98c59931eff9225674b341e3b499e0f66354910ca2buzbee self->debugIsMethodEntry = true; // Always true on startup 99c59931eff9225674b341e3b499e0f66354910ca2buzbee } 100c59931eff9225674b341e3b499e0f66354910ca2buzbee 1019a3147c7412f4794434b4c2604aa2ba784867774buzbee dvmMterpStdRun(self); 1027a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef LOG_INSTR 1049a3147c7412f4794434b4c2604aa2ba784867774buzbee LOGD("|-- Leaving interpreter loop"); 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 107