Interp.h revision 99e3e6e72e3471eb85fc2e405866392b01c080fe
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 */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DALVIK_INTERP_INTERP
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define _DALVIK_INTERP_INTERP
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 */
49b51ea11c70602918c42764bfafe92a997d3b1803Andy McFaddenvoid dvmThrowVerificationError(const Method* method, 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 */
709a1f81699cc05b58378ffb9aadb4e97677943791Dan Bornsteinu1 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 */
8094d65255849ce9f195c971f726e8b09449ba4d14buzbeevoid dvmCheckBefore(const u2 *dPC, u4 *fp, Thread* self);
8199e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmReportExceptionThrow(Thread* self, Object* exception);
8299e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self);
8399e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self);
849a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmReportInvoke(Thread* self, const Method* methodToCall);
8599e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmReportReturn(Thread* self);
869a3147c7412f4794434b4c2604aa2ba784867774buzbee
879a3147c7412f4794434b4c2604aa2ba784867774buzbee/*
88cb3081f675109049e63380170b60871e8275f9a8buzbee * Update interpBreak
89cb3081f675109049e63380170b60871e8275f9a8buzbee */
909a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmUpdateInterpBreak(Thread* thread, int newBreak, int newMode,
919a3147c7412f4794434b4c2604aa2ba784867774buzbee                          bool enable);
929a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmAddToSuspendCounts(Thread* thread, int delta, int dbgDelta);
9399e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmCheckInterpStateConsistency();
9499e3e6e72e3471eb85fc2e405866392b01c080febuzbeevoid dvmInitializeInterpBreak(Thread* thread);
959a3147c7412f4794434b4c2604aa2ba784867774buzbee
969a3147c7412f4794434b4c2604aa2ba784867774buzbee/*
979a3147c7412f4794434b4c2604aa2ba784867774buzbee * Update interpBreak for all threads
989a3147c7412f4794434b4c2604aa2ba784867774buzbee */
999a3147c7412f4794434b4c2604aa2ba784867774buzbeevoid dvmUpdateAllInterpBreak(int newBreak, int newMode, bool enable);
100cb3081f675109049e63380170b60871e8275f9a8buzbee
10194d65255849ce9f195c971f726e8b09449ba4d14buzbee/*
10294d65255849ce9f195c971f726e8b09449ba4d14buzbee * Register a callback to occur at the next safe point for a single thread.
10394d65255849ce9f195c971f726e8b09449ba4d14buzbee * If funct is NULL, the previous registration is cancelled.
10494d65255849ce9f195c971f726e8b09449ba4d14buzbee *
10594d65255849ce9f195c971f726e8b09449ba4d14buzbee * The callback prototype is:
10694d65255849ce9f195c971f726e8b09449ba4d14buzbee *        bool funct(Thread* thread, void* arg)
10794d65255849ce9f195c971f726e8b09449ba4d14buzbee *
10894d65255849ce9f195c971f726e8b09449ba4d14buzbee *  If funct returns false, the callback will be disarmed.  If true,
10994d65255849ce9f195c971f726e8b09449ba4d14buzbee *  it will stay in effect.
11094d65255849ce9f195c971f726e8b09449ba4d14buzbee */
11194d65255849ce9f195c971f726e8b09449ba4d14buzbeevoid dvmArmSafePointCallback(Thread* thread, SafePointCallback funct,
11294d65255849ce9f195c971f726e8b09449ba4d14buzbee                             void* arg);
11394d65255849ce9f195c971f726e8b09449ba4d14buzbee
11494d65255849ce9f195c971f726e8b09449ba4d14buzbee
115a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#ifndef DVM_NO_ASM_INTERP
116a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbeeextern void* dvmAsmInstructionStart[];
117a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbeeextern void* dvmAsmAltInstructionStart[];
118a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#endif
119a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_DALVIK_INTERP_INTERP*/
121