Mterp.cpp revision 9a3147c7412f4794434b4c2604aa2ba784867774
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 */
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmCheckAsmConstants(void)
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
929a3147c7412f4794434b4c2604aa2ba784867774buzbee    dvmMterpStdRun(self);
937a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef LOG_INSTR
959a3147c7412f4794434b4c2604aa2ba784867774buzbee    LOGD("|-- Leaving interpreter loop");
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
98