1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Copyright (C) 2009 The Android Open Source Project 3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * you may not use this file except in compliance with the License. 6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * You may obtain a copy of the License at 7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * http://www.apache.org/licenses/LICENSE-2.0 9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unless required by applicable law or agreed to in writing, software 11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distributed under the License is distributed on an "AS IS" BASIS, 12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See the License for the specific language governing permissions and 14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * limitations under the License. 15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 17ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Jit control 18ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 19375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_INTERP_JIT_H_ 20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_INTERP_JIT_H_ 21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "InterpDefs.h" 237b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#include "mterp/common/jit-config.h" 241efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng 251efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng#define JIT_MAX_TRACE_LEN 100 261efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng 2797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined (WITH_SELF_VERIFICATION) 2897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 2997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#define REG_SPACE 256 /* default size of shadow space */ 3097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#define HEAP_SPACE JIT_MAX_TRACE_LEN /* default size of heap space */ 3197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 32d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct ShadowHeap { 3397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int addr; 3497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int data; 35d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 3697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 37d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct InstructionTrace { 3897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int addr; 39bcdc1ded149faa8dec51778db4047cae0862027fBen Cheng DecodedInstruction decInsn; 40d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 4197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 42d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct ShadowSpace { 4397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const u2* startPC; /* starting pc of jitted region */ 449f601a917c8878204482c37aec7005054b6776fabuzbee u4* fp; /* starting fp of jitted region */ 459f601a917c8878204482c37aec7005054b6776fabuzbee const Method *method; 469f601a917c8878204482c37aec7005054b6776fabuzbee DvmDex* methodClassDex; 479f601a917c8878204482c37aec7005054b6776fabuzbee JValue retval; 489f601a917c8878204482c37aec7005054b6776fabuzbee const u1* interpStackEnd; 497a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng SelfVerificationState jitExitState; /* exit point for JIT'ed code */ 507a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng SelfVerificationState selfVerificationState; /* current SV running state */ 5197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const u2* endPC; /* ending pc of jitted region */ 5297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao void* shadowFP; /* pointer to fp in shadow space */ 5397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int* registerSpace; /* copy of register state */ 5497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int registerSpaceSize; /* current size of register space */ 5597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao ShadowHeap heapSpace[HEAP_SPACE]; /* copy of heap space */ 5697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao ShadowHeap* heapSpaceTail; /* tail pointer to heapSpace */ 5797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const void* endShadowFP; /* ending fp in shadow space */ 5897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao InstructionTrace trace[JIT_MAX_TRACE_LEN]; /* opcode trace for debugging */ 5997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int traceLength; /* counter for current trace length */ 60d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 6197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 6297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/* 6397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Self verification functions. 6497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */ 65d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" { 6697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haovoid* dvmSelfVerificationShadowSpaceAlloc(Thread* self); 6797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haovoid dvmSelfVerificationShadowSpaceFree(Thread* self); 689f601a917c8878204482c37aec7005054b6776fabuzbeevoid* dvmSelfVerificationSaveState(const u2* pc, u4* fp, 699f601a917c8878204482c37aec7005054b6776fabuzbee Thread* self, 709a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee int targetTrace); 719f601a917c8878204482c37aec7005054b6776fabuzbeevoid* dvmSelfVerificationRestoreState(const u2* pc, u4* fp, 729f601a917c8878204482c37aec7005054b6776fabuzbee SelfVerificationState exitPoint, 739f601a917c8878204482c37aec7005054b6776fabuzbee Thread *self); 749a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmCheckSelfVerification(const u2* pc, Thread* self); 75d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro} 7697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 7797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 78ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 79385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng * Offsets for metadata in the trace run array from the trace that ends with 80385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng * invoke instructions. 81385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng */ 82385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng#define JIT_TRACE_CLASS_DESC 1 83385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng#define JIT_TRACE_CLASS_LOADER 2 84385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng#define JIT_TRACE_CUR_METHOD 3 85385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng 86385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng/* 87ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * JitTable hash function. 88ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 892717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 902717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeestatic inline u4 dvmJitHashMask( const u2* p, u4 mask ) { 912717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee return ((((u4)p>>12)^(u4)p)>>1) & (mask); 922717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee} 932717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 94ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic inline u4 dvmJitHash( const u2* p ) { 952717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee return dvmJitHashMask( p, gDvmJit.jitTableMask ); 96ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 97ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 98ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 992e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * The width of the chain field in JitEntryInfo sets the upper 1002e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * bound on the number of translations. Be careful if changing 1012e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * the size of JitEntry struct - the Dalvik PC to JitEntry 1022e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * hash functions have built-in knowledge of the size. 1032e152baec01433de9c63633ebc6f4adf1cea3a87buzbee */ 1042e152baec01433de9c63633ebc6f4adf1cea3a87buzbee#define JIT_ENTRY_CHAIN_WIDTH 2 1052e152baec01433de9c63633ebc6f4adf1cea3a87buzbee#define JIT_MAX_ENTRIES (1 << (JIT_ENTRY_CHAIN_WIDTH * 8)) 1062e152baec01433de9c63633ebc6f4adf1cea3a87buzbee 1072e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* 1082e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * The trace profiling counters are allocated in blocks and individual 1092e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * counters must not move so long as any referencing trace exists. 1102e152baec01433de9c63633ebc6f4adf1cea3a87buzbee */ 1112e152baec01433de9c63633ebc6f4adf1cea3a87buzbee#define JIT_PROF_BLOCK_ENTRIES 1024 1122e152baec01433de9c63633ebc6f4adf1cea3a87buzbee#define JIT_PROF_BLOCK_BUCKETS (JIT_MAX_ENTRIES / JIT_PROF_BLOCK_ENTRIES) 1132e152baec01433de9c63633ebc6f4adf1cea3a87buzbee 1142e152baec01433de9c63633ebc6f4adf1cea3a87buzbeetypedef s4 JitTraceCounter_t; 1152e152baec01433de9c63633ebc6f4adf1cea3a87buzbee 116d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct JitTraceProfCounters { 1172e152baec01433de9c63633ebc6f4adf1cea3a87buzbee unsigned int next; 1182e152baec01433de9c63633ebc6f4adf1cea3a87buzbee JitTraceCounter_t *buckets[JIT_PROF_BLOCK_BUCKETS]; 119d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 1202e152baec01433de9c63633ebc6f4adf1cea3a87buzbee 1212e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* 122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Entries in the JIT's address lookup hash table. 123716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * Fields which may be updated by multiple threads packed into a 124716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * single 32-bit word to allow use of atomic update. 125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 126716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 127d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct JitEntryInfo { 128716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int isMethodEntry:1; 129716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int inlineCandidate:1; 130716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int profileEnabled:1; 1311b3da59fff0c63770e10684e243a36f3d0218637Bill Buzbee JitInstructionSetType instructionSet:3; 1321b3da59fff0c63770e10684e243a36f3d0218637Bill Buzbee unsigned int profileOffset:5; 1331b3da59fff0c63770e10684e243a36f3d0218637Bill Buzbee unsigned int unused:5; 134d726991ba52466cde88e37aba4de2395b62477faBill Buzbee u2 chain; /* Index of next in chain */ 135d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 136716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 137d862faa2ceae186da5518607505eb942d634ced9Carl Shapirounion JitEntryInfoUnion { 138716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee JitEntryInfo info; 139716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee volatile int infoWord; 140d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 141716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 142d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct JitEntry { 14360c24f436d603c564d5351a6f81821f12635733cBen Cheng JitEntryInfoUnion u; 14460c24f436d603c564d5351a6f81821f12635733cBen Cheng const u2* dPC; /* Dalvik code address */ 14560c24f436d603c564d5351a6f81821f12635733cBen Cheng void* codeAddress; /* Code address of native translation */ 146d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 147ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 148d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" { 1499a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmCheckJit(const u2* pc, Thread* self); 150cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Chengvoid* dvmJitGetTraceAddr(const u2* dPC); 151cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Chengvoid* dvmJitGetMethodAddr(const u2* dPC); 1521813ab265f691e93401c7307c0b34247842ab35eCarl Shapirovoid* dvmJitGetTraceAddrThread(const u2* dPC, Thread* self); 1531813ab265f691e93401c7307c0b34247842ab35eCarl Shapirovoid* dvmJitGetMethodAddrThread(const u2* dPC, Thread* self); 1549a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmJitCheckTraceRequest(Thread* self); 1552717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeevoid dvmJitStopTranslationRequests(void); 1561813ab265f691e93401c7307c0b34247842ab35eCarl Shapiro#if defined(WITH_JIT_TUNING) 1571813ab265f691e93401c7307c0b34247842ab35eCarl Shapirovoid dvmBumpNoChain(int from); 1581813ab265f691e93401c7307c0b34247842ab35eCarl Shapirovoid dvmBumpNormal(void); 1591813ab265f691e93401c7307c0b34247842ab35eCarl Shapirovoid dvmBumpPunt(int from); 1601813ab265f691e93401c7307c0b34247842ab35eCarl Shapiro#endif 1612717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeevoid dvmJitStats(void); 1622717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeebool dvmJitResizeJitTable(unsigned int size); 16360c24f436d603c564d5351a6f81821f12635733cBen Chengvoid dvmJitResetTable(void); 164d862faa2ceae186da5518607505eb942d634ced9Carl ShapiroJitEntry *dvmJitFindEntry(const u2* pc, bool isMethodEntry); 16550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbees8 dvmJitd2l(double d); 16650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbees8 dvmJitf2l(float f); 1672e152baec01433de9c63633ebc6f4adf1cea3a87buzbeevoid dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set, 168cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng bool isMethodEntry, int profilePrefixSize); 1699a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmJitEndTraceSelect(Thread* self, const u2* dPC); 1702e152baec01433de9c63633ebc6f4adf1cea3a87buzbeeJitTraceCounter_t *dvmJitNextTraceCounter(void); 1712e152baec01433de9c63633ebc6f4adf1cea3a87buzbeevoid dvmJitTraceProfilingOff(void); 1722e152baec01433de9c63633ebc6f4adf1cea3a87buzbeevoid dvmJitTraceProfilingOn(void); 1732e152baec01433de9c63633ebc6f4adf1cea3a87buzbeevoid dvmJitChangeProfileMode(TraceProfilingModes newState); 174d82cebc13cf8ff110f2ad1a299782c9d1e8aada6buzbeevoid dvmJitDumpTraceDesc(JitTraceDescription *trace); 17599e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmJitUpdateThreadStateSingle(Thread* threead); 17699e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmJitUpdateThreadStateAll(void); 1779a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmJitResumeTranslation(Thread* self, const u2* pc, const u4* fp); 178ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro} 179ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro 180375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_INTERP_JIT_H_ 181