1*e82f7db8SAndroid Build Coastguard Worker /* 2*e82f7db8SAndroid Build Coastguard Worker * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. 3*e82f7db8SAndroid Build Coastguard Worker * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*e82f7db8SAndroid Build Coastguard Worker * 5*e82f7db8SAndroid Build Coastguard Worker * This code is free software; you can redistribute it and/or modify it 6*e82f7db8SAndroid Build Coastguard Worker * under the terms of the GNU General Public License version 2 only, as 7*e82f7db8SAndroid Build Coastguard Worker * published by the Free Software Foundation. Oracle designates this 8*e82f7db8SAndroid Build Coastguard Worker * particular file as subject to the "Classpath" exception as provided 9*e82f7db8SAndroid Build Coastguard Worker * by Oracle in the LICENSE file that accompanied this code. 10*e82f7db8SAndroid Build Coastguard Worker * 11*e82f7db8SAndroid Build Coastguard Worker * This code is distributed in the hope that it will be useful, but WITHOUT 12*e82f7db8SAndroid Build Coastguard Worker * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*e82f7db8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*e82f7db8SAndroid Build Coastguard Worker * version 2 for more details (a copy is included in the LICENSE file that 15*e82f7db8SAndroid Build Coastguard Worker * accompanied this code). 16*e82f7db8SAndroid Build Coastguard Worker * 17*e82f7db8SAndroid Build Coastguard Worker * You should have received a copy of the GNU General Public License version 18*e82f7db8SAndroid Build Coastguard Worker * 2 along with this work; if not, write to the Free Software Foundation, 19*e82f7db8SAndroid Build Coastguard Worker * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20*e82f7db8SAndroid Build Coastguard Worker * 21*e82f7db8SAndroid Build Coastguard Worker * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22*e82f7db8SAndroid Build Coastguard Worker * or visit www.oracle.com if you need additional information or have any 23*e82f7db8SAndroid Build Coastguard Worker * questions. 24*e82f7db8SAndroid Build Coastguard Worker */ 25*e82f7db8SAndroid Build Coastguard Worker 26*e82f7db8SAndroid Build Coastguard Worker #ifndef JDWP_UTIL_H 27*e82f7db8SAndroid Build Coastguard Worker #define JDWP_UTIL_H 28*e82f7db8SAndroid Build Coastguard Worker 29*e82f7db8SAndroid Build Coastguard Worker #include <stddef.h> 30*e82f7db8SAndroid Build Coastguard Worker #include <stdio.h> 31*e82f7db8SAndroid Build Coastguard Worker #include <string.h> 32*e82f7db8SAndroid Build Coastguard Worker #include <stdlib.h> 33*e82f7db8SAndroid Build Coastguard Worker #include <stdarg.h> 34*e82f7db8SAndroid Build Coastguard Worker 35*e82f7db8SAndroid Build Coastguard Worker #ifdef DEBUG 36*e82f7db8SAndroid Build Coastguard Worker /* Just to make sure these interfaces are not used here. */ 37*e82f7db8SAndroid Build Coastguard Worker #undef free 38*e82f7db8SAndroid Build Coastguard Worker #define free(p) Do not use this interface. 39*e82f7db8SAndroid Build Coastguard Worker #undef malloc 40*e82f7db8SAndroid Build Coastguard Worker #define malloc(p) Do not use this interface. 41*e82f7db8SAndroid Build Coastguard Worker #undef calloc 42*e82f7db8SAndroid Build Coastguard Worker #define calloc(p) Do not use this interface. 43*e82f7db8SAndroid Build Coastguard Worker #undef realloc 44*e82f7db8SAndroid Build Coastguard Worker #define realloc(p) Do not use this interface. 45*e82f7db8SAndroid Build Coastguard Worker #undef strdup 46*e82f7db8SAndroid Build Coastguard Worker #define strdup(p) Do not use this interface. 47*e82f7db8SAndroid Build Coastguard Worker #endif 48*e82f7db8SAndroid Build Coastguard Worker 49*e82f7db8SAndroid Build Coastguard Worker #include "log_messages.h" 50*e82f7db8SAndroid Build Coastguard Worker #include "vm_interface.h" 51*e82f7db8SAndroid Build Coastguard Worker #include "JDWP.h" 52*e82f7db8SAndroid Build Coastguard Worker #include "util_md.h" 53*e82f7db8SAndroid Build Coastguard Worker #include "error_messages.h" 54*e82f7db8SAndroid Build Coastguard Worker #include "debugInit.h" 55*e82f7db8SAndroid Build Coastguard Worker 56*e82f7db8SAndroid Build Coastguard Worker /* Get access to Native Platform Toolkit functions */ 57*e82f7db8SAndroid Build Coastguard Worker #include "npt.h" 58*e82f7db8SAndroid Build Coastguard Worker 59*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: We want to avoid allocating jweaks on android so if !isStrong we will use the 60*e82f7db8SAndroid Build Coastguard Worker * node-pointer tag as the weak-reference. 61*e82f7db8SAndroid Build Coastguard Worker */ 62*e82f7db8SAndroid Build Coastguard Worker /* Definition of a CommonRef tracked by the backend for the frontend */ 63*e82f7db8SAndroid Build Coastguard Worker typedef struct RefNode { 64*e82f7db8SAndroid Build Coastguard Worker jlong seqNum; /* ID of reference, also key for hash table */ 65*e82f7db8SAndroid Build Coastguard Worker jobject ref; /* ANDROID-CHANGED: Always the strong reference if isStrong, NULL 66*e82f7db8SAndroid Build Coastguard Worker * otherwise. 67*e82f7db8SAndroid Build Coastguard Worker */ 68*e82f7db8SAndroid Build Coastguard Worker struct RefNode *next; /* next RefNode* in bucket chain */ 69*e82f7db8SAndroid Build Coastguard Worker struct RefNode *prev; /* ANDROID-CHANGED: Previous RefNode* in bucket chain. Used to allow 70*e82f7db8SAndroid Build Coastguard Worker * us to remove arbitrary elements. */ 71*e82f7db8SAndroid Build Coastguard Worker jint count; /* count of references */ 72*e82f7db8SAndroid Build Coastguard Worker unsigned isStrong : 1; /* 1 means this is a strong reference */ 73*e82f7db8SAndroid Build Coastguard Worker } RefNode; 74*e82f7db8SAndroid Build Coastguard Worker 75*e82f7db8SAndroid Build Coastguard Worker /* Value of a NULL ID */ 76*e82f7db8SAndroid Build Coastguard Worker #define NULL_OBJECT_ID ((jlong)0) 77*e82f7db8SAndroid Build Coastguard Worker 78*e82f7db8SAndroid Build Coastguard Worker /* 79*e82f7db8SAndroid Build Coastguard Worker * Globals used throughout the back end 80*e82f7db8SAndroid Build Coastguard Worker */ 81*e82f7db8SAndroid Build Coastguard Worker 82*e82f7db8SAndroid Build Coastguard Worker typedef jint FrameNumber; 83*e82f7db8SAndroid Build Coastguard Worker 84*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: support for DDMS extension apis. 85*e82f7db8SAndroid Build Coastguard Worker typedef jvmtiError (*DdmProcessChunk)(jvmtiEnv* jvmti, 86*e82f7db8SAndroid Build Coastguard Worker jint type_in, 87*e82f7db8SAndroid Build Coastguard Worker jint length_in, 88*e82f7db8SAndroid Build Coastguard Worker const jbyte* data_in, 89*e82f7db8SAndroid Build Coastguard Worker jint* type_out, 90*e82f7db8SAndroid Build Coastguard Worker jint* length_out, 91*e82f7db8SAndroid Build Coastguard Worker jbyte** data_out); 92*e82f7db8SAndroid Build Coastguard Worker typedef jvmtiError (*RawMonitorEnterNoSuspend)(jvmtiEnv* env, jrawMonitorID mon); 93*e82f7db8SAndroid Build Coastguard Worker 94*e82f7db8SAndroid Build Coastguard Worker typedef struct { 95*e82f7db8SAndroid Build Coastguard Worker jvmtiEnv *jvmti; 96*e82f7db8SAndroid Build Coastguard Worker JavaVM *jvm; 97*e82f7db8SAndroid Build Coastguard Worker volatile jboolean vmDead; /* Once VM is dead it stays that way - don't put in init */ 98*e82f7db8SAndroid Build Coastguard Worker jboolean assertOn; 99*e82f7db8SAndroid Build Coastguard Worker jboolean assertFatal; 100*e82f7db8SAndroid Build Coastguard Worker jboolean doerrorexit; 101*e82f7db8SAndroid Build Coastguard Worker jboolean modifiedUtf8; 102*e82f7db8SAndroid Build Coastguard Worker jboolean quiet; 103*e82f7db8SAndroid Build Coastguard Worker 104*e82f7db8SAndroid Build Coastguard Worker /* Debug flags (bit mask) */ 105*e82f7db8SAndroid Build Coastguard Worker int debugflags; 106*e82f7db8SAndroid Build Coastguard Worker 107*e82f7db8SAndroid Build Coastguard Worker /* Possible debug flags */ 108*e82f7db8SAndroid Build Coastguard Worker #define USE_ITERATE_THROUGH_HEAP 0X001 109*e82f7db8SAndroid Build Coastguard Worker 110*e82f7db8SAndroid Build Coastguard Worker char * options; 111*e82f7db8SAndroid Build Coastguard Worker 112*e82f7db8SAndroid Build Coastguard Worker jclass classClass; 113*e82f7db8SAndroid Build Coastguard Worker jclass threadClass; 114*e82f7db8SAndroid Build Coastguard Worker jclass threadGroupClass; 115*e82f7db8SAndroid Build Coastguard Worker jclass classLoaderClass; 116*e82f7db8SAndroid Build Coastguard Worker jclass stringClass; 117*e82f7db8SAndroid Build Coastguard Worker jclass systemClass; 118*e82f7db8SAndroid Build Coastguard Worker jmethodID threadConstructor; 119*e82f7db8SAndroid Build Coastguard Worker jmethodID threadSetDaemon; 120*e82f7db8SAndroid Build Coastguard Worker jmethodID threadResume; 121*e82f7db8SAndroid Build Coastguard Worker jmethodID systemGetProperty; 122*e82f7db8SAndroid Build Coastguard Worker jmethodID setProperty; 123*e82f7db8SAndroid Build Coastguard Worker jthreadGroup systemThreadGroup; 124*e82f7db8SAndroid Build Coastguard Worker jobject agent_properties; 125*e82f7db8SAndroid Build Coastguard Worker 126*e82f7db8SAndroid Build Coastguard Worker jint cachedJvmtiVersion; 127*e82f7db8SAndroid Build Coastguard Worker jvmtiCapabilities cachedJvmtiCapabilities; 128*e82f7db8SAndroid Build Coastguard Worker jboolean haveCachedJvmtiCapabilities; 129*e82f7db8SAndroid Build Coastguard Worker jvmtiEventCallbacks callbacks; 130*e82f7db8SAndroid Build Coastguard Worker 131*e82f7db8SAndroid Build Coastguard Worker /* Various property values we should grab on initialization */ 132*e82f7db8SAndroid Build Coastguard Worker char* property_java_version; /* UTF8 java.version */ 133*e82f7db8SAndroid Build Coastguard Worker char* property_java_vm_name; /* UTF8 java.vm.name */ 134*e82f7db8SAndroid Build Coastguard Worker char* property_java_vm_info; /* UTF8 java.vm.info */ 135*e82f7db8SAndroid Build Coastguard Worker char* property_java_class_path; /* UTF8 java.class.path */ 136*e82f7db8SAndroid Build Coastguard Worker char* property_sun_boot_class_path; /* UTF8 sun.boot.class.path */ 137*e82f7db8SAndroid Build Coastguard Worker char* property_sun_boot_library_path; /* UTF8 sun.boot.library.path */ 138*e82f7db8SAndroid Build Coastguard Worker char* property_path_separator; /* UTF8 path.separator */ 139*e82f7db8SAndroid Build Coastguard Worker char* property_user_dir; /* UTF8 user.dir */ 140*e82f7db8SAndroid Build Coastguard Worker 141*e82f7db8SAndroid Build Coastguard Worker unsigned log_flags; 142*e82f7db8SAndroid Build Coastguard Worker 143*e82f7db8SAndroid Build Coastguard Worker /* The Native Platform Toolkit access */ 144*e82f7db8SAndroid Build Coastguard Worker NptEnv *npt; 145*e82f7db8SAndroid Build Coastguard Worker 146*e82f7db8SAndroid Build Coastguard Worker /* Common References static data */ 147*e82f7db8SAndroid Build Coastguard Worker jrawMonitorID refLock; 148*e82f7db8SAndroid Build Coastguard Worker jlong nextSeqNum; 149*e82f7db8SAndroid Build Coastguard Worker RefNode **objectsByID; 150*e82f7db8SAndroid Build Coastguard Worker int objectsByIDsize; 151*e82f7db8SAndroid Build Coastguard Worker int objectsByIDcount; 152*e82f7db8SAndroid Build Coastguard Worker 153*e82f7db8SAndroid Build Coastguard Worker /* Indication that the agent has been loaded */ 154*e82f7db8SAndroid Build Coastguard Worker jboolean isLoaded; 155*e82f7db8SAndroid Build Coastguard Worker 156*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: com.android.art.internal.ddm.process_chunk extension function */ 157*e82f7db8SAndroid Build Coastguard Worker DdmProcessChunk ddm_process_chunk; 158*e82f7db8SAndroid Build Coastguard Worker RawMonitorEnterNoSuspend raw_monitor_enter_no_suspend; 159*e82f7db8SAndroid Build Coastguard Worker 160*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: Need to keep track of if ddm is initially active. */ 161*e82f7db8SAndroid Build Coastguard Worker jboolean ddmInitiallyActive; 162*e82f7db8SAndroid Build Coastguard Worker 163*e82f7db8SAndroid Build Coastguard Worker } BackendGlobalData; 164*e82f7db8SAndroid Build Coastguard Worker 165*e82f7db8SAndroid Build Coastguard Worker extern BackendGlobalData * gdata; 166*e82f7db8SAndroid Build Coastguard Worker 167*e82f7db8SAndroid Build Coastguard Worker /* 168*e82f7db8SAndroid Build Coastguard Worker * Event Index for handlers 169*e82f7db8SAndroid Build Coastguard Worker */ 170*e82f7db8SAndroid Build Coastguard Worker 171*e82f7db8SAndroid Build Coastguard Worker typedef enum { 172*e82f7db8SAndroid Build Coastguard Worker EI_min = 1, 173*e82f7db8SAndroid Build Coastguard Worker 174*e82f7db8SAndroid Build Coastguard Worker EI_SINGLE_STEP = 1, 175*e82f7db8SAndroid Build Coastguard Worker EI_BREAKPOINT = 2, 176*e82f7db8SAndroid Build Coastguard Worker EI_FRAME_POP = 3, 177*e82f7db8SAndroid Build Coastguard Worker EI_EXCEPTION = 4, 178*e82f7db8SAndroid Build Coastguard Worker EI_THREAD_START = 5, 179*e82f7db8SAndroid Build Coastguard Worker EI_THREAD_END = 6, 180*e82f7db8SAndroid Build Coastguard Worker EI_CLASS_PREPARE = 7, 181*e82f7db8SAndroid Build Coastguard Worker EI_GC_FINISH = 8, 182*e82f7db8SAndroid Build Coastguard Worker EI_CLASS_LOAD = 9, 183*e82f7db8SAndroid Build Coastguard Worker EI_FIELD_ACCESS = 10, 184*e82f7db8SAndroid Build Coastguard Worker EI_FIELD_MODIFICATION = 11, 185*e82f7db8SAndroid Build Coastguard Worker EI_EXCEPTION_CATCH = 12, 186*e82f7db8SAndroid Build Coastguard Worker EI_METHOD_ENTRY = 13, 187*e82f7db8SAndroid Build Coastguard Worker EI_METHOD_EXIT = 14, 188*e82f7db8SAndroid Build Coastguard Worker EI_MONITOR_CONTENDED_ENTER = 15, 189*e82f7db8SAndroid Build Coastguard Worker EI_MONITOR_CONTENDED_ENTERED = 16, 190*e82f7db8SAndroid Build Coastguard Worker EI_MONITOR_WAIT = 17, 191*e82f7db8SAndroid Build Coastguard Worker EI_MONITOR_WAITED = 18, 192*e82f7db8SAndroid Build Coastguard Worker EI_VM_INIT = 19, 193*e82f7db8SAndroid Build Coastguard Worker EI_VM_DEATH = 20, 194*e82f7db8SAndroid Build Coastguard Worker EI_max = 20 195*e82f7db8SAndroid Build Coastguard Worker } EventIndex; 196*e82f7db8SAndroid Build Coastguard Worker 197*e82f7db8SAndroid Build Coastguard Worker /* Agent errors that might be in a jvmtiError for JDWP or internal. 198*e82f7db8SAndroid Build Coastguard Worker * (Done this way so that compiler allows it's use as a jvmtiError) 199*e82f7db8SAndroid Build Coastguard Worker */ 200*e82f7db8SAndroid Build Coastguard Worker #define _AGENT_ERROR(x) ((jvmtiError)(JVMTI_ERROR_MAX+64+x)) 201*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INTERNAL _AGENT_ERROR(1) 202*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_VM_DEAD _AGENT_ERROR(2) 203*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NO_JNI_ENV _AGENT_ERROR(3) 204*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_JNI_EXCEPTION _AGENT_ERROR(4) 205*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_JVMTI_INTERNAL _AGENT_ERROR(5) 206*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_JDWP_INTERNAL _AGENT_ERROR(6) 207*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NOT_CURRENT_FRAME _AGENT_ERROR(7) 208*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_OUT_OF_MEMORY _AGENT_ERROR(8) 209*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_TAG _AGENT_ERROR(9) 210*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_ALREADY_INVOKING _AGENT_ERROR(10) 211*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_INDEX _AGENT_ERROR(11) 212*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_LENGTH _AGENT_ERROR(12) 213*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_STRING _AGENT_ERROR(13) 214*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_CLASS_LOADER _AGENT_ERROR(14) 215*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_ARRAY _AGENT_ERROR(15) 216*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_TRANSPORT_LOAD _AGENT_ERROR(16) 217*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_TRANSPORT_INIT _AGENT_ERROR(17) 218*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NATIVE_METHOD _AGENT_ERROR(18) 219*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_COUNT _AGENT_ERROR(19) 220*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_FRAMEID _AGENT_ERROR(20) 221*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NULL_POINTER _AGENT_ERROR(21) 222*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_ILLEGAL_ARGUMENT _AGENT_ERROR(22) 223*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_THREAD _AGENT_ERROR(23) 224*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_EVENT_TYPE _AGENT_ERROR(24) 225*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_OBJECT _AGENT_ERROR(25) 226*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NO_MORE_FRAMES _AGENT_ERROR(26) 227*e82f7db8SAndroid Build Coastguard Worker 228*e82f7db8SAndroid Build Coastguard Worker /* Combined event information */ 229*e82f7db8SAndroid Build Coastguard Worker 230*e82f7db8SAndroid Build Coastguard Worker typedef struct { 231*e82f7db8SAndroid Build Coastguard Worker 232*e82f7db8SAndroid Build Coastguard Worker EventIndex ei; 233*e82f7db8SAndroid Build Coastguard Worker jthread thread; 234*e82f7db8SAndroid Build Coastguard Worker jclass clazz; 235*e82f7db8SAndroid Build Coastguard Worker jmethodID method; 236*e82f7db8SAndroid Build Coastguard Worker jlocation location; 237*e82f7db8SAndroid Build Coastguard Worker jobject object; /* possibly an exception or user object */ 238*e82f7db8SAndroid Build Coastguard Worker 239*e82f7db8SAndroid Build Coastguard Worker union { 240*e82f7db8SAndroid Build Coastguard Worker 241*e82f7db8SAndroid Build Coastguard Worker /* ei = EI_FIELD_ACCESS */ 242*e82f7db8SAndroid Build Coastguard Worker struct { 243*e82f7db8SAndroid Build Coastguard Worker jclass field_clazz; 244*e82f7db8SAndroid Build Coastguard Worker jfieldID field; 245*e82f7db8SAndroid Build Coastguard Worker } field_access; 246*e82f7db8SAndroid Build Coastguard Worker 247*e82f7db8SAndroid Build Coastguard Worker /* ei = EI_FIELD_MODIFICATION */ 248*e82f7db8SAndroid Build Coastguard Worker struct { 249*e82f7db8SAndroid Build Coastguard Worker jclass field_clazz; 250*e82f7db8SAndroid Build Coastguard Worker jfieldID field; 251*e82f7db8SAndroid Build Coastguard Worker char signature_type; 252*e82f7db8SAndroid Build Coastguard Worker jvalue new_value; 253*e82f7db8SAndroid Build Coastguard Worker } field_modification; 254*e82f7db8SAndroid Build Coastguard Worker 255*e82f7db8SAndroid Build Coastguard Worker /* ei = EI_EXCEPTION */ 256*e82f7db8SAndroid Build Coastguard Worker struct { 257*e82f7db8SAndroid Build Coastguard Worker jclass catch_clazz; 258*e82f7db8SAndroid Build Coastguard Worker jmethodID catch_method; 259*e82f7db8SAndroid Build Coastguard Worker jlocation catch_location; 260*e82f7db8SAndroid Build Coastguard Worker } exception; 261*e82f7db8SAndroid Build Coastguard Worker 262*e82f7db8SAndroid Build Coastguard Worker /* ei = EI_METHOD_EXIT */ 263*e82f7db8SAndroid Build Coastguard Worker struct { 264*e82f7db8SAndroid Build Coastguard Worker jvalue return_value; 265*e82f7db8SAndroid Build Coastguard Worker } method_exit; 266*e82f7db8SAndroid Build Coastguard Worker 267*e82f7db8SAndroid Build Coastguard Worker /* For monitor wait events */ 268*e82f7db8SAndroid Build Coastguard Worker union { 269*e82f7db8SAndroid Build Coastguard Worker /* ei = EI_MONITOR_WAIT */ 270*e82f7db8SAndroid Build Coastguard Worker jlong timeout; 271*e82f7db8SAndroid Build Coastguard Worker /* ei = EI_MONITOR_WAITED */ 272*e82f7db8SAndroid Build Coastguard Worker jboolean timed_out; 273*e82f7db8SAndroid Build Coastguard Worker } monitor; 274*e82f7db8SAndroid Build Coastguard Worker } u; 275*e82f7db8SAndroid Build Coastguard Worker 276*e82f7db8SAndroid Build Coastguard Worker } EventInfo; 277*e82f7db8SAndroid Build Coastguard Worker 278*e82f7db8SAndroid Build Coastguard Worker /* Structure to hold dynamic array of objects */ 279*e82f7db8SAndroid Build Coastguard Worker typedef struct ObjectBatch { 280*e82f7db8SAndroid Build Coastguard Worker jobject *objects; 281*e82f7db8SAndroid Build Coastguard Worker jint count; 282*e82f7db8SAndroid Build Coastguard Worker } ObjectBatch; 283*e82f7db8SAndroid Build Coastguard Worker 284*e82f7db8SAndroid Build Coastguard Worker /* 285*e82f7db8SAndroid Build Coastguard Worker * JNI signature constants, beyond those defined in JDWP_TAG(*) 286*e82f7db8SAndroid Build Coastguard Worker */ 287*e82f7db8SAndroid Build Coastguard Worker #define SIGNATURE_BEGIN_ARGS '(' 288*e82f7db8SAndroid Build Coastguard Worker #define SIGNATURE_END_ARGS ')' 289*e82f7db8SAndroid Build Coastguard Worker #define SIGNATURE_END_CLASS ';' 290*e82f7db8SAndroid Build Coastguard Worker 291*e82f7db8SAndroid Build Coastguard Worker /* 292*e82f7db8SAndroid Build Coastguard Worker * Modifier flags for classes, fields, methods 293*e82f7db8SAndroid Build Coastguard Worker */ 294*e82f7db8SAndroid Build Coastguard Worker #define MOD_PUBLIC 0x0001 /* visible to everyone */ 295*e82f7db8SAndroid Build Coastguard Worker #define MOD_PRIVATE 0x0002 /* visible only to the defining class */ 296*e82f7db8SAndroid Build Coastguard Worker #define MOD_PROTECTED 0x0004 /* visible to subclasses */ 297*e82f7db8SAndroid Build Coastguard Worker #define MOD_STATIC 0x0008 /* instance variable is static */ 298*e82f7db8SAndroid Build Coastguard Worker #define MOD_FINAL 0x0010 /* no further subclassing, overriding */ 299*e82f7db8SAndroid Build Coastguard Worker #define MOD_SYNCHRONIZED 0x0020 /* wrap method call in monitor lock */ 300*e82f7db8SAndroid Build Coastguard Worker #define MOD_VOLATILE 0x0040 /* can cache in registers */ 301*e82f7db8SAndroid Build Coastguard Worker #define MOD_TRANSIENT 0x0080 /* not persistant */ 302*e82f7db8SAndroid Build Coastguard Worker #define MOD_NATIVE 0x0100 /* implemented in C */ 303*e82f7db8SAndroid Build Coastguard Worker #define MOD_INTERFACE 0x0200 /* class is an interface */ 304*e82f7db8SAndroid Build Coastguard Worker #define MOD_ABSTRACT 0x0400 /* no definition provided */ 305*e82f7db8SAndroid Build Coastguard Worker /* 306*e82f7db8SAndroid Build Coastguard Worker * Additional modifiers not defined as such in the JVM spec 307*e82f7db8SAndroid Build Coastguard Worker */ 308*e82f7db8SAndroid Build Coastguard Worker #define MOD_SYNTHETIC 0xf0000000 /* not in source code */ 309*e82f7db8SAndroid Build Coastguard Worker 310*e82f7db8SAndroid Build Coastguard Worker /* 311*e82f7db8SAndroid Build Coastguard Worker * jlong conversion macros 312*e82f7db8SAndroid Build Coastguard Worker */ 313*e82f7db8SAndroid Build Coastguard Worker #define jlong_zero ((jlong) 0) 314*e82f7db8SAndroid Build Coastguard Worker #define jlong_one ((jlong) 1) 315*e82f7db8SAndroid Build Coastguard Worker 316*e82f7db8SAndroid Build Coastguard Worker #define jlong_to_ptr(a) ((void*)(intptr_t)(a)) 317*e82f7db8SAndroid Build Coastguard Worker #define ptr_to_jlong(a) ((jlong)(intptr_t)(a)) 318*e82f7db8SAndroid Build Coastguard Worker #define jint_to_jlong(a) ((jlong)(a)) 319*e82f7db8SAndroid Build Coastguard Worker #define jlong_to_jint(a) ((jint)(a)) 320*e82f7db8SAndroid Build Coastguard Worker 321*e82f7db8SAndroid Build Coastguard Worker 322*e82f7db8SAndroid Build Coastguard Worker /* 323*e82f7db8SAndroid Build Coastguard Worker * util funcs 324*e82f7db8SAndroid Build Coastguard Worker */ 325*e82f7db8SAndroid Build Coastguard Worker void util_initialize(JNIEnv *env); 326*e82f7db8SAndroid Build Coastguard Worker void util_reset(void); 327*e82f7db8SAndroid Build Coastguard Worker 328*e82f7db8SAndroid Build Coastguard Worker struct PacketInputStream; 329*e82f7db8SAndroid Build Coastguard Worker struct PacketOutputStream; 330*e82f7db8SAndroid Build Coastguard Worker 331*e82f7db8SAndroid Build Coastguard Worker jint uniqueID(void); 332*e82f7db8SAndroid Build Coastguard Worker jbyte referenceTypeTag(jclass clazz); 333*e82f7db8SAndroid Build Coastguard Worker jbyte specificTypeKey(JNIEnv *env, jobject object); 334*e82f7db8SAndroid Build Coastguard Worker jboolean isObjectTag(jbyte tag); 335*e82f7db8SAndroid Build Coastguard Worker jvmtiError spawnNewThread(jvmtiStartFunction func, void *arg, char *name); 336*e82f7db8SAndroid Build Coastguard Worker void convertSignatureToClassname(char *convert); 337*e82f7db8SAndroid Build Coastguard Worker void writeCodeLocation(struct PacketOutputStream *out, jclass clazz, 338*e82f7db8SAndroid Build Coastguard Worker jmethodID method, jlocation location); 339*e82f7db8SAndroid Build Coastguard Worker 340*e82f7db8SAndroid Build Coastguard Worker jvmtiError classInstances(jclass klass, ObjectBatch *instances, int maxInstances); 341*e82f7db8SAndroid Build Coastguard Worker jvmtiError classInstanceCounts(jint classCount, jclass *classes, jlong *counts); 342*e82f7db8SAndroid Build Coastguard Worker jvmtiError objectReferrers(jobject obj, ObjectBatch *referrers, int maxObjects); 343*e82f7db8SAndroid Build Coastguard Worker 344*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: Helper function to get current time in milliseconds on CLOCK_MONOTONIC 345*e82f7db8SAndroid Build Coastguard Worker jlong milliTime(void); 346*e82f7db8SAndroid Build Coastguard Worker jlong nsTime(void); 347*e82f7db8SAndroid Build Coastguard Worker 348*e82f7db8SAndroid Build Coastguard Worker /* 349*e82f7db8SAndroid Build Coastguard Worker * Command handling helpers shared among multiple command sets 350*e82f7db8SAndroid Build Coastguard Worker */ 351*e82f7db8SAndroid Build Coastguard Worker int filterDebugThreads(jthread *threads, int count); 352*e82f7db8SAndroid Build Coastguard Worker 353*e82f7db8SAndroid Build Coastguard Worker 354*e82f7db8SAndroid Build Coastguard Worker void sharedGetFieldValues(struct PacketInputStream *in, 355*e82f7db8SAndroid Build Coastguard Worker struct PacketOutputStream *out, 356*e82f7db8SAndroid Build Coastguard Worker jboolean isStatic); 357*e82f7db8SAndroid Build Coastguard Worker jboolean sharedInvoke(struct PacketInputStream *in, 358*e82f7db8SAndroid Build Coastguard Worker struct PacketOutputStream *out); 359*e82f7db8SAndroid Build Coastguard Worker 360*e82f7db8SAndroid Build Coastguard Worker jvmtiError fieldSignature(jclass, jfieldID, char **, char **, char **); 361*e82f7db8SAndroid Build Coastguard Worker jvmtiError fieldModifiers(jclass, jfieldID, jint *); 362*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodSignature(jmethodID, char **, char **, char **); 363*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodReturnType(jmethodID, char *); 364*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodModifiers(jmethodID, jint *); 365*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodClass(jmethodID, jclass *); 366*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodLocation(jmethodID, jlocation*, jlocation*); 367*e82f7db8SAndroid Build Coastguard Worker jvmtiError classLoader(jclass, jobject *); 368*e82f7db8SAndroid Build Coastguard Worker 369*e82f7db8SAndroid Build Coastguard Worker /* 370*e82f7db8SAndroid Build Coastguard Worker * Thin wrappers on top of JNI 371*e82f7db8SAndroid Build Coastguard Worker */ 372*e82f7db8SAndroid Build Coastguard Worker JNIEnv *getEnv(void); 373*e82f7db8SAndroid Build Coastguard Worker jboolean isClass(jobject object); 374*e82f7db8SAndroid Build Coastguard Worker jboolean isThread(jobject object); 375*e82f7db8SAndroid Build Coastguard Worker jboolean isThreadGroup(jobject object); 376*e82f7db8SAndroid Build Coastguard Worker jboolean isString(jobject object); 377*e82f7db8SAndroid Build Coastguard Worker jboolean isClassLoader(jobject object); 378*e82f7db8SAndroid Build Coastguard Worker jboolean isArray(jobject object); 379*e82f7db8SAndroid Build Coastguard Worker 380*e82f7db8SAndroid Build Coastguard Worker /* 381*e82f7db8SAndroid Build Coastguard Worker * Thin wrappers on top of JVMTI 382*e82f7db8SAndroid Build Coastguard Worker */ 383*e82f7db8SAndroid Build Coastguard Worker jvmtiError jvmtiGetCapabilities(jvmtiCapabilities *caps); 384*e82f7db8SAndroid Build Coastguard Worker jint jvmtiMajorVersion(void); 385*e82f7db8SAndroid Build Coastguard Worker jint jvmtiMinorVersion(void); 386*e82f7db8SAndroid Build Coastguard Worker jint jvmtiMicroVersion(void); 387*e82f7db8SAndroid Build Coastguard Worker jvmtiError getSourceDebugExtension(jclass clazz, char **extensionPtr); 388*e82f7db8SAndroid Build Coastguard Worker jboolean canSuspendResumeThreadLists(void); 389*e82f7db8SAndroid Build Coastguard Worker 390*e82f7db8SAndroid Build Coastguard Worker jrawMonitorID debugMonitorCreate(char *name); 391*e82f7db8SAndroid Build Coastguard Worker void debugMonitorEnter(jrawMonitorID theLock); 392*e82f7db8SAndroid Build Coastguard Worker void debugMonitorExit(jrawMonitorID theLock); 393*e82f7db8SAndroid Build Coastguard Worker 394*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: extension functions that will enter and exit a mutex without allowing suspension 395*e82f7db8SAndroid Build Coastguard Worker * to occur. Caller must not use monitor-wait. 396*e82f7db8SAndroid Build Coastguard Worker */ 397*e82f7db8SAndroid Build Coastguard Worker void debugMonitorEnterNoSuspend(jrawMonitorID theLock); 398*e82f7db8SAndroid Build Coastguard Worker 399*e82f7db8SAndroid Build Coastguard Worker void debugMonitorWait(jrawMonitorID theLock); 400*e82f7db8SAndroid Build Coastguard Worker void debugMonitorTimedWait(jrawMonitorID theLock, jlong millis); 401*e82f7db8SAndroid Build Coastguard Worker void debugMonitorNotify(jrawMonitorID theLock); 402*e82f7db8SAndroid Build Coastguard Worker void debugMonitorNotifyAll(jrawMonitorID theLock); 403*e82f7db8SAndroid Build Coastguard Worker void debugMonitorDestroy(jrawMonitorID theLock); 404*e82f7db8SAndroid Build Coastguard Worker 405*e82f7db8SAndroid Build Coastguard Worker jthread *allThreads(jint *count); 406*e82f7db8SAndroid Build Coastguard Worker 407*e82f7db8SAndroid Build Coastguard Worker void threadGroupInfo(jthreadGroup, jvmtiThreadGroupInfo *info); 408*e82f7db8SAndroid Build Coastguard Worker 409*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: Add isArrayClass */ 410*e82f7db8SAndroid Build Coastguard Worker jboolean isArrayClass(jclass); 411*e82f7db8SAndroid Build Coastguard Worker 412*e82f7db8SAndroid Build Coastguard Worker char *getClassname(jclass); 413*e82f7db8SAndroid Build Coastguard Worker jvmtiError classSignature(jclass, char**, char**); 414*e82f7db8SAndroid Build Coastguard Worker jint classStatus(jclass); 415*e82f7db8SAndroid Build Coastguard Worker void writeGenericSignature(struct PacketOutputStream *, char *); 416*e82f7db8SAndroid Build Coastguard Worker jboolean isMethodNative(jmethodID); 417*e82f7db8SAndroid Build Coastguard Worker jboolean isMethodObsolete(jmethodID); 418*e82f7db8SAndroid Build Coastguard Worker jvmtiError isMethodSynthetic(jmethodID, jboolean*); 419*e82f7db8SAndroid Build Coastguard Worker jvmtiError isFieldSynthetic(jclass, jfieldID, jboolean*); 420*e82f7db8SAndroid Build Coastguard Worker 421*e82f7db8SAndroid Build Coastguard Worker jboolean isSameObject(JNIEnv *env, jobject o1, jobject o2); 422*e82f7db8SAndroid Build Coastguard Worker 423*e82f7db8SAndroid Build Coastguard Worker jint objectHashCode(jobject); 424*e82f7db8SAndroid Build Coastguard Worker 425*e82f7db8SAndroid Build Coastguard Worker jvmtiError allInterfaces(jclass clazz, jclass **ppinterfaces, jint *count); 426*e82f7db8SAndroid Build Coastguard Worker jvmtiError allLoadedClasses(jclass **ppclasses, jint *count); 427*e82f7db8SAndroid Build Coastguard Worker jvmtiError allClassLoaderClasses(jobject loader, jclass **ppclasses, jint *count); 428*e82f7db8SAndroid Build Coastguard Worker jvmtiError allNestedClasses(jclass clazz, jclass **ppnested, jint *pcount); 429*e82f7db8SAndroid Build Coastguard Worker 430*e82f7db8SAndroid Build Coastguard Worker void setAgentPropertyValue(JNIEnv *env, char *propertyName, char* propertyValue); 431*e82f7db8SAndroid Build Coastguard Worker 432*e82f7db8SAndroid Build Coastguard Worker void *jvmtiAllocate(jint numBytes); 433*e82f7db8SAndroid Build Coastguard Worker void jvmtiDeallocate(void *buffer); 434*e82f7db8SAndroid Build Coastguard Worker 435*e82f7db8SAndroid Build Coastguard Worker void eventIndexInit(void); 436*e82f7db8SAndroid Build Coastguard Worker jdwpEvent eventIndex2jdwp(EventIndex i); 437*e82f7db8SAndroid Build Coastguard Worker jvmtiEvent eventIndex2jvmti(EventIndex i); 438*e82f7db8SAndroid Build Coastguard Worker EventIndex jdwp2EventIndex(jdwpEvent eventType); 439*e82f7db8SAndroid Build Coastguard Worker EventIndex jvmti2EventIndex(jvmtiEvent kind); 440*e82f7db8SAndroid Build Coastguard Worker 441*e82f7db8SAndroid Build Coastguard Worker jvmtiError map2jvmtiError(jdwpError); 442*e82f7db8SAndroid Build Coastguard Worker jdwpError map2jdwpError(jvmtiError); 443*e82f7db8SAndroid Build Coastguard Worker jdwpThreadStatus map2jdwpThreadStatus(jint state); 444*e82f7db8SAndroid Build Coastguard Worker jint map2jdwpSuspendStatus(jint state); 445*e82f7db8SAndroid Build Coastguard Worker jint map2jdwpClassStatus(jint); 446*e82f7db8SAndroid Build Coastguard Worker 447*e82f7db8SAndroid Build Coastguard Worker void log_debugee_location(const char *func, 448*e82f7db8SAndroid Build Coastguard Worker jthread thread, jmethodID method, jlocation location); 449*e82f7db8SAndroid Build Coastguard Worker 450*e82f7db8SAndroid Build Coastguard Worker /* 451*e82f7db8SAndroid Build Coastguard Worker * Local Reference management. The two macros below are used 452*e82f7db8SAndroid Build Coastguard Worker * throughout the back end whenever space for JNI local references 453*e82f7db8SAndroid Build Coastguard Worker * is needed in the current frame. 454*e82f7db8SAndroid Build Coastguard Worker */ 455*e82f7db8SAndroid Build Coastguard Worker 456*e82f7db8SAndroid Build Coastguard Worker void createLocalRefSpace(JNIEnv *env, jint capacity); 457*e82f7db8SAndroid Build Coastguard Worker 458*e82f7db8SAndroid Build Coastguard Worker #define WITH_LOCAL_REFS(env, number) \ 459*e82f7db8SAndroid Build Coastguard Worker createLocalRefSpace(env, number); \ 460*e82f7db8SAndroid Build Coastguard Worker { /* BEGINNING OF WITH SCOPE */ 461*e82f7db8SAndroid Build Coastguard Worker 462*e82f7db8SAndroid Build Coastguard Worker #define END_WITH_LOCAL_REFS(env) \ 463*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,PopLocalFrame)(env, NULL); \ 464*e82f7db8SAndroid Build Coastguard Worker } /* END OF WITH SCOPE */ 465*e82f7db8SAndroid Build Coastguard Worker 466*e82f7db8SAndroid Build Coastguard Worker void saveGlobalRef(JNIEnv *env, jobject obj, jobject *pobj); 467*e82f7db8SAndroid Build Coastguard Worker void tossGlobalRef(JNIEnv *env, jobject *pobj); 468*e82f7db8SAndroid Build Coastguard Worker 469*e82f7db8SAndroid Build Coastguard Worker /* ANDROID_CHANGED: Expose this method publicly. 470*e82f7db8SAndroid Build Coastguard Worker * This returns a newly allocated jvmtiEnv* with the can_tag_objects capability. 471*e82f7db8SAndroid Build Coastguard Worker */ 472*e82f7db8SAndroid Build Coastguard Worker jvmtiEnv *getSpecialJvmti(void); 473*e82f7db8SAndroid Build Coastguard Worker 474*e82f7db8SAndroid Build Coastguard Worker #endif 475