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