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