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