Interp.h revision 375fb116bcb817b37509ab579dbd55cdbb765cbf
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 */ 1696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dalvik interpreter public definitions. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_INTERP_INTERP_H_ 21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_INTERP_INTERP_H_ 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 249a3147c7412f4794434b4c2604aa2ba784867774buzbee * Stash the dalvik PC in the frame. Called during interpretation. 259a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 269a3147c7412f4794434b4c2604aa2ba784867774buzbeeINLINE void dvmExportPC(const u2* pc, const u4* fp) 279a3147c7412f4794434b4c2604aa2ba784867774buzbee{ 289a3147c7412f4794434b4c2604aa2ba784867774buzbee SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc; 299a3147c7412f4794434b4c2604aa2ba784867774buzbee} 309a3147c7412f4794434b4c2604aa2ba784867774buzbee 319a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 329a3147c7412f4794434b4c2604aa2ba784867774buzbee * Extract the Dalvik opcode 339a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 349a3147c7412f4794434b4c2604aa2ba784867774buzbee#define GET_OPCODE(_inst) (((_inst & 0xff) == OP_DISPATCH_FF) ? \ 359a3147c7412f4794434b4c2604aa2ba784867774buzbee (0x100 + ((_inst >> 8) & 0xff)) : (_inst & 0xff)) 369a3147c7412f4794434b4c2604aa2ba784867774buzbee 379a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point. Call here after setting up the interpreted 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * stack (most code will want to get here via dvmCallMethod().) 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmInterpret(Thread* thread, const Method* method, JValue* pResult); 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 443a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * Throw an exception for a problem detected by the verifier. 45b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden * 46b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden * This is called from the handler for the throw-verification-error 47b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden * instruction. "method" is the method currently being executed. 483a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden */ 49d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowVerificationError(const Method* method, 50d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro int kind, int ref); 513a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden 523a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* 5396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * One-time initialization and shutdown. 5496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden */ 5596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenbool dvmBreakpointStartup(void); 5696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenvoid dvmBreakpointShutdown(void); 579f601a917c8878204482c37aec7005054b6776fabuzbeevoid dvmInitInterpreterState(Thread* self); 5896516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 5996516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* 6096516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * Breakpoint implementation. 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmInitBreakpoints(); 6396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenvoid dvmAddBreakAddr(Method* method, unsigned int instrOffset); 6496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenvoid dvmClearBreakAddr(Method* method, unsigned int instrOffset); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmAddSingleStep(Thread* thread, int size, int depth); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmClearSingleStep(Thread* thread); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6896516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* 6996516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * Recover the opcode that was replaced by a breakpoint. 7096516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden */ 71d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" u1 dvmGetOriginalOpcode(const u2* addr); 7296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 7396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* 74d22748a8ddc8f6a7d2e82868b46e9a7739f2e8e5Andy McFadden * Flush any breakpoints associated with methods in "clazz". 7596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden */ 76d22748a8ddc8f6a7d2e82868b46e9a7739f2e8e5Andy McFaddenvoid dvmFlushBreakpoints(ClassObject* clazz); 7796516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 78cb3081f675109049e63380170b60871e8275f9a8buzbee/* 799a3147c7412f4794434b4c2604aa2ba784867774buzbee * Debugger support 809a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 81d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmCheckBefore(const u2 *dPC, u4 *fp, Thread* self); 82d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportExceptionThrow(Thread* self, Object* exception); 83d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self, u4* fp); 84d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self, u4* fp); 85d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportInvoke(Thread* self, const Method* methodToCall); 86d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportReturn(Thread* self); 879a3147c7412f4794434b4c2604aa2ba784867774buzbee 889a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 89cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee * InterpBreak & subMode control 90cb3081f675109049e63380170b60871e8275f9a8buzbee */ 91cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbeevoid dvmDisableSubMode(Thread* thread, ExecutionSubModes subMode); 92d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmEnableSubMode(Thread* thread, ExecutionSubModes subMode); 93cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbeevoid dvmDisableAllSubMode(ExecutionSubModes subMode); 94cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbeevoid dvmEnableAllSubMode(ExecutionSubModes subMode); 959a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmAddToSuspendCounts(Thread* thread, int delta, int dbgDelta); 9699e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmCheckInterpStateConsistency(); 9799e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmInitializeInterpBreak(Thread* thread); 989a3147c7412f4794434b4c2604aa2ba784867774buzbee 999a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 10094d65255849ce9f195c971f726e8b09449ba4d14buzbee * Register a callback to occur at the next safe point for a single thread. 10194d65255849ce9f195c971f726e8b09449ba4d14buzbee * If funct is NULL, the previous registration is cancelled. 10294d65255849ce9f195c971f726e8b09449ba4d14buzbee * 10394d65255849ce9f195c971f726e8b09449ba4d14buzbee * The callback prototype is: 10494d65255849ce9f195c971f726e8b09449ba4d14buzbee * bool funct(Thread* thread, void* arg) 10594d65255849ce9f195c971f726e8b09449ba4d14buzbee * 10694d65255849ce9f195c971f726e8b09449ba4d14buzbee * If funct returns false, the callback will be disarmed. If true, 10794d65255849ce9f195c971f726e8b09449ba4d14buzbee * it will stay in effect. 10894d65255849ce9f195c971f726e8b09449ba4d14buzbee */ 10994d65255849ce9f195c971f726e8b09449ba4d14buzbeevoid dvmArmSafePointCallback(Thread* thread, SafePointCallback funct, 11094d65255849ce9f195c971f726e8b09449ba4d14buzbee void* arg); 11194d65255849ce9f195c971f726e8b09449ba4d14buzbee 11294d65255849ce9f195c971f726e8b09449ba4d14buzbee 113a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#ifndef DVM_NO_ASM_INTERP 114a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbeeextern void* dvmAsmInstructionStart[]; 115a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbeeextern void* dvmAsmAltInstructionStart[]; 116a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#endif 117a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee 118375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_INTERP_INTERP_H_ 119