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 */ 34ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#define GET_OPCODE(_inst) (_inst & 0xff) 359a3147c7412f4794434b4c2604aa2ba784867774buzbee 369a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point. Call here after setting up the interpreted 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * stack (most code will want to get here via dvmCallMethod().) 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmInterpret(Thread* thread, const Method* method, JValue* pResult); 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 433a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * Throw an exception for a problem detected by the verifier. 44b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden * 45b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden * This is called from the handler for the throw-verification-error 46b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden * instruction. "method" is the method currently being executed. 473a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden */ 48d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowVerificationError(const Method* method, 49d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro int kind, int ref); 503a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden 513a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* 5296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * One-time initialization and shutdown. 5396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden */ 5496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenbool dvmBreakpointStartup(void); 5596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenvoid dvmBreakpointShutdown(void); 569f601a917c8878204482c37aec7005054b6776fabuzbeevoid dvmInitInterpreterState(Thread* self); 5796516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 5896516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* 5996516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * Breakpoint implementation. 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmInitBreakpoints(); 6296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenvoid dvmAddBreakAddr(Method* method, unsigned int instrOffset); 6396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenvoid dvmClearBreakAddr(Method* method, unsigned int instrOffset); 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmAddSingleStep(Thread* thread, int size, int depth); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmClearSingleStep(Thread* thread); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6796516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* 6896516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * Recover the opcode that was replaced by a breakpoint. 6996516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden */ 70d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" u1 dvmGetOriginalOpcode(const u2* addr); 7196516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 7296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* 73d22748a8ddc8f6a7d2e82868b46e9a7739f2e8e5Andy McFadden * Flush any breakpoints associated with methods in "clazz". 7496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden */ 75d22748a8ddc8f6a7d2e82868b46e9a7739f2e8e5Andy McFaddenvoid dvmFlushBreakpoints(ClassObject* clazz); 7696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 77cb3081f675109049e63380170b60871e8275f9a8buzbee/* 789a3147c7412f4794434b4c2604aa2ba784867774buzbee * Debugger support 799a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 80d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmCheckBefore(const u2 *dPC, u4 *fp, Thread* self); 81d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportExceptionThrow(Thread* self, Object* exception); 82d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self, u4* fp); 83d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self, u4* fp); 84d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportInvoke(Thread* self, const Method* methodToCall); 85d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmReportReturn(Thread* self); 869a3147c7412f4794434b4c2604aa2ba784867774buzbee 879a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 88cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee * InterpBreak & subMode control 89cb3081f675109049e63380170b60871e8275f9a8buzbee */ 90cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbeevoid dvmDisableSubMode(Thread* thread, ExecutionSubModes subMode); 91d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmEnableSubMode(Thread* thread, ExecutionSubModes subMode); 92cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbeevoid dvmDisableAllSubMode(ExecutionSubModes subMode); 93cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbeevoid dvmEnableAllSubMode(ExecutionSubModes subMode); 949a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmAddToSuspendCounts(Thread* thread, int delta, int dbgDelta); 9599e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmCheckInterpStateConsistency(); 9699e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmInitializeInterpBreak(Thread* thread); 979a3147c7412f4794434b4c2604aa2ba784867774buzbee 989a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 9994d65255849ce9f195c971f726e8b09449ba4d14buzbee * Register a callback to occur at the next safe point for a single thread. 10094d65255849ce9f195c971f726e8b09449ba4d14buzbee * If funct is NULL, the previous registration is cancelled. 10194d65255849ce9f195c971f726e8b09449ba4d14buzbee * 10294d65255849ce9f195c971f726e8b09449ba4d14buzbee * The callback prototype is: 10394d65255849ce9f195c971f726e8b09449ba4d14buzbee * bool funct(Thread* thread, void* arg) 10494d65255849ce9f195c971f726e8b09449ba4d14buzbee * 10594d65255849ce9f195c971f726e8b09449ba4d14buzbee * If funct returns false, the callback will be disarmed. If true, 10694d65255849ce9f195c971f726e8b09449ba4d14buzbee * it will stay in effect. 10794d65255849ce9f195c971f726e8b09449ba4d14buzbee */ 10894d65255849ce9f195c971f726e8b09449ba4d14buzbeevoid dvmArmSafePointCallback(Thread* thread, SafePointCallback funct, 10994d65255849ce9f195c971f726e8b09449ba4d14buzbee void* arg); 11094d65255849ce9f195c971f726e8b09449ba4d14buzbee 11194d65255849ce9f195c971f726e8b09449ba4d14buzbee 112a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#ifndef DVM_NO_ASM_INTERP 113a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbeeextern void* dvmAsmInstructionStart[]; 114a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbeeextern void* dvmAsmAltInstructionStart[]; 115a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#endif 116a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee 117375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_INTERP_INTERP_H_ 118