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