Mterp.cpp revision a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88
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) {
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        LOGE("Please correct the values in mterp/common/asm-constants.h\n");
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) {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        LOGE("ERROR: unexpected asm interp size %d\n", interpSize);
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        LOGE("(did an instruction handler exceed %d bytes?)\n", 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);
829a3147c7412f4794434b4c2604aa2ba784867774buzbee        LOGVV("mterp threadid=%d : %s.%s %s\n",
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    }
899f601a917c8878204482c37aec7005054b6776fabuzbee    //LOGI("self is %p, pc=%p, fp=%p\n", self, self->interpSave.pc,
9030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    //      self->interpSave.curFrame);
919f601a917c8878204482c37aec7005054b6776fabuzbee    //LOGI("first instruction is 0x%04x\n", 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