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) { 44c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block ALOGE("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 */ 55a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#if defined(__mips__) 56a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham const int width = 128; 57a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#else 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const int width = 64; 59a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#endif 60a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee int interpSize = (uintptr_t) dvmAsmInstructionEnd - 61a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee (uintptr_t) dvmAsmInstructionStart; 62ccaab18ae6d203108445fef7682065dfbb007657Dan Bornstein if (interpSize != 0 && interpSize != kNumPackedOpcodes*width) { 63c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block ALOGE("ERROR: unexpected asm interp size %d", interpSize); 64c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block ALOGE("(did an instruction handler exceed %d bytes?)", width); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 67a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#endif 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 694212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein#endif // ndef DVM_NO_ASM_INTERP 704212241f98a49adcb955aee67a302cea57f3d984Dan Bornstein 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return !failed; 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 769a3147c7412f4794434b4c2604aa2ba784867774buzbee * "Mterp entry point. 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 789a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmMterpStd(Thread* self) 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* configure mterp items */ 819f601a917c8878204482c37aec7005054b6776fabuzbee self->interpSave.methodClassDex = self->interpSave.method->clazz->pDvmDex; 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IF_LOGVV() { 849f601a917c8878204482c37aec7005054b6776fabuzbee char* desc = dexProtoCopyMethodDescriptor( 859f601a917c8878204482c37aec7005054b6776fabuzbee &self->interpSave.method->prototype); 8660fc806b679a3655c228b4093058c59941a49cfeDan Bornstein LOGVV("mterp threadid=%d : %s.%s %s", 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThreadSelf()->threadId, 889a3147c7412f4794434b4c2604aa2ba784867774buzbee self->interpSave.method->clazz->descriptor, 899a3147c7412f4794434b4c2604aa2ba784867774buzbee self->interpSave.method->name, 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project desc); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(desc); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 934308417beec548c2b2c06ecec4f7f4a965b09fb2Steve Block //ALOGI("self is %p, pc=%p, fp=%p", self, self->interpSave.pc, 9430bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee // self->interpSave.curFrame); 954308417beec548c2b2c06ecec4f7f4a965b09fb2Steve Block //ALOGI("first instruction is 0x%04x", self->interpSave.pc[0]); 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 97c59931eff9225674b341e3b499e0f66354910ca2buzbee /* 98c59931eff9225674b341e3b499e0f66354910ca2buzbee * Handle any ongoing profiling and prep for debugging 99c59931eff9225674b341e3b499e0f66354910ca2buzbee */ 100c59931eff9225674b341e3b499e0f66354910ca2buzbee if (self->interpBreak.ctl.subMode != 0) { 101c59931eff9225674b341e3b499e0f66354910ca2buzbee TRACE_METHOD_ENTER(self, self->interpSave.method); 102c59931eff9225674b341e3b499e0f66354910ca2buzbee self->debugIsMethodEntry = true; // Always true on startup 103c59931eff9225674b341e3b499e0f66354910ca2buzbee } 104c59931eff9225674b341e3b499e0f66354910ca2buzbee 1059a3147c7412f4794434b4c2604aa2ba784867774buzbee dvmMterpStdRun(self); 1067a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef LOG_INSTR 108062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("|-- Leaving interpreter loop"); 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 111