1 /*
2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 #ifndef _JAVASOFT_JVM_H_
27 #define _JAVASOFT_JVM_H_
28 
29 #include <sys/stat.h>
30 #include <stdio.h>
31 
32 #include "jni.h"
33 #include "jvm_md.h"
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 /*
40  * This file contains additional functions exported from the VM.
41  * These functions are complementary to the standard JNI support.
42  * There are three parts to this file:
43  *
44  * First, this file contains the VM-related functions needed by native
45  * libraries in the standard Java API. For example, the java.lang.Object
46  * class needs VM-level functions that wait for and notify monitors.
47  *
48  * Second, this file contains the functions and constant definitions
49  * needed by the byte code verifier and class file format checker.
50  * These functions allow the verifier and format checker to be written
51  * in a VM-independent way.
52  *
53  * Third, this file contains various I/O and nerwork operations needed
54  * by the standard Java I/O and network APIs.
55  */
56 
57 /*
58  * Bump the version number when either of the following happens:
59  *
60  * 1. There is a change in JVM_* functions.
61  *
62  * 2. There is a change in the contract between VM and Java classes.
63  *    For example, if the VM relies on a new private field in Thread
64  *    class.
65  */
66 
67 #define JVM_INTERFACE_VERSION 4
68 
69 JNIEXPORT jint JNICALL
70 JVM_GetInterfaceVersion(void);
71 
72 /*************************************************************************
73  PART 1: Functions for Native Libraries
74  ************************************************************************/
75 /*
76  * java.lang.Object
77  */
78 JNIEXPORT jint JNICALL
79 JVM_IHashCode(JNIEnv *env, jobject obj);
80 
81 JNIEXPORT void JNICALL
82 JVM_MonitorWait(JNIEnv *env, jobject obj, jlong ms);
83 
84 JNIEXPORT void JNICALL
85 JVM_MonitorNotify(JNIEnv *env, jobject obj);
86 
87 JNIEXPORT void JNICALL
88 JVM_MonitorNotifyAll(JNIEnv *env, jobject obj);
89 
90 JNIEXPORT jobject JNICALL
91 JVM_Clone(JNIEnv *env, jobject obj);
92 
93 /*
94  * java.lang.String
95  */
96 JNIEXPORT jstring JNICALL
97 JVM_InternString(JNIEnv *env, jstring str);
98 
99 /*
100  * java.lang.System
101  */
102 JNIEXPORT jlong JNICALL
103 JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored);
104 
105 JNIEXPORT jlong JNICALL
106 JVM_NanoTime(JNIEnv *env, jclass ignored);
107 
108 JNIEXPORT jlong JNICALL
109 JVM_GetNanoTimeAdjustment(JNIEnv *env, jclass ignored, jlong offset_secs);
110 
111 JNIEXPORT void JNICALL
112 JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,
113               jobject dst, jint dst_pos, jint length);
114 
115 JNIEXPORT jobject JNICALL
116 JVM_InitProperties(JNIEnv *env, jobject p);
117 
118 /*
119  * java.io.File
120  */
121 JNIEXPORT void JNICALL
122 JVM_OnExit(void (*func)(void));
123 
124 /*
125  * java.lang.Runtime
126  */
127 JNIEXPORT void JNICALL
128 JVM_Exit(jint code);
129 
130 JNIEXPORT void JNICALL
131 JVM_Halt(jint code);
132 
133 JNIEXPORT void JNICALL
134 JVM_GC(void);
135 
136 /* Returns the number of real-time milliseconds that have elapsed since the
137  * least-recently-inspected heap object was last inspected by the garbage
138  * collector.
139  *
140  * For simple stop-the-world collectors this value is just the time
141  * since the most recent collection.  For generational collectors it is the
142  * time since the oldest generation was most recently collected.  Other
143  * collectors are free to return a pessimistic estimate of the elapsed time, or
144  * simply the time since the last full collection was performed.
145  *
146  * Note that in the presence of reference objects, a given object that is no
147  * longer strongly reachable may have to be inspected multiple times before it
148  * can be reclaimed.
149  */
150 JNIEXPORT jlong JNICALL
151 JVM_MaxObjectInspectionAge(void);
152 
153 JNIEXPORT void JNICALL
154 JVM_TraceInstructions(jboolean on);
155 
156 JNIEXPORT void JNICALL
157 JVM_TraceMethodCalls(jboolean on);
158 
159 JNIEXPORT jlong JNICALL
160 JVM_TotalMemory(void);
161 
162 JNIEXPORT jlong JNICALL
163 JVM_FreeMemory(void);
164 
165 JNIEXPORT jlong JNICALL
166 JVM_MaxMemory(void);
167 
168 JNIEXPORT jint JNICALL
169 JVM_ActiveProcessorCount(void);
170 
171 JNIEXPORT jstring JVM_NativeLoad(JNIEnv* env, jstring javaFilename,
172                                  jobject javaLoader, jclass caller);
173 
174 JNIEXPORT void * JNICALL
175 JVM_LoadLibrary(const char *name);
176 
177 JNIEXPORT void JNICALL
178 JVM_UnloadLibrary(void * handle);
179 
180 JNIEXPORT void * JNICALL
181 JVM_FindLibraryEntry(void *handle, const char *name);
182 
183 JNIEXPORT jboolean JNICALL
184 JVM_IsSupportedJNIVersion(jint version);
185 
186 /*
187  * java.lang.Float and java.lang.Double
188  */
189 JNIEXPORT jboolean JNICALL
190 JVM_IsNaN(jdouble d);
191 
192 /*
193  * java.lang.Throwable
194  */
195 JNIEXPORT void JNICALL
196 JVM_FillInStackTrace(JNIEnv *env, jobject throwable);
197 
198 JNIEXPORT void JNICALL
199 JVM_PrintStackTrace(JNIEnv *env, jobject throwable, jobject printable);
200 
201 JNIEXPORT jint JNICALL
202 JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable);
203 
204 JNIEXPORT jobject JNICALL
205 JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index);
206 
207 /*
208  * java.lang.Compiler
209  */
210 JNIEXPORT void JNICALL
211 JVM_InitializeCompiler (JNIEnv *env, jclass compCls);
212 
213 JNIEXPORT jboolean JNICALL
214 JVM_IsSilentCompiler(JNIEnv *env, jclass compCls);
215 
216 JNIEXPORT jboolean JNICALL
217 JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls);
218 
219 JNIEXPORT jboolean JNICALL
220 JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname);
221 
222 JNIEXPORT jobject JNICALL
223 JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg);
224 
225 JNIEXPORT void JNICALL
226 JVM_EnableCompiler(JNIEnv *env, jclass compCls);
227 
228 JNIEXPORT void JNICALL
229 JVM_DisableCompiler(JNIEnv *env, jclass compCls);
230 
231 /*
232  * java.lang.Thread
233  */
234 JNIEXPORT void JNICALL
235 JVM_StartThread(JNIEnv *env, jobject thread, jlong stack_size, jboolean daemon);
236 
237 JNIEXPORT void JNICALL
238 JVM_StopThread(JNIEnv *env, jobject thread, jobject exception);
239 
240 JNIEXPORT jboolean JNICALL
241 JVM_IsThreadAlive(JNIEnv *env, jobject thread);
242 
243 JNIEXPORT void JNICALL
244 JVM_SuspendThread(JNIEnv *env, jobject thread);
245 
246 JNIEXPORT void JNICALL
247 JVM_ResumeThread(JNIEnv *env, jobject thread);
248 
249 JNIEXPORT void JNICALL
250 JVM_SetThreadPriority(JNIEnv *env, jobject thread, jint prio);
251 
252 JNIEXPORT void JNICALL
253 JVM_Yield(JNIEnv *env, jclass threadClass);
254 
255 JNIEXPORT void JNICALL
256 JVM_Sleep(JNIEnv *env, jclass threadClass, jobject java_object, jlong millis);
257 
258 JNIEXPORT jobject JNICALL
259 JVM_CurrentThread(JNIEnv *env, jclass threadClass);
260 
261 JNIEXPORT jint JNICALL
262 JVM_CountStackFrames(JNIEnv *env, jobject thread);
263 
264 JNIEXPORT void JNICALL
265 JVM_Interrupt(JNIEnv *env, jobject thread);
266 
267 JNIEXPORT jboolean JNICALL
268 JVM_IsInterrupted(JNIEnv *env, jobject thread, jboolean clearInterrupted);
269 
270 JNIEXPORT jboolean JNICALL
271 JVM_HoldsLock(JNIEnv *env, jclass threadClass, jobject obj);
272 
273 JNIEXPORT void JNICALL
274 JVM_DumpAllStacks(JNIEnv *env, jclass unused);
275 
276 JNIEXPORT jobjectArray JNICALL
277 JVM_GetAllThreads(JNIEnv *env, jclass dummy);
278 
279 JNIEXPORT void JNICALL
280 JVM_SetNativeThreadName(JNIEnv *env, jobject jthread, jstring name);
281 
282 /* getStackTrace() and getAllStackTraces() method */
283 JNIEXPORT jobjectArray JNICALL
284 JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads);
285 
286 /*
287  * java.lang.SecurityManager
288  */
289 JNIEXPORT jclass JNICALL
290 JVM_CurrentLoadedClass(JNIEnv *env);
291 
292 JNIEXPORT jobject JNICALL
293 JVM_CurrentClassLoader(JNIEnv *env);
294 
295 JNIEXPORT jobjectArray JNICALL
296 JVM_GetClassContext(JNIEnv *env);
297 
298 JNIEXPORT jint JNICALL
299 JVM_ClassDepth(JNIEnv *env, jstring name);
300 
301 JNIEXPORT jint JNICALL
302 JVM_ClassLoaderDepth(JNIEnv *env);
303 
304 /*
305  * java.lang.Package
306  */
307 JNIEXPORT jstring JNICALL
308 JVM_GetSystemPackage(JNIEnv *env, jstring name);
309 
310 JNIEXPORT jobjectArray JNICALL
311 JVM_GetSystemPackages(JNIEnv *env);
312 
313 /*
314  * java.io.ObjectInputStream
315  */
316 JNIEXPORT jobject JNICALL
317 JVM_AllocateNewObject(JNIEnv *env, jobject obj, jclass currClass,
318                       jclass initClass);
319 
320 JNIEXPORT jobject JNICALL
321 JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass,
322                      jint length);
323 
324 JNIEXPORT jobject JNICALL
325 JVM_LatestUserDefinedLoader(JNIEnv *env);
326 
327 /*
328  * This function has been deprecated and should not be considered
329  * part of the specified JVM interface.
330  */
331 JNIEXPORT jclass JNICALL
332 JVM_LoadClass0(JNIEnv *env, jobject obj, jclass currClass,
333                jstring currClassName);
334 
335 /*
336  * java.lang.reflect.Array
337  */
338 JNIEXPORT jint JNICALL
339 JVM_GetArrayLength(JNIEnv *env, jobject arr);
340 
341 JNIEXPORT jobject JNICALL
342 JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index);
343 
344 JNIEXPORT jvalue JNICALL
345 JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode);
346 
347 JNIEXPORT void JNICALL
348 JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val);
349 
350 JNIEXPORT void JNICALL
351 JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v,
352                              unsigned char vCode);
353 
354 JNIEXPORT jobject JNICALL
355 JVM_NewArray(JNIEnv *env, jclass eltClass, jint length);
356 
357 JNIEXPORT jobject JNICALL
358 JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim);
359 
360 /*
361  * java.lang.Class and java.lang.ClassLoader
362  */
363 /*
364  * Returns the class in which the code invoking the native method
365  * belongs.
366  *
367  * Note that in JDK 1.1, native methods did not create a frame.
368  * In 1.2, they do. Therefore native methods like Class.forName
369  * can no longer look at the current frame for the caller class.
370  */
371 JNIEXPORT jclass JNICALL
372 JVM_GetCallerClass(JNIEnv *env, int n);
373 
374 /*
375  * Find primitive classes
376  * utf: class name
377  */
378 JNIEXPORT jclass JNICALL
379 JVM_FindPrimitiveClass(JNIEnv *env, const char *utf);
380 
381 /*
382  * Link the class
383  */
384 JNIEXPORT void JNICALL
385 JVM_ResolveClass(JNIEnv *env, jclass cls);
386 
387 /*
388  * Find a class from a boot class loader. Returns NULL if class not found.
389  */
390 JNIEXPORT jclass JNICALL
391 JVM_FindClassFromBootLoader(JNIEnv *env, const char *name);
392 
393 /*
394  * Find a class from a given class loader. Throw ClassNotFoundException
395  * or NoClassDefFoundError depending on the value of the last
396  * argument.
397  */
398 JNIEXPORT jclass JNICALL
399 JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init,
400                              jobject loader, jboolean throwError);
401 
402 /*
403  * Find a class from a given class.
404  */
405 JNIEXPORT jclass JNICALL
406 JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init,
407                              jclass from);
408 
409 /* Find a loaded class cached by the VM */
410 JNIEXPORT jclass JNICALL
411 JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name);
412 
413 /* Define a class */
414 JNIEXPORT jclass JNICALL
415 JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf,
416                 jsize len, jobject pd);
417 
418 /* Define a class with a source (added in JDK1.5) */
419 JNIEXPORT jclass JNICALL
420 JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader,
421                           const jbyte *buf, jsize len, jobject pd,
422                           const char *source);
423 
424 /*
425  * Reflection support functions
426  */
427 
428 JNIEXPORT jstring JNICALL
429 JVM_GetClassName(JNIEnv *env, jclass cls);
430 
431 JNIEXPORT jobjectArray JNICALL
432 JVM_GetClassInterfaces(JNIEnv *env, jclass cls);
433 
434 JNIEXPORT jobject JNICALL
435 JVM_GetClassLoader(JNIEnv *env, jclass cls);
436 
437 JNIEXPORT jboolean JNICALL
438 JVM_IsInterface(JNIEnv *env, jclass cls);
439 
440 JNIEXPORT jobjectArray JNICALL
441 JVM_GetClassSigners(JNIEnv *env, jclass cls);
442 
443 JNIEXPORT void JNICALL
444 JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers);
445 
446 JNIEXPORT jobject JNICALL
447 JVM_GetProtectionDomain(JNIEnv *env, jclass cls);
448 
449 JNIEXPORT void JNICALL
450 JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain);
451 
452 JNIEXPORT jboolean JNICALL
453 JVM_IsArrayClass(JNIEnv *env, jclass cls);
454 
455 JNIEXPORT jboolean JNICALL
456 JVM_IsPrimitiveClass(JNIEnv *env, jclass cls);
457 
458 JNIEXPORT jclass JNICALL
459 JVM_GetComponentType(JNIEnv *env, jclass cls);
460 
461 JNIEXPORT jint JNICALL
462 JVM_GetClassModifiers(JNIEnv *env, jclass cls);
463 
464 JNIEXPORT jobjectArray JNICALL
465 JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass);
466 
467 JNIEXPORT jclass JNICALL
468 JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass);
469 
470 /* Generics support (JDK 1.5) */
471 JNIEXPORT jstring JNICALL
472 JVM_GetClassSignature(JNIEnv *env, jclass cls);
473 
474 /* Annotations support (JDK 1.5) */
475 JNIEXPORT jbyteArray JNICALL
476 JVM_GetClassAnnotations(JNIEnv *env, jclass cls);
477 
478 /*
479  * New (JDK 1.4) reflection implementation
480  */
481 
482 JNIEXPORT jobjectArray JNICALL
483 JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly);
484 
485 JNIEXPORT jobjectArray JNICALL
486 JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly);
487 
488 JNIEXPORT jobjectArray JNICALL
489 JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly);
490 
491 /* Differs from JVM_GetClassModifiers in treatment of inner classes.
492    This returns the access flags for the class as specified in the
493    class file rather than searching the InnerClasses attribute (if
494    present) to find the source-level access flags. Only the values of
495    the low 13 bits (i.e., a mask of 0x1FFF) are guaranteed to be
496    valid. */
497 JNIEXPORT jint JNICALL
498 JVM_GetClassAccessFlags(JNIEnv *env, jclass cls);
499 
500 /* The following two reflection routines are still needed due to startup time issues */
501 /*
502  * java.lang.reflect.Method
503  */
504 JNIEXPORT jobject JNICALL
505 JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0);
506 
507 /*
508  * java.lang.reflect.Constructor
509  */
510 JNIEXPORT jobject JNICALL
511 JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0);
512 
513 /*
514  * Constant pool access; currently used to implement reflective access to annotations (JDK 1.5)
515  */
516 
517 JNIEXPORT jobject JNICALL
518 JVM_GetClassConstantPool(JNIEnv *env, jclass cls);
519 
520 JNIEXPORT jint JNICALL JVM_ConstantPoolGetSize
521 (JNIEnv *env, jobject unused, jobject jcpool);
522 
523 JNIEXPORT jclass JNICALL JVM_ConstantPoolGetClassAt
524 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
525 
526 JNIEXPORT jclass JNICALL JVM_ConstantPoolGetClassAtIfLoaded
527 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
528 
529 JNIEXPORT jobject JNICALL JVM_ConstantPoolGetMethodAt
530 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
531 
532 JNIEXPORT jobject JNICALL JVM_ConstantPoolGetMethodAtIfLoaded
533 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
534 
535 JNIEXPORT jobject JNICALL JVM_ConstantPoolGetFieldAt
536 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
537 
538 JNIEXPORT jobject JNICALL JVM_ConstantPoolGetFieldAtIfLoaded
539 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
540 
541 JNIEXPORT jobjectArray JNICALL JVM_ConstantPoolGetMemberRefInfoAt
542 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
543 
544 JNIEXPORT jint JNICALL JVM_ConstantPoolGetIntAt
545 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
546 
547 JNIEXPORT jlong JNICALL JVM_ConstantPoolGetLongAt
548 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
549 
550 JNIEXPORT jfloat JNICALL JVM_ConstantPoolGetFloatAt
551 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
552 
553 JNIEXPORT jdouble JNICALL JVM_ConstantPoolGetDoubleAt
554 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
555 
556 JNIEXPORT jstring JNICALL JVM_ConstantPoolGetStringAt
557 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
558 
559 JNIEXPORT jstring JNICALL JVM_ConstantPoolGetUTF8At
560 (JNIEnv *env, jobject unused, jobject jcpool, jint index);
561 
562 /*
563  * java.security.*
564  */
565 
566 JNIEXPORT jobject JNICALL
567 JVM_DoPrivileged(JNIEnv *env, jclass cls,
568                  jobject action, jobject context, jboolean wrapException);
569 
570 JNIEXPORT jobject JNICALL
571 JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls);
572 
573 JNIEXPORT jobject JNICALL
574 JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls);
575 
576 /*
577  * Signal support, used to implement the shutdown sequence.  Every VM must
578  * support JVM_SIGINT and JVM_SIGTERM, raising the former for user interrupts
579  * (^C) and the latter for external termination (kill, system shutdown, etc.).
580  * Other platform-dependent signal values may also be supported.
581  */
582 
583 JNIEXPORT void * JNICALL
584 JVM_RegisterSignal(jint sig, void *handler);
585 
586 JNIEXPORT jboolean JNICALL
587 JVM_RaiseSignal(jint sig);
588 
589 JNIEXPORT jint JNICALL
590 JVM_FindSignal(const char *name);
591 
592 /*
593  * Retrieve the assertion directives for the specified class.
594  */
595 JNIEXPORT jboolean JNICALL
596 JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls);
597 
598 /*
599  * Retrieve the assertion directives from the VM.
600  */
601 JNIEXPORT jobject JNICALL
602 JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused);
603 
604 /*
605  * java.util.concurrent.AtomicLong
606  */
607 JNIEXPORT jboolean JNICALL
608 JVM_SupportsCX8(void);
609 
610 /*
611  * com.sun.dtrace.jsdt support
612  */
613 
614 #define JVM_TRACING_DTRACE_VERSION 1
615 
616 /*
617  * Structure to pass one probe description to JVM
618  */
619 typedef struct {
620     jmethodID method;
621     jstring   function;
622     jstring   name;
623     void*            reserved[4];     // for future use
624 } JVM_DTraceProbe;
625 
626 /**
627  * Encapsulates the stability ratings for a DTrace provider field
628  */
629 typedef struct {
630     jint nameStability;
631     jint dataStability;
632     jint dependencyClass;
633 } JVM_DTraceInterfaceAttributes;
634 
635 /*
636  * Structure to pass one provider description to JVM
637  */
638 typedef struct {
639     jstring                       name;
640     JVM_DTraceProbe*              probes;
641     jint                          probe_count;
642     JVM_DTraceInterfaceAttributes providerAttributes;
643     JVM_DTraceInterfaceAttributes moduleAttributes;
644     JVM_DTraceInterfaceAttributes functionAttributes;
645     JVM_DTraceInterfaceAttributes nameAttributes;
646     JVM_DTraceInterfaceAttributes argsAttributes;
647     void*                         reserved[4]; // for future use
648 } JVM_DTraceProvider;
649 
650 /*
651  * Get the version number the JVM was built with
652  */
653 JNIEXPORT jint JNICALL
654 JVM_DTraceGetVersion(JNIEnv* env);
655 
656 /*
657  * Register new probe with given signature, return global handle
658  *
659  * The version passed in is the version that the library code was
660  * built with.
661  */
662 JNIEXPORT jlong JNICALL
663 JVM_DTraceActivate(JNIEnv* env, jint version, jstring module_name,
664   jint providers_count, JVM_DTraceProvider* providers);
665 
666 /*
667  * Check JSDT probe
668  */
669 JNIEXPORT jboolean JNICALL
670 JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method);
671 
672 /*
673  * Destroy custom DOF
674  */
675 JNIEXPORT void JNICALL
676 JVM_DTraceDispose(JNIEnv* env, jlong activation_handle);
677 
678 /*
679  * Check to see if DTrace is supported by OS
680  */
681 JNIEXPORT jboolean JNICALL
682 JVM_DTraceIsSupported(JNIEnv* env);
683 
684 /*************************************************************************
685  PART 2: Support for the Verifier and Class File Format Checker
686  ************************************************************************/
687 /*
688  * Return the class name in UTF format. The result is valid
689  * until JVM_ReleaseUTf is called.
690  *
691  * The caller must treat the string as a constant and not modify it
692  * in any way.
693  */
694 JNIEXPORT const char * JNICALL
695 JVM_GetClassNameUTF(JNIEnv *env, jclass cb);
696 
697 /*
698  * Returns the constant pool types in the buffer provided by "types."
699  */
700 JNIEXPORT void JNICALL
701 JVM_GetClassCPTypes(JNIEnv *env, jclass cb, unsigned char *types);
702 
703 /*
704  * Returns the number of Constant Pool entries.
705  */
706 JNIEXPORT jint JNICALL
707 JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cb);
708 
709 /*
710  * Returns the number of *declared* fields or methods.
711  */
712 JNIEXPORT jint JNICALL
713 JVM_GetClassFieldsCount(JNIEnv *env, jclass cb);
714 
715 JNIEXPORT jint JNICALL
716 JVM_GetClassMethodsCount(JNIEnv *env, jclass cb);
717 
718 /*
719  * Returns the CP indexes of exceptions raised by a given method.
720  * Places the result in the given buffer.
721  *
722  * The method is identified by method_index.
723  */
724 JNIEXPORT void JNICALL
725 JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cb, jint method_index,
726                                 unsigned short *exceptions);
727 /*
728  * Returns the number of exceptions raised by a given method.
729  * The method is identified by method_index.
730  */
731 JNIEXPORT jint JNICALL
732 JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cb, jint method_index);
733 
734 /*
735  * Returns the byte code sequence of a given method.
736  * Places the result in the given buffer.
737  *
738  * The method is identified by method_index.
739  */
740 JNIEXPORT void JNICALL
741 JVM_GetMethodIxByteCode(JNIEnv *env, jclass cb, jint method_index,
742                         unsigned char *code);
743 
744 /*
745  * Returns the length of the byte code sequence of a given method.
746  * The method is identified by method_index.
747  */
748 JNIEXPORT jint JNICALL
749 JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cb, jint method_index);
750 
751 /*
752  * A structure used to a capture exception table entry in a Java method.
753  */
754 typedef struct {
755     jint start_pc;
756     jint end_pc;
757     jint handler_pc;
758     jint catchType;
759 } JVM_ExceptionTableEntryType;
760 
761 /*
762  * Returns the exception table entry at entry_index of a given method.
763  * Places the result in the given buffer.
764  *
765  * The method is identified by method_index.
766  */
767 JNIEXPORT void JNICALL
768 JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cb, jint method_index,
769                                    jint entry_index,
770                                    JVM_ExceptionTableEntryType *entry);
771 
772 /*
773  * Returns the length of the exception table of a given method.
774  * The method is identified by method_index.
775  */
776 JNIEXPORT jint JNICALL
777 JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cb, int index);
778 
779 /*
780  * Returns the modifiers of a given field.
781  * The field is identified by field_index.
782  */
783 JNIEXPORT jint JNICALL
784 JVM_GetFieldIxModifiers(JNIEnv *env, jclass cb, int index);
785 
786 /*
787  * Returns the modifiers of a given method.
788  * The method is identified by method_index.
789  */
790 JNIEXPORT jint JNICALL
791 JVM_GetMethodIxModifiers(JNIEnv *env, jclass cb, int index);
792 
793 /*
794  * Returns the number of local variables of a given method.
795  * The method is identified by method_index.
796  */
797 JNIEXPORT jint JNICALL
798 JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cb, int index);
799 
800 /*
801  * Returns the number of arguments (including this pointer) of a given method.
802  * The method is identified by method_index.
803  */
804 JNIEXPORT jint JNICALL
805 JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cb, int index);
806 
807 /*
808  * Returns the maximum amount of stack (in words) used by a given method.
809  * The method is identified by method_index.
810  */
811 JNIEXPORT jint JNICALL
812 JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cb, int index);
813 
814 /*
815  * Is a given method a constructor.
816  * The method is identified by method_index.
817  */
818 JNIEXPORT jboolean JNICALL
819 JVM_IsConstructorIx(JNIEnv *env, jclass cb, int index);
820 
821 /*
822  * Returns the name of a given method in UTF format.
823  * The result remains valid until JVM_ReleaseUTF is called.
824  *
825  * The caller must treat the string as a constant and not modify it
826  * in any way.
827  */
828 JNIEXPORT const char * JNICALL
829 JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cb, jint index);
830 
831 /*
832  * Returns the signature of a given method in UTF format.
833  * The result remains valid until JVM_ReleaseUTF is called.
834  *
835  * The caller must treat the string as a constant and not modify it
836  * in any way.
837  */
838 JNIEXPORT const char * JNICALL
839 JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cb, jint index);
840 
841 /*
842  * Returns the name of the field refered to at a given constant pool
843  * index.
844  *
845  * The result is in UTF format and remains valid until JVM_ReleaseUTF
846  * is called.
847  *
848  * The caller must treat the string as a constant and not modify it
849  * in any way.
850  */
851 JNIEXPORT const char * JNICALL
852 JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cb, jint index);
853 
854 /*
855  * Returns the name of the method refered to at a given constant pool
856  * index.
857  *
858  * The result is in UTF format and remains valid until JVM_ReleaseUTF
859  * is called.
860  *
861  * The caller must treat the string as a constant and not modify it
862  * in any way.
863  */
864 JNIEXPORT const char * JNICALL
865 JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cb, jint index);
866 
867 /*
868  * Returns the signature of the method refered to at a given constant pool
869  * index.
870  *
871  * The result is in UTF format and remains valid until JVM_ReleaseUTF
872  * is called.
873  *
874  * The caller must treat the string as a constant and not modify it
875  * in any way.
876  */
877 JNIEXPORT const char * JNICALL
878 JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cb, jint index);
879 
880 /*
881  * Returns the signature of the field refered to at a given constant pool
882  * index.
883  *
884  * The result is in UTF format and remains valid until JVM_ReleaseUTF
885  * is called.
886  *
887  * The caller must treat the string as a constant and not modify it
888  * in any way.
889  */
890 JNIEXPORT const char * JNICALL
891 JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cb, jint index);
892 
893 /*
894  * Returns the class name refered to at a given constant pool index.
895  *
896  * The result is in UTF format and remains valid until JVM_ReleaseUTF
897  * is called.
898  *
899  * The caller must treat the string as a constant and not modify it
900  * in any way.
901  */
902 JNIEXPORT const char * JNICALL
903 JVM_GetCPClassNameUTF(JNIEnv *env, jclass cb, jint index);
904 
905 /*
906  * Returns the class name refered to at a given constant pool index.
907  *
908  * The constant pool entry must refer to a CONSTANT_Fieldref.
909  *
910  * The result is in UTF format and remains valid until JVM_ReleaseUTF
911  * is called.
912  *
913  * The caller must treat the string as a constant and not modify it
914  * in any way.
915  */
916 JNIEXPORT const char * JNICALL
917 JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cb, jint index);
918 
919 /*
920  * Returns the class name refered to at a given constant pool index.
921  *
922  * The constant pool entry must refer to CONSTANT_Methodref or
923  * CONSTANT_InterfaceMethodref.
924  *
925  * The result is in UTF format and remains valid until JVM_ReleaseUTF
926  * is called.
927  *
928  * The caller must treat the string as a constant and not modify it
929  * in any way.
930  */
931 JNIEXPORT const char * JNICALL
932 JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cb, jint index);
933 
934 /*
935  * Returns the modifiers of a field in calledClass. The field is
936  * referred to in class cb at constant pool entry index.
937  *
938  * The caller must treat the string as a constant and not modify it
939  * in any way.
940  *
941  * Returns -1 if the field does not exist in calledClass.
942  */
943 JNIEXPORT jint JNICALL
944 JVM_GetCPFieldModifiers(JNIEnv *env, jclass cb, int index, jclass calledClass);
945 
946 /*
947  * Returns the modifiers of a method in calledClass. The method is
948  * referred to in class cb at constant pool entry index.
949  *
950  * Returns -1 if the method does not exist in calledClass.
951  */
952 JNIEXPORT jint JNICALL
953 JVM_GetCPMethodModifiers(JNIEnv *env, jclass cb, int index, jclass calledClass);
954 
955 /*
956  * Releases the UTF string obtained from the VM.
957  */
958 JNIEXPORT void JNICALL
959 JVM_ReleaseUTF(const char *utf);
960 
961 /*
962  * Compare if two classes are in the same package.
963  */
964 JNIEXPORT jboolean JNICALL
965 JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2);
966 
967 /* Get classfile constants */
968 #include "classfile_constants.h"
969 
970 /*
971  * A function defined by the byte-code verifier and called by the VM.
972  * This is not a function implemented in the VM.
973  *
974  * Returns JNI_FALSE if verification fails. A detailed error message
975  * will be places in msg_buf, whose length is specified by buf_len.
976  */
977 typedef jboolean (*verifier_fn_t)(JNIEnv *env,
978                                   jclass cb,
979                                   char * msg_buf,
980                                   jint buf_len);
981 
982 
983 /*
984  * Support for a VM-independent class format checker.
985  */
986 typedef struct {
987     unsigned long code;    /* byte code */
988     unsigned long excs;    /* exceptions */
989     unsigned long etab;    /* catch table */
990     unsigned long lnum;    /* line number */
991     unsigned long lvar;    /* local vars */
992 } method_size_info;
993 
994 typedef struct {
995     unsigned int constants;    /* constant pool */
996     unsigned int fields;
997     unsigned int methods;
998     unsigned int interfaces;
999     unsigned int fields2;      /* number of static 2-word fields */
1000     unsigned int innerclasses; /* # of records in InnerClasses attr */
1001 
1002     method_size_info clinit;   /* memory used in clinit */
1003     method_size_info main;     /* used everywhere else */
1004 } class_size_info;
1005 
1006 /*
1007  * Functions defined in libjava.so to perform string conversions.
1008  *
1009  */
1010 
1011 typedef jstring (*to_java_string_fn_t)(JNIEnv *env, char *str);
1012 
1013 typedef char *(*to_c_string_fn_t)(JNIEnv *env, jstring s, jboolean *b);
1014 
1015 /* This is the function defined in libjava.so that performs class
1016  * format checks. This functions fills in size information about
1017  * the class file and returns:
1018  *
1019  *   0: good
1020  *  -1: out of memory
1021  *  -2: bad format
1022  *  -3: unsupported version
1023  *  -4: bad class name
1024  */
1025 
1026 typedef jint (*check_format_fn_t)(char *class_name,
1027                                   unsigned char *data,
1028                                   unsigned int data_size,
1029                                   class_size_info *class_size,
1030                                   char *message_buffer,
1031                                   jint buffer_length,
1032                                   jboolean measure_only,
1033                                   jboolean check_relaxed);
1034 
1035 #define JVM_RECOGNIZED_CLASS_MODIFIERS (JVM_ACC_PUBLIC | \
1036                                         JVM_ACC_FINAL | \
1037                                         JVM_ACC_SUPER | \
1038                                         JVM_ACC_INTERFACE | \
1039                                         JVM_ACC_ABSTRACT | \
1040                                         JVM_ACC_ANNOTATION | \
1041                                         JVM_ACC_ENUM | \
1042                                         JVM_ACC_SYNTHETIC)
1043 
1044 #define JVM_RECOGNIZED_FIELD_MODIFIERS (JVM_ACC_PUBLIC | \
1045                                         JVM_ACC_PRIVATE | \
1046                                         JVM_ACC_PROTECTED | \
1047                                         JVM_ACC_STATIC | \
1048                                         JVM_ACC_FINAL | \
1049                                         JVM_ACC_VOLATILE | \
1050                                         JVM_ACC_TRANSIENT | \
1051                                         JVM_ACC_ENUM | \
1052                                         JVM_ACC_SYNTHETIC)
1053 
1054 #define JVM_RECOGNIZED_METHOD_MODIFIERS (JVM_ACC_PUBLIC | \
1055                                          JVM_ACC_PRIVATE | \
1056                                          JVM_ACC_PROTECTED | \
1057                                          JVM_ACC_STATIC | \
1058                                          JVM_ACC_FINAL | \
1059                                          JVM_ACC_SYNCHRONIZED | \
1060                                          JVM_ACC_BRIDGE | \
1061                                          JVM_ACC_VARARGS | \
1062                                          JVM_ACC_NATIVE | \
1063                                          JVM_ACC_ABSTRACT | \
1064                                          JVM_ACC_STRICT | \
1065                                          JVM_ACC_SYNTHETIC)
1066 
1067 /*
1068  * This is the function defined in libjava.so to perform path
1069  * canonicalization. VM call this function before opening jar files
1070  * to load system classes.
1071  *
1072  */
1073 
1074 typedef int (*canonicalize_fn_t)(JNIEnv *env, char *orig, char *out, int len);
1075 
1076 /*************************************************************************
1077  PART 3: I/O and Network Support
1078  ************************************************************************/
1079 
1080 /* Note that the JVM IO functions are expected to return JVM_IO_ERR
1081  * when there is any kind of error. The caller can then use the
1082  * platform specific support (e.g., errno) to get the detailed
1083  * error info.  The JVM_GetLastErrorString procedure may also be used
1084  * to obtain a descriptive error string.
1085  */
1086 #define JVM_IO_ERR  (-1)
1087 
1088 /* For interruptible IO. Returning JVM_IO_INTR indicates that an IO
1089  * operation has been disrupted by Thread.interrupt. There are a
1090  * number of technical difficulties related to interruptible IO that
1091  * need to be solved. For example, most existing programs do not handle
1092  * InterruptedIOExceptions specially, they simply treat those as any
1093  * IOExceptions, which typically indicate fatal errors.
1094  *
1095  * There are also two modes of operation for interruptible IO. In the
1096  * resumption mode, an interrupted IO operation is guaranteed not to
1097  * have any side-effects, and can be restarted. In the termination mode,
1098  * an interrupted IO operation corrupts the underlying IO stream, so
1099  * that the only reasonable operation on an interrupted stream is to
1100  * close that stream. The resumption mode seems to be impossible to
1101  * implement on Win32 and Solaris. Implementing the termination mode is
1102  * easier, but it's not clear that's the right semantics.
1103  *
1104  * Interruptible IO is not supported on Win32.It can be enabled/disabled
1105  * using a compile-time flag on Solaris. Third-party JVM ports do not
1106  * need to implement interruptible IO.
1107  */
1108 #define JVM_IO_INTR (-2)
1109 
1110 /* Write a string into the given buffer, in the platform's local encoding,
1111  * that describes the most recent system-level error to occur in this thread.
1112  * Return the length of the string or zero if no error occurred.
1113  */
1114 JNIEXPORT jint JNICALL
1115 JVM_GetLastErrorString(char *buf, int len);
1116 
1117 /*
1118  * Convert a pathname into native format.  This function does syntactic
1119  * cleanup, such as removing redundant separator characters.  It modifies
1120  * the given pathname string in place.
1121  */
1122 JNIEXPORT char * JNICALL
1123 JVM_NativePath(char *);
1124 
1125 /*
1126  * JVM I/O error codes
1127  */
1128 #define JVM_EEXIST       (-100)
1129 
1130 /*
1131  * Open a file descriptor. This function returns a negative error code
1132  * on error, and a non-negative integer that is the file descriptor on
1133  * success.
1134  */
1135 JNIEXPORT jint JNICALL
1136 JVM_Open(const char *fname, jint flags, jint mode);
1137 
1138 /*
1139  * Close a file descriptor. This function returns -1 on error, and 0
1140  * on success.
1141  *
1142  * fd        the file descriptor to close.
1143  */
1144 JNIEXPORT jint JNICALL
1145 JVM_Close(jint fd);
1146 
1147 /*
1148  * Read data from a file decriptor into a char array.
1149  *
1150  * fd        the file descriptor to read from.
1151  * buf       the buffer where to put the read data.
1152  * nbytes    the number of bytes to read.
1153  *
1154  * This function returns -1 on error, and 0 on success.
1155  */
1156 JNIEXPORT jint JNICALL
1157 JVM_Read(jint fd, char *buf, jint nbytes);
1158 
1159 /*
1160  * Write data from a char array to a file decriptor.
1161  *
1162  * fd        the file descriptor to read from.
1163  * buf       the buffer from which to fetch the data.
1164  * nbytes    the number of bytes to write.
1165  *
1166  * This function returns -1 on error, and 0 on success.
1167  */
1168 JNIEXPORT jint JNICALL
1169 JVM_Write(jint fd, char *buf, jint nbytes);
1170 
1171 /*
1172  * Move the file descriptor pointer from whence by offset.
1173  *
1174  * fd        the file descriptor to move.
1175  * offset    the number of bytes to move it by.
1176  * whence    the start from where to move it.
1177  *
1178  * This function returns the resulting pointer location.
1179  */
1180 JNIEXPORT jlong JNICALL
1181 JVM_Lseek(jint fd, jlong offset, jint whence);
1182 
1183 /*
1184  * Set the length of the file associated with the given descriptor to the given
1185  * length.  If the new length is longer than the current length then the file
1186  * is extended; the contents of the extended portion are not defined.  The
1187  * value of the file pointer is undefined after this procedure returns.
1188  */
1189 JNIEXPORT jint JNICALL
1190 JVM_SetLength(jint fd, jlong length);
1191 
1192 /*
1193  * Synchronize the file descriptor's in memory state with that of the
1194  * physical device.  Return of -1 is an error, 0 is OK.
1195  */
1196 JNIEXPORT jint JNICALL
1197 JVM_Sync(jint fd);
1198 
1199 /*
1200  * Networking library support
1201  */
1202 
1203 JNIEXPORT jint JNICALL
1204 JVM_InitializeSocketLibrary(void);
1205 
1206 struct sockaddr;
1207 
1208 JNIEXPORT jint JNICALL
1209 JVM_Socket(jint domain, jint type, jint protocol);
1210 
1211 JNIEXPORT jint JNICALL
1212 JVM_SocketClose(jint fd);
1213 
1214 JNIEXPORT jint JNICALL
1215 JVM_SocketShutdown(jint fd, jint howto);
1216 
1217 JNIEXPORT jint JNICALL
1218 JVM_Recv(jint fd, char *buf, jint nBytes, jint flags);
1219 
1220 JNIEXPORT jint JNICALL
1221 JVM_Send(jint fd, char *buf, jint nBytes, jint flags);
1222 
1223 JNIEXPORT jint JNICALL
1224 JVM_Timeout(int fd, long timeout);
1225 
1226 JNIEXPORT jint JNICALL
1227 JVM_Listen(jint fd, jint count);
1228 
1229 JNIEXPORT jint JNICALL
1230 JVM_Connect(jint fd, struct sockaddr *him, jint len);
1231 
1232 JNIEXPORT jint JNICALL
1233 JVM_Bind(jint fd, struct sockaddr *him, jint len);
1234 
1235 JNIEXPORT jint JNICALL
1236 JVM_Accept(jint fd, struct sockaddr *him, jint *len);
1237 
1238 JNIEXPORT jint JNICALL
1239 JVM_RecvFrom(jint fd, char *buf, int nBytes,
1240                   int flags, struct sockaddr *from, int *fromlen);
1241 
1242 JNIEXPORT jint JNICALL
1243 JVM_SendTo(jint fd, char *buf, int len,
1244                 int flags, struct sockaddr *to, int tolen);
1245 
1246 JNIEXPORT jint JNICALL
1247 JVM_SocketAvailable(jint fd, jint *result);
1248 
1249 
1250 JNIEXPORT jint JNICALL
1251 JVM_GetSockName(jint fd, struct sockaddr *him, int *len);
1252 
1253 JNIEXPORT jint JNICALL
1254 JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen);
1255 
1256 JNIEXPORT jint JNICALL
1257 JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen);
1258 
1259 JNIEXPORT int JNICALL
1260 JVM_GetHostName(char* name, int namelen);
1261 
1262 /*
1263  * The standard printing functions supported by the Java VM. (Should they
1264  * be renamed to JVM_* in the future?
1265  */
1266 
1267 /*
1268  * BE CAREFUL! The following functions do not implement the
1269  * full feature set of standard C printf formats.
1270  */
1271 int
1272 jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
1273 
1274 int
1275 jio_snprintf(char *str, size_t count, const char *fmt, ...);
1276 
1277 int
1278 jio_fprintf(FILE *, const char *fmt, ...);
1279 
1280 int
1281 jio_vfprintf(FILE *, const char *fmt, va_list args);
1282 
1283 
1284 JNIEXPORT void * JNICALL
1285 JVM_RawMonitorCreate(void);
1286 
1287 JNIEXPORT void JNICALL
1288 JVM_RawMonitorDestroy(void *mon);
1289 
1290 JNIEXPORT jint JNICALL
1291 JVM_RawMonitorEnter(void *mon);
1292 
1293 JNIEXPORT void JNICALL
1294 JVM_RawMonitorExit(void *mon);
1295 
1296 /*
1297  * java.lang.management support
1298  */
1299 JNIEXPORT void* JNICALL
1300 JVM_GetManagement(jint version);
1301 
1302 /*
1303  * com.sun.tools.attach.VirtualMachine support
1304  *
1305  * Initialize the agent properties with the properties maintained in the VM.
1306  */
1307 JNIEXPORT jobject JNICALL
1308 JVM_InitAgentProperties(JNIEnv *env, jobject agent_props);
1309 
1310 /* Generics reflection support.
1311  *
1312  * Returns information about the given class's EnclosingMethod
1313  * attribute, if present, or null if the class had no enclosing
1314  * method.
1315  *
1316  * If non-null, the returned array contains three elements. Element 0
1317  * is the java.lang.Class of which the enclosing method is a member,
1318  * and elements 1 and 2 are the java.lang.Strings for the enclosing
1319  * method's name and descriptor, respectively.
1320  */
1321 JNIEXPORT jobjectArray JNICALL
1322 JVM_GetEnclosingMethodInfo(JNIEnv* env, jclass ofClass);
1323 
1324 /*
1325  * Java thread state support
1326  */
1327 enum {
1328     JAVA_THREAD_STATE_NEW           = 0,
1329     JAVA_THREAD_STATE_RUNNABLE      = 1,
1330     JAVA_THREAD_STATE_BLOCKED       = 2,
1331     JAVA_THREAD_STATE_WAITING       = 3,
1332     JAVA_THREAD_STATE_TIMED_WAITING = 4,
1333     JAVA_THREAD_STATE_TERMINATED    = 5,
1334     JAVA_THREAD_STATE_COUNT         = 6
1335 };
1336 
1337 /*
1338  * Returns an array of the threadStatus values representing the
1339  * given Java thread state.  Returns NULL if the VM version is
1340  * incompatible with the JDK or doesn't support the given
1341  * Java thread state.
1342  */
1343 JNIEXPORT jintArray JNICALL
1344 JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState);
1345 
1346 /*
1347  * Returns an array of the substate names representing the
1348  * given Java thread state.  Returns NULL if the VM version is
1349  * incompatible with the JDK or the VM doesn't support
1350  * the given Java thread state.
1351  * values must be the jintArray returned from JVM_GetThreadStateValues
1352  * and javaThreadState.
1353  */
1354 JNIEXPORT jobjectArray JNICALL
1355 JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values);
1356 
1357 /* =========================================================================
1358  * The following defines a private JVM interface that the JDK can query
1359  * for the JVM version and capabilities.  sun.misc.Version defines
1360  * the methods for getting the VM version and its capabilities.
1361  *
1362  * When a new bit is added, the following should be updated to provide
1363  * access to the new capability:
1364  *    HS:   JVM_GetVersionInfo and Abstract_VM_Version class
1365  *    SDK:  Version class
1366  *
1367  * Similary, a private JDK interface JDK_GetVersionInfo0 is defined for
1368  * JVM to query for the JDK version and capabilities.
1369  *
1370  * When a new bit is added, the following should be updated to provide
1371  * access to the new capability:
1372  *    HS:   JDK_Version class
1373  *    SDK:  JDK_GetVersionInfo0
1374  *
1375  * ==========================================================================
1376  */
1377 typedef struct {
1378     /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
1379     unsigned int jvm_version;   /* Consists of major, minor, micro (n.n.n) */
1380                                 /* and build number (xx) */
1381     unsigned int update_version : 8;         /* Update release version (uu) */
1382     unsigned int special_update_version : 8; /* Special update release version (c)*/
1383     unsigned int reserved1 : 16;
1384     unsigned int reserved2;
1385 
1386     /* The following bits represents JVM supports that JDK has dependency on.
1387      * JDK can use these bits to determine which JVM version
1388      * and support it has to maintain runtime compatibility.
1389      *
1390      * When a new bit is added in a minor or update release, make sure
1391      * the new bit is also added in the main/baseline.
1392      */
1393     unsigned int is_attach_supported : 1;
1394     unsigned int is_kernel_jvm : 1;
1395     unsigned int : 30;
1396     unsigned int : 32;
1397     unsigned int : 32;
1398 } jvm_version_info;
1399 
1400 #define JVM_VERSION_MAJOR(version) (((version) & 0xFF000000) >> 24)
1401 #define JVM_VERSION_MINOR(version) (((version) & 0x00FF0000) >> 16)
1402 #define JVM_VERSION_MICRO(version) (((version) & 0x0000FF00) >> 8)
1403 
1404 /* Build number is available only for RE builds.
1405  * It will be zero for internal builds.
1406  */
1407 #define JVM_VERSION_BUILD(version) (((version) & 0x000000FF))
1408 
1409 JNIEXPORT void JNICALL
1410 JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size);
1411 
1412 typedef struct {
1413     // Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx
1414     unsigned int jdk_version;   /* Consists of major, minor, micro (n.n.n) */
1415                                 /* and build number (xx) */
1416     unsigned int update_version : 8;         /* Update release version (uu) */
1417     unsigned int special_update_version : 8; /* Special update release version (c)*/
1418     unsigned int reserved1 : 16;
1419     unsigned int reserved2;
1420 
1421     /* The following bits represents new JDK supports that VM has dependency on.
1422      * VM implementation can use these bits to determine which JDK version
1423      * and support it has to maintain runtime compatibility.
1424      *
1425      * When a new bit is added in a minor or update release, make sure
1426      * the new bit is also added in the main/baseline.
1427      */
1428     unsigned int thread_park_blocker : 1;
1429     unsigned int post_vm_init_hook_enabled : 1;
1430     unsigned int : 30;
1431     unsigned int : 32;
1432     unsigned int : 32;
1433 } jdk_version_info;
1434 
1435 #define JDK_VERSION_MAJOR(version) (((version) & 0xFF000000) >> 24)
1436 #define JDK_VERSION_MINOR(version) (((version) & 0x00FF0000) >> 16)
1437 #define JDK_VERSION_MICRO(version) (((version) & 0x0000FF00) >> 8)
1438 
1439 /* Build number is available only for RE build (i.e. JDK_BUILD_NUMBER is set to bNN)
1440  * It will be zero for internal builds.
1441  */
1442 #define JDK_VERSION_BUILD(version) (((version) & 0x000000FF))
1443 
1444 /*
1445  * This is the function JDK_GetVersionInfo0 defined in libjava.so
1446  * that is dynamically looked up by JVM.
1447  */
1448 typedef void (*jdk_version_info_fn_t)(jdk_version_info* info, size_t info_size);
1449 
1450 /*
1451  * This structure is used by the launcher to get the default thread
1452  * stack size from the VM using JNI_GetDefaultJavaVMInitArgs() with a
1453  * version of 1.1.  As it is not supported otherwise, it has been removed
1454  * from jni.h
1455  */
1456 typedef struct JDK1_1InitArgs {
1457     jint version;
1458 
1459     char **properties;
1460     jint checkSource;
1461     jint nativeStackSize;
1462     jint javaStackSize;
1463     jint minHeapSize;
1464     jint maxHeapSize;
1465     jint verifyMode;
1466     char *classpath;
1467 
1468     jint (JNICALL *vfprintf)(FILE *fp, const char *format, va_list args);
1469     void (JNICALL *exit)(jint code);
1470     void (JNICALL *abort)(void);
1471 
1472     jint enableClassGC;
1473     jint enableVerboseGC;
1474     jint disableAsyncGC;
1475     jint verbose;
1476     jboolean debugging;
1477     jint debugPort;
1478 } JDK1_1InitArgs;
1479 
1480 
1481 #ifdef __cplusplus
1482 } /* extern "C" */
1483 
1484 #endif /* __cplusplus */
1485 
1486 #endif /* !_JAVASOFT_JVM_H_ */
1487