Mterp.cpp revision 1e1433e78f560a01744e870c19c162ab88df9dc1
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 */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "mterp/Mterp.h" 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stddef.h> 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify some constants used by the mterp interpreter. 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 281e1433e78f560a01744e870c19c162ab88df9dc1Carl Shapirobool dvmCheckAsmConstants() 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 304212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein bool failed = false; 314212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein 324212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein#ifndef DVM_NO_ASM_INTERP 334212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein 349a3147c7412f4794434b4c2604aa2ba784867774buzbee#ifndef DVM_JMP_TABLE_MTERP 35a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee extern void* dvmAsmInstructionStart[]; 36a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee extern void* dvmAsmInstructionEnd[]; 379a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ASM_DEF_VERIFY 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "mterp/common/asm-constants.h" 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (failed) { 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("Please correct the values in mterp/common/asm-constants.h\n"); 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#ifndef DVM_JMP_TABLE_MTERP 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 49a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * If we're using computed goto instruction transitions, make sure 50a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * none of the handlers overflows the 64-byte limit. This won't tell 51a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * which one did, but if any one is too big the total size will 52a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * overflow. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const int width = 64; 55a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee int interpSize = (uintptr_t) dvmAsmInstructionEnd - 56a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee (uintptr_t) dvmAsmInstructionStart; 57ccaab18ae6d203108445fef7682065dfbb007657Dan Bornstein if (interpSize != 0 && interpSize != kNumPackedOpcodes*width) { 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("ERROR: unexpected asm interp size %d\n", interpSize); 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("(did an instruction handler exceed %d bytes?)\n", width); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 62a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#endif 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 644212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein#endif // ndef DVM_NO_ASM_INTERP 654212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return !failed; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 719a3147c7412f4794434b4c2604aa2ba784867774buzbee * "Mterp entry point. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 739a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmMterpStd(Thread* self) 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* configure mterp items */ 769f601a917c8878204482c37aec7005054b6776fabuzbee self->interpSave.methodClassDex = self->interpSave.method->clazz->pDvmDex; 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IF_LOGVV() { 799f601a917c8878204482c37aec7005054b6776fabuzbee char* desc = dexProtoCopyMethodDescriptor( 809f601a917c8878204482c37aec7005054b6776fabuzbee &self->interpSave.method->prototype); 819a3147c7412f4794434b4c2604aa2ba784867774buzbee LOGVV("mterp threadid=%d : %s.%s %s\n", 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThreadSelf()->threadId, 839a3147c7412f4794434b4c2604aa2ba784867774buzbee self->interpSave.method->clazz->descriptor, 849a3147c7412f4794434b4c2604aa2ba784867774buzbee self->interpSave.method->name, 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project desc); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(desc); 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 889f601a917c8878204482c37aec7005054b6776fabuzbee //LOGI("self is %p, pc=%p, fp=%p\n", self, self->interpSave.pc, 899f601a917c8878204482c37aec7005054b6776fabuzbee // self->interpSave.fp); 909f601a917c8878204482c37aec7005054b6776fabuzbee //LOGI("first instruction is 0x%04x\n", self->interpSave.pc[0]); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 92c59931eff9225674b341e3b499e0f66354910ca2buzbee /* 93c59931eff9225674b341e3b499e0f66354910ca2buzbee * Handle any ongoing profiling and prep for debugging 94c59931eff9225674b341e3b499e0f66354910ca2buzbee */ 95c59931eff9225674b341e3b499e0f66354910ca2buzbee if (self->interpBreak.ctl.subMode != 0) { 96c59931eff9225674b341e3b499e0f66354910ca2buzbee TRACE_METHOD_ENTER(self, self->interpSave.method); 97c59931eff9225674b341e3b499e0f66354910ca2buzbee self->debugIsMethodEntry = true; // Always true on startup 98c59931eff9225674b341e3b499e0f66354910ca2buzbee } 99c59931eff9225674b341e3b499e0f66354910ca2buzbee 1009a3147c7412f4794434b4c2604aa2ba784867774buzbee dvmMterpStdRun(self); 1017a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef LOG_INSTR 1039a3147c7412f4794434b4c2604aa2ba784867774buzbee LOGD("|-- Leaving interpreter loop"); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 106