Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/jcl/common/jclcinit.c
6000 views
1
/*******************************************************************************
2
* Copyright (c) 1998, 2021 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include <string.h>
24
#include <ctype.h>
25
26
#include "jcl.h"
27
#include "j9consts.h"
28
#include "jvminit.h"
29
#include "omrgcconsts.h"
30
#include "jni.h"
31
#include "j9protos.h"
32
#include "j9cp.h"
33
#include "jclprots.h"
34
#include "exelib_api.h"
35
#include "util_api.h"
36
#if defined(J9VM_OPT_SIDECAR)
37
#include "j2sever.h"
38
#endif
39
#include "ut_j9jcl.h"
40
#include "jclglob.h"
41
#include "j9version.h"
42
#include "omrversionstrings.h"
43
#include "j9modron.h"
44
#include "omr.h"
45
#include "vendor_version.h"
46
47
/* The vm version which must match the JCL.
48
* It has the format 0xAABBCCCC
49
* AA - vm version, BB - jcl version, CCCC - main version
50
* CCCC must match exactly with the JCL
51
* Up the vm version (AA) when adding natives
52
* BB is the required level of JCL to run the vm
53
*/
54
#define JCL_VERSION 0x06040270
55
56
extern void *jclConfig;
57
58
static UDATA
59
doJCLCheck(J9JavaVM *vm, J9Class *j9VMInternalsClass);
60
61
62
/*
63
Calculate the value for java.vm.info (and java.fullversion) system/vm properties.
64
Currently allocates into a fixed-size buffer. This really should be fixed.
65
*/
66
jint computeFullVersionString(J9JavaVM* vm)
67
{
68
VMI_ACCESS_FROM_JAVAVM((JavaVM*)vm);
69
PORT_ACCESS_FROM_JAVAVM(vm);
70
const char *osarch = NULL;
71
const char *osname = NULL;
72
const char *j2se_version_info = NULL;
73
const char *jitEnabled = "";
74
const char *aotEnabled = "";
75
const char *memInfo = NULL;
76
#define BUFFER_SIZE 512
77
78
/* The actual allowed BUFFER_SIZE is 512, the extra 1 char is added to check for overflow */
79
char vminfo[BUFFER_SIZE + 1];
80
81
#if defined(J9VM_INTERP_NATIVE_SUPPORT)
82
J9JITConfig *jitConfig = vm->jitConfig;
83
jitEnabled = "dis";
84
aotEnabled = "dis";
85
86
if (NULL != jitConfig) {
87
if (J9_ARE_ALL_BITS_SET(jitConfig->runtimeFlags, J9JIT_JIT_ATTACHED)) {
88
jitEnabled = "en";
89
}
90
if (J9_ARE_ALL_BITS_SET(jitConfig->runtimeFlags, J9JIT_AOT_ATTACHED)) {
91
aotEnabled = "en";
92
}
93
}
94
#define JIT_INFO " (JIT %sabled, AOT %sabled)\nOpenJ9 - "
95
#else
96
#define JIT_INFO "%s%s"
97
#endif /* J9VM_INTERP_NATIVE_SUPPORT */
98
99
#if JAVA_SPEC_VERSION == 8
100
if ((J2SE_VERSION(vm) & J2SE_RELEASE_MASK) == J2SE_18) {
101
j2se_version_info = "1.8.0";
102
} else {
103
j2se_version_info = "1.8.?";
104
}
105
#else /* JAVA_SPEC_VERSION == 8 */
106
if ((J2SE_VERSION(vm) & J2SE_RELEASE_MASK) == J2SE_CURRENT_VERSION) {
107
j2se_version_info = JAVA_SPEC_VERSION_STRING;
108
} else {
109
j2se_version_info = JAVA_SPEC_VERSION_STRING ".?";
110
}
111
#endif /* JAVA_SPEC_VERSION == 8 */
112
113
osname = j9sysinfo_get_OS_type();
114
osarch = j9sysinfo_get_CPU_architecture();
115
116
#ifdef J9VM_ENV_DATA64
117
memInfo = J9JAVAVM_COMPRESS_OBJECT_REFERENCES(vm) ? "64-Bit Compressed References": "64-Bit";
118
#else
119
#if defined(J9ZOS390) || defined(S390)
120
memInfo = "31-Bit";
121
#else
122
memInfo = "32-Bit";
123
#endif
124
#endif
125
126
#if defined(J9VM_GC_MODRON_GC)
127
#define OMR_INFO "\nOMR - " OMR_VERSION_STRING
128
#else
129
#define OMR_INFO ""
130
#endif /* J9VM_GC_MODRON_GC */
131
132
#if defined(OPENJDK_TAG) && defined(OPENJDK_SHA)
133
#define OPENJDK_INFO "\nJCL - " OPENJDK_SHA " based on " OPENJDK_TAG
134
#else
135
#define OPENJDK_INFO ""
136
#endif /* OPENJDK_TAG && OPENJDK_SHA */
137
138
#if defined(VENDOR_SHORT_NAME) && defined(VENDOR_SHA)
139
#define VENDOR_INFO "\n" VENDOR_SHORT_NAME " - " VENDOR_SHA
140
#else
141
#define VENDOR_INFO ""
142
#endif /* VENDOR_SHORT_NAME && VENDOR_SHA */
143
144
if (BUFFER_SIZE <= j9str_printf(PORTLIB, vminfo, BUFFER_SIZE + 1,
145
"JRE %s %s %s-%s %s" JIT_INFO J9VM_VERSION_STRING OMR_INFO VENDOR_INFO OPENJDK_INFO,
146
j2se_version_info,
147
(NULL != osname ? osname : " "),
148
osarch,
149
memInfo,
150
EsBuildVersionString,
151
jitEnabled,
152
aotEnabled)) {
153
j9tty_err_printf(PORTLIB, "\n%s - %d: %s: Error: Java VM info string exceeds buffer size\n", __FILE__, __LINE__, __FUNCTION__);
154
return JNI_ERR;
155
}
156
157
#undef BUFFER_SIZE
158
#undef JIT_INFO
159
#undef MEM_INFO
160
#undef OMR_INFO
161
#undef VENDOR_INFO
162
163
(*VMI)->SetSystemProperty(VMI, "java.vm.info", vminfo);
164
(*VMI)->SetSystemProperty(VMI, "java.fullversion", vminfo);
165
return JNI_OK;
166
}
167
168
169
static jint initializeStaticMethod(J9JavaVM* vm, UDATA offset)
170
{
171
J9ConstantPool * jclConstantPool = (J9ConstantPool *) vm->jclConstantPool;
172
J9RAMStaticMethodRef * staticMethodConstantPool = (J9RAMStaticMethodRef *) vm->jclConstantPool;
173
J9ROMMethodRef * romMethodConstantPool = (J9ROMMethodRef *) jclConstantPool->romConstantPool;
174
J9ROMClass * jclROMClass = jclConstantPool->ramClass->romClass;
175
UDATA cpType = J9_CP_TYPE(J9ROMCLASS_CPSHAPEDESCRIPTION(jclROMClass), offset);
176
177
if ((J9CPTYPE_STATIC_METHOD == cpType) || (J9CPTYPE_INTERFACE_STATIC_METHOD == cpType)) {
178
if (NULL == vm->internalVMFunctions->resolveStaticMethodRef(vm->mainThread, jclConstantPool, offset, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL | J9_RESOLVE_FLAG_JCL_CONSTANT_POOL)) {
179
if (NULL == J9VMCONSTANTPOOL_CLASSREF_AT(vm, romMethodConstantPool[offset].classRefCPIndex)->value) {
180
Trc_JCL_initializeKnownClasses_ClassRefNotResolvedForMethodRef(vm->mainThread, romMethodConstantPool[offset].classRefCPIndex, offset);
181
} else {
182
Trc_JCL_initializeKnownClasses_ExitError(vm->mainThread, offset);
183
return JNI_ERR;
184
}
185
} else {
186
Trc_JCL_initializeKnownClasses_ResolvedStaticMethodRef(vm->mainThread, offset, staticMethodConstantPool[offset].method);
187
}
188
}
189
190
return JNI_OK;
191
}
192
193
#if 0
194
static jint
195
initializeInstanceField(J9JavaVM* vm, UDATA offset)
196
{
197
J9ConstantPool * jclConstantPool = (J9ConstantPool *) vm->jclConstantPool;
198
J9RAMFieldRef * instanceFieldConstantPool = (J9RAMFieldRef *) vm->jclConstantPool;
199
J9ROMFieldRef * romFieldConstantPool = (J9ROMFieldRef *) jclConstantPool->romConstantPool;
200
J9ROMClass * jclROMClass = jclConstantPool->ramClass->romClass;
201
U_32 * cpShapeDescription = J9ROMCLASS_CPSHAPEDESCRIPTION(jclROMClass);
202
203
if (J9CPTYPE_FIELD == J9_CP_TYPE(cpShapeDescription, offset)) {
204
if (-1 == vm->internalVMFunctions->resolveInstanceFieldRef(vm->mainThread, NULL, jclConstantPool, offset, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL, NULL)) {
205
if (NULL == J9VMCONSTANTPOOL_CLASSREF_AT(vm, romFieldConstantPool[offset].classRefCPIndex)->value) {
206
Trc_JCL_initializeKnownClasses_ClassRefNotResolvedForInstanceFieldRef(vm->mainThread, romFieldConstantPool[offset].classRefCPIndex, offset);
207
} else {
208
Trc_JCL_initializeKnownClasses_ExitError(vm->mainThread, offset);
209
return JNI_ERR;
210
}
211
} else {
212
Trc_JCL_initializeKnownClasses_ResolvedInstanceFieldRef(vm->mainThread, offset, instanceFieldConstantPool[offset].valueOffset);
213
}
214
return JNI_OK;
215
}
216
217
return JNI_EINVAL;
218
}
219
#endif
220
221
static jint
222
initializeStaticField(J9JavaVM* vm, UDATA offset, UDATA resolveFlags)
223
{
224
J9ConstantPool * jclConstantPool = (J9ConstantPool *) vm->jclConstantPool;
225
J9RAMStaticFieldRef * staticFieldConstantPool = (J9RAMStaticFieldRef *) vm->jclConstantPool;
226
J9ROMFieldRef * romFieldConstantPool = (J9ROMFieldRef *) jclConstantPool->romConstantPool;
227
J9ROMClass * jclROMClass = jclConstantPool->ramClass->romClass;
228
U_32 * cpShapeDescription = J9ROMCLASS_CPSHAPEDESCRIPTION(jclROMClass);
229
230
if (J9CPTYPE_FIELD == J9_CP_TYPE(cpShapeDescription, offset)) {
231
if (NULL == vm->internalVMFunctions->resolveStaticFieldRef(vm->mainThread, NULL, jclConstantPool, offset, resolveFlags, NULL)) {
232
if (NULL == J9VMCONSTANTPOOL_CLASSREF_AT(vm, romFieldConstantPool[offset].classRefCPIndex)->value) {
233
Trc_JCL_initializeKnownClasses_ClassRefNotResolvedForStaticFieldRef(vm->mainThread, romFieldConstantPool[offset].classRefCPIndex, offset);
234
} else {
235
Trc_JCL_initializeKnownClasses_ExitError(vm->mainThread, offset);
236
return JNI_ERR;
237
}
238
} else {
239
Trc_JCL_initializeKnownClasses_ResolvedStaticFieldRef(vm->mainThread, offset, J9RAMSTATICFIELDREF_VALUEADDRESS(staticFieldConstantPool + offset));
240
}
241
return JNI_OK;
242
}
243
return JNI_EINVAL;
244
}
245
246
jint initializeKnownClasses(J9JavaVM* vm, U_32 runtimeFlags)
247
{
248
J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;
249
J9ConstantPool * jclConstantPool = (J9ConstantPool *) vm->jclConstantPool;
250
J9RAMFieldRef * instanceFieldConstantPool = (J9RAMFieldRef *) vm->jclConstantPool;
251
J9RAMStaticFieldRef * staticFieldConstantPool = (J9RAMStaticFieldRef *) vm->jclConstantPool;
252
J9RAMStaticMethodRef * staticMethodConstantPool = (J9RAMStaticMethodRef *) vm->jclConstantPool;
253
J9RAMVirtualMethodRef * virtualMethodConstantPool = (J9RAMVirtualMethodRef *) vm->jclConstantPool;
254
J9RAMSpecialMethodRef * specialMethodConstantPool = (J9RAMSpecialMethodRef *) vm->jclConstantPool;
255
J9RAMInterfaceMethodRef * interfaceMethodConstantPool = (J9RAMInterfaceMethodRef *) vm->jclConstantPool;
256
J9ROMFieldRef * romFieldConstantPool = (J9ROMFieldRef *) jclConstantPool->romConstantPool;
257
J9ROMMethodRef * romMethodConstantPool = (J9ROMMethodRef *) jclConstantPool->romConstantPool;
258
J9ROMClassRef * romClassConstantPool = (J9ROMClassRef *) jclConstantPool->romConstantPool;
259
J9ROMClass * jclROMClass = jclConstantPool->ramClass->romClass;
260
U_32 * cpShapeDescription = J9ROMCLASS_CPSHAPEDESCRIPTION(jclROMClass);
261
U_32 constPoolCount = jclROMClass->romConstantPoolCount;
262
U_32 i;
263
264
Trc_JCL_initializeKnownClasses_Entry(vm->mainThread);
265
266
for (i = 0; i < constPoolCount; i++) {
267
if (J9CPTYPE_FIELD == J9_CP_TYPE(cpShapeDescription, i)) {
268
J9ROMClassRef* romClassRef = &romClassConstantPool[romMethodConstantPool[i].classRefCPIndex];
269
270
if (0 == (romClassRef->runtimeFlags & runtimeFlags)) {
271
Trc_JCL_initializeKnownClasses_SkippingResolve(vm->mainThread, i, romClassRef, romClassRef->runtimeFlags, runtimeFlags);
272
} else {
273
/* Try resolving as a static fieldref, then as an instance fieldref. */
274
if (NULL != vmFuncs->resolveStaticFieldRef(vm->mainThread, NULL, jclConstantPool, i, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL, NULL)) {
275
Trc_JCL_initializeKnownClasses_ResolvedStaticFieldRef(vm->mainThread, i, J9RAMSTATICFIELDREF_VALUEADDRESS(staticFieldConstantPool + i));
276
} else if (-1 != vmFuncs->resolveInstanceFieldRef(vm->mainThread, NULL, jclConstantPool, i, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL, NULL)) {
277
Trc_JCL_initializeKnownClasses_ResolvedInstanceFieldRef(vm->mainThread, i, instanceFieldConstantPool[i].valueOffset);
278
} else if (NULL == J9VMCONSTANTPOOL_CLASSREF_AT(vm, romFieldConstantPool[i].classRefCPIndex)->value) {
279
/* TODO replace this tracepoint with Trc_JCL_initializeKnownClasses_ClassRefNotResolvedForFieldRef */
280
Trc_JCL_initializeKnownClasses_ClassRefNotResolvedForInstanceFieldRef(vm->mainThread, romFieldConstantPool[i].classRefCPIndex, i);
281
} else {
282
Trc_JCL_initializeKnownClasses_ExitError(vm->mainThread, i);
283
Trc_JCL_Assert_StartupFailure();
284
return JNI_ERR;
285
}
286
}
287
} else if ((J9CPTYPE_INSTANCE_METHOD == J9_CP_TYPE(cpShapeDescription, i))
288
|| (J9CPTYPE_INTERFACE_INSTANCE_METHOD == J9_CP_TYPE(cpShapeDescription, i))
289
) {
290
J9ROMClassRef* romClassRef = &romClassConstantPool[romMethodConstantPool[i].classRefCPIndex];
291
292
if (0 == (romClassRef->runtimeFlags & runtimeFlags)) {
293
Trc_JCL_initializeKnownClasses_SkippingResolve(vm->mainThread, i, romClassRef, romClassRef->runtimeFlags, runtimeFlags);
294
} else {
295
/* Resolve as both special and virtual method. It is an error for both to fail, but not for one to fail. */
296
BOOLEAN resolved = FALSE;
297
J9Method *resolvedMethod;
298
if (0 != vmFuncs->resolveVirtualMethodRef(vm->mainThread, jclConstantPool, i, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL | J9_RESOLVE_FLAG_JCL_CONSTANT_POOL, &resolvedMethod)) {
299
Trc_JCL_initializeKnownClasses_ResolvedVirtualMethodRef(vm->mainThread, i, virtualMethodConstantPool[i].methodIndexAndArgCount);
300
resolved = TRUE;
301
}
302
if (NULL != vmFuncs->resolveSpecialMethodRef(vm->mainThread, jclConstantPool, i, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL | J9_RESOLVE_FLAG_JCL_CONSTANT_POOL)) {
303
Trc_JCL_initializeKnownClasses_ResolvedSpecialMethodRef(vm->mainThread, i, specialMethodConstantPool[i].method);
304
resolved = TRUE;
305
}
306
if (!resolved) {
307
if (NULL == J9VMCONSTANTPOOL_CLASSREF_AT(vm, romMethodConstantPool[i].classRefCPIndex)->value) {
308
Trc_JCL_initializeKnownClasses_ClassRefNotResolvedForMethodRef(vm->mainThread, romMethodConstantPool[i].classRefCPIndex, i);
309
} else {
310
Trc_JCL_initializeKnownClasses_ExitError(vm->mainThread, i);
311
Trc_JCL_Assert_StartupFailure();
312
return JNI_ERR;
313
}
314
}
315
}
316
} else if (J9CPTYPE_STATIC_METHOD == J9_CP_TYPE(cpShapeDescription, i)
317
|| (J9CPTYPE_INTERFACE_STATIC_METHOD == J9_CP_TYPE(cpShapeDescription, i))
318
) {
319
J9ROMClassRef* romClassRef = &romClassConstantPool[romMethodConstantPool[i].classRefCPIndex];
320
if (0 == (romClassRef->runtimeFlags & runtimeFlags)) {
321
Trc_JCL_initializeKnownClasses_SkippingResolve(vm->mainThread, i, romClassRef, romClassRef->runtimeFlags, runtimeFlags);
322
} else {
323
if (NULL == vmFuncs->resolveStaticMethodRef(vm->mainThread, jclConstantPool, i, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL | J9_RESOLVE_FLAG_JCL_CONSTANT_POOL)) {
324
if (NULL == J9VMCONSTANTPOOL_CLASSREF_AT(vm, romMethodConstantPool[i].classRefCPIndex)->value) {
325
Trc_JCL_initializeKnownClasses_ClassRefNotResolvedForMethodRef(vm->mainThread, romMethodConstantPool[i].classRefCPIndex, i);
326
} else {
327
Trc_JCL_initializeKnownClasses_ExitError(vm->mainThread, i);
328
Trc_JCL_Assert_StartupFailure();
329
return JNI_ERR;
330
}
331
} else {
332
Trc_JCL_initializeKnownClasses_ResolvedStaticMethodRef(vm->mainThread, i, staticMethodConstantPool[i].method);
333
}
334
}
335
} else if (J9CPTYPE_INTERFACE_METHOD == J9_CP_TYPE(cpShapeDescription, i)) {
336
J9ROMClassRef* romClassRef = &romClassConstantPool[romMethodConstantPool[i].classRefCPIndex];
337
if (0 == (romClassRef->runtimeFlags & runtimeFlags)) {
338
Trc_JCL_initializeKnownClasses_SkippingResolve(vm->mainThread, i, romClassRef, romClassRef->runtimeFlags, runtimeFlags);
339
} else {
340
if (NULL == vmFuncs->resolveInterfaceMethodRef(vm->mainThread, jclConstantPool, i, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL | J9_RESOLVE_FLAG_JCL_CONSTANT_POOL)) {
341
if (NULL == J9VMCONSTANTPOOL_CLASSREF_AT(vm, romMethodConstantPool[i].classRefCPIndex)->value) {
342
Trc_JCL_initializeKnownClasses_ClassRefNotResolvedForMethodRef(vm->mainThread, romMethodConstantPool[i].classRefCPIndex, i);
343
} else {
344
Trc_JCL_initializeKnownClasses_ExitError(vm->mainThread, i);
345
Trc_JCL_Assert_StartupFailure();
346
return JNI_ERR;
347
}
348
} else {
349
Trc_JCL_initializeKnownClasses_ResolvedInterfaceMethodRef(vm->mainThread, i, interfaceMethodConstantPool[i].methodIndexAndArgCount);
350
}
351
}
352
}
353
}
354
355
Trc_JCL_initializeKnownClasses_Exit(vm->mainThread);
356
357
return JNI_OK;
358
}
359
360
361
static UDATA
362
doJCLCheck(J9JavaVM *vm, J9Class *j9VMInternalsClass)
363
{
364
J9VMThread *vmThread = vm->mainThread;
365
J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;
366
J9ROMStaticFieldShape *jclField;
367
U_8 *cConfigPtr;
368
U_8 *jclConfigPtr = NULL;
369
UDATA jclVersion = -1;
370
371
/* get the jcl specified by the class library (i.e. java.lang.J9VMInternals) */
372
vmFuncs->staticFieldAddress(vmThread, j9VMInternalsClass, (U_8*)"j9Config", sizeof("j9Config") - 1, (U_8*)"J", 1, NULL, (UDATA *)&jclField, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL, NULL);
373
if (jclField != NULL) {
374
jclConfigPtr = (U_8 *)&jclField->initialValue;
375
/* get the jcl version from the class library (i.e. java.lang.J9VMInternals) */
376
vmFuncs->staticFieldAddress(vmThread, j9VMInternalsClass, (U_8*)"j9Version", sizeof("j9Version") - 1, (U_8*)"I", 1, NULL, (UDATA *)&jclField, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL, NULL);
377
if (jclField != NULL) {
378
jclVersion = jclField->initialValue;
379
}
380
}
381
382
/* get the jcl specified by the DLL */
383
cConfigPtr = (U_8 *)&jclConfig;
384
385
/* check the values and report any errors */
386
return checkJCL(vmThread, cConfigPtr, jclConfigPtr, JCL_VERSION, jclVersion);
387
}
388
389
/**
390
* Initialize a static int field in a Class.
391
*
392
* @param[in] *vmThread the J9VMThread
393
* @param[in] *clazz the J9Class containing the static field
394
* @param[in] vmCPIndex the VM constant pool index of the static field ref
395
* @param[in] value the int value to store in the field
396
*
397
* @return a JNI result code
398
*/
399
static jint
400
initializeStaticIntField(J9VMThread *vmThread, J9Class *clazz, UDATA vmCPIndex, I_32 value)
401
{
402
jint rc = initializeStaticField(vmThread->javaVM, vmCPIndex, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL);
403
if (JNI_OK == rc) {
404
J9STATIC_I32_STORE(vmThread, clazz, J9VMCONSTANTPOOL_STATICFIELD_ADDRESS(vmThread->javaVM, vmCPIndex), value);
405
}
406
return rc;
407
}
408
409
typedef struct {
410
const UDATA vmCPIndex;
411
const I_32 value;
412
} J9IntConstantMapping;
413
414
static const J9IntConstantMapping intVMConstants[] = {
415
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE_NONE, J9_GC_WRITE_BARRIER_TYPE_NONE },
416
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE_ALWAYS, J9_GC_WRITE_BARRIER_TYPE_ALWAYS },
417
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE_OLDCHECK, J9_GC_WRITE_BARRIER_TYPE_OLDCHECK },
418
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE_CARDMARK, J9_GC_WRITE_BARRIER_TYPE_CARDMARK },
419
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE_CARDMARK_INCREMENTAL, J9_GC_WRITE_BARRIER_TYPE_CARDMARK_INCREMENTAL },
420
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE_CARDMARK_AND_OLDCHECK, J9_GC_WRITE_BARRIER_TYPE_CARDMARK_AND_OLDCHECK },
421
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE_SATB, J9_GC_WRITE_BARRIER_TYPE_SATB },
422
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE_SATB_AND_OLDCHECK, J9_GC_WRITE_BARRIER_TYPE_SATB_AND_OLDCHECK },
423
424
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_ALLOCATION_TYPE_TLH, J9_GC_ALLOCATION_TYPE_TLH },
425
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_ALLOCATION_TYPE_SEGREGATED, J9_GC_ALLOCATION_TYPE_SEGREGATED },
426
427
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_POLICY_OPTTHRUPUT, J9_GC_POLICY_OPTTHRUPUT },
428
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_POLICY_OPTAVGPAUSE, J9_GC_POLICY_OPTAVGPAUSE },
429
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_POLICY_GENCON, J9_GC_POLICY_GENCON },
430
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_POLICY_BALANCED, J9_GC_POLICY_BALANCED },
431
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_POLICY_METRONOME, J9_GC_POLICY_METRONOME },
432
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_POLICY_NOGC, J9_GC_POLICY_NOGC },
433
434
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_JAVA_CLASS_RAM_SHAPE_SHIFT, J9AccClassRAMShapeShift },
435
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_OBJECT_HEADER_SHAPE_MASK, OBJECT_HEADER_SHAPE_MASK },
436
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_INSTANCESIZE_OFFSET, offsetof(J9Class, totalInstanceSize) },
437
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_INSTANCE_DESCRIPTION_OFFSET, offsetof(J9Class, instanceDescription) },
438
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_LOCK_OFFSET_OFFSET, offsetof(J9Class, lockOffset) },
439
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_LOCK_RESERVATION_HISTORY_RESERVED_COUNTER_OFFSET, offsetof(J9Class, reservedCounter) },
440
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_LOCK_RESERVATION_HISTORY_CANCEL_COUNTER_OFFSET, offsetof(J9Class, cancelCounter) },
441
442
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_INITIALIZE_STATUS_OFFSET, offsetof(J9Class, initializeStatus) },
443
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_SIZE, (I_32)sizeof(J9Class) },
444
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_ADDRESS_SIZE, (I_32)sizeof(UDATA) },
445
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_CLASS_DEPTH_AND_FLAGS_OFFSET, offsetof(J9Class, classDepthAndFlags) },
446
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_INIT_SUCCEEDED, J9ClassInitSucceeded },
447
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_SUPERCLASSES_OFFSET, offsetof(J9Class, superclasses) },
448
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_ROMCLASS_OFFSET, offsetof(J9Class, romClass) },
449
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9ROMCLASS_MODIFIERS_OFFSET, offsetof(J9ROMClass, modifiers) },
450
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_JAVA_CLASS_DEPTH_MASK, J9AccClassDepthMask },
451
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_JAVA_CLASS_MASK, ~(J9_REQUIRED_CLASS_ALIGNMENT - 1) },
452
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_ACC_CLASS_INTERNAL_PRIMITIVE_TYPE, J9AccClassInternalPrimitiveType },
453
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_ACC_CLASS_ARRAY, J9AccClassArray },
454
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_OBJECT_HEADER_HAS_BEEN_MOVED_IN_CLASS, OBJECT_HEADER_HAS_BEEN_MOVED_IN_CLASS },
455
#if defined(J9VM_ENV_LITTLE_ENDIAN)
456
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_IS_BIG_ENDIAN, JNI_FALSE},
457
#else
458
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_IS_BIG_ENDIAN, JNI_TRUE},
459
#endif
460
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_CLASSLOADER_TYPE_OTHERS, J9_CLASSLOADER_TYPE_OTHERS },
461
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_CLASSLOADER_TYPE_BOOT, J9_CLASSLOADER_TYPE_BOOT },
462
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_CLASSLOADER_TYPE_PLATFORM, J9_CLASSLOADER_TYPE_PLATFORM },
463
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9CLASS_RESERVABLE_LOCK_WORD_INIT, J9ClassReservableLockWordInit },
464
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_OBJECT_HEADER_LOCK_RESERVED, OBJECT_HEADER_LOCK_RESERVED },
465
{ J9VMCONSTANTPOOL_COMIBMOTIVMVM_OBJECT_HEADER_LOCK_LEARNING, OBJECT_HEADER_LOCK_LEARNING },
466
};
467
468
/**
469
* Initialize all of the constants in com.ibm.oti.vm.VM
470
*
471
* @param[in] *currentThread the current J9VMThread
472
*
473
* @return a JNI result code
474
*/
475
static jint
476
intializeVMConstants(J9VMThread *currentThread)
477
{
478
J9JavaVM *vm = currentThread->javaVM;
479
OMR_VM *omrVM = (OMR_VM *)vm->omrVM;
480
jint rc = JNI_ERR;
481
UDATA i = 0;
482
/* Load the VM class and mark it as initialized to prevent running the <clinit> */
483
J9Class *vmClass = vm->internalVMFunctions->internalFindKnownClass(currentThread, J9VMCONSTANTPOOL_COMIBMOTIVMVM, J9_FINDKNOWNCLASS_FLAG_NON_FATAL);
484
if ((NULL == vmClass) || (NULL != currentThread->currentException)) {
485
goto done;
486
}
487
vmClass->initializeStatus = J9ClassInitSucceeded;
488
489
/* Initialize non-constant fields */
490
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_WRITE_BARRIER_TYPE, (I_32)vm->gcWriteBarrierType);
491
if (JNI_OK != rc) {
492
goto done;
493
}
494
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_ALLOCATION_TYPE, (I_32)vm->gcAllocationType);
495
if (JNI_OK != rc) {
496
goto done;
497
}
498
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_GC_POLICY, (I_32)omrVM->gcPolicy);
499
if (JNI_OK != rc) {
500
goto done;
501
}
502
503
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_JIT_STRING_DEDUP_POLICY, vm->memoryManagerFunctions->j9gc_get_jit_string_dedup_policy(vm));
504
if (JNI_OK != rc) {
505
goto done;
506
}
507
508
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_J9_STRING_COMPRESSION_ENABLED, (I_32)IS_STRING_COMPRESSION_ENABLED_VM(vm));
509
if (JNI_OK != rc) {
510
goto done;
511
}
512
513
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_OBJECT_HEADER_SIZE, (I_32)J9JAVAVM_OBJECT_HEADER_SIZE(vm));
514
if (JNI_OK != rc) {
515
goto done;
516
}
517
518
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_FJ9OBJECT_SIZE, (I_32)J9JAVAVM_REFERENCE_SIZE(vm));
519
if (JNI_OK != rc) {
520
goto done;
521
}
522
523
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_GLR_ENABLE_GLOBAL_LOCK_RESERVATION, (I_32)vm->enableGlobalLockReservation);
524
if (JNI_OK != rc) {
525
goto done;
526
}
527
528
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_GLR_RESERVED_ABSOLUTE_THRESHOLD, (I_32)vm->reservedAbsoluteThreshold);
529
if (JNI_OK != rc) {
530
goto done;
531
}
532
533
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_GLR_MINIMUM_RESERVED_RATIO, (I_32)vm->minimumReservedRatio);
534
if (JNI_OK != rc) {
535
goto done;
536
}
537
538
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_GLR_CANCEL_ABSOLUTE_THRESHOLD, (I_32)vm->cancelAbsoluteThreshold);
539
if (JNI_OK != rc) {
540
goto done;
541
}
542
543
rc = initializeStaticIntField(currentThread, vmClass, J9VMCONSTANTPOOL_COMIBMOTIVMVM_GLR_MINIMUM_LEARNING_RATIO, (I_32)vm->minimumLearningRatio);
544
if (JNI_OK != rc) {
545
goto done;
546
}
547
548
/* Initialize constant int fields */
549
for (i = 0; i < sizeof(intVMConstants) / sizeof(J9IntConstantMapping); ++i) {
550
UDATA vmCPIndex = intVMConstants[i].vmCPIndex;
551
I_32 value = intVMConstants[i].value;
552
rc = initializeStaticIntField(currentThread, vmClass, vmCPIndex, value);
553
if (JNI_OK != rc) {
554
goto done;
555
}
556
}
557
done:
558
return rc;
559
}
560
561
#define ADDMODS_PROPERTY_BASE "jdk.module.addmods."
562
UDATA
563
initializeRequiredClasses(J9VMThread *vmThread, char* dllName)
564
{
565
J9JavaVM *vm = vmThread->javaVM;
566
J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;
567
J9MemoryManagerFunctions *gcFuncs = vm->memoryManagerFunctions;
568
UDATA jniVersion, i;
569
J9Class *objectClass;
570
J9Class *vmInternalsClass;
571
J9Class *classClass;
572
J9Class *clazz;
573
J9Class *stringClass;
574
J9Class *lockClass;
575
J9ClassWalkState state;
576
J9NativeLibrary* nativeLibrary = NULL;
577
j9object_t oom;
578
PORT_ACCESS_FROM_JAVAVM(vm);
579
static UDATA requiredClasses[] = {
580
J9VMCONSTANTPOOL_JAVALANGTHREAD,
581
J9VMCONSTANTPOOL_JAVALANGCLASSLOADER,
582
J9VMCONSTANTPOOL_JAVALANGSTACKTRACEELEMENT,
583
J9VMCONSTANTPOOL_JAVALANGTHROWABLE,
584
J9VMCONSTANTPOOL_JAVALANGSTACKOVERFLOWERROR,
585
J9VMCONSTANTPOOL_JAVALANGCLASSNOTFOUNDEXCEPTION,
586
J9VMCONSTANTPOOL_JAVALANGLINKAGEERROR,
587
J9VMCONSTANTPOOL_JAVALANGNOCLASSDEFFOUNDERROR,
588
J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION,
589
#if JAVA_SPEC_VERSION >= 15
590
J9VMCONSTANTPOOL_JDKINTERNALLOADERNATIVELIBRARIES,
591
J9VMCONSTANTPOOL_JDKINTERNALLOADERNATIVELIBRARIESNATIVELIBRARYIMPL,
592
#endif /* JAVA_SPEC_VERSION >= 15 */
593
#if JAVA_SPEC_VERSION >= 18
594
J9VMCONSTANTPOOL_JAVALANGINVOKEMETHODHANDLENATIVES,
595
#endif /* JAVA_SPEC_VERSION >= 18 */
596
};
597
598
/* Determine java/lang/String.value signature before any required class is initialized */
599
if (J2SE_VERSION(vm) >= J2SE_V11) {
600
vm->runtimeFlags |= J9_RUNTIME_STRING_BYTE_ARRAY;
601
}
602
603
/* CANNOT hold VM Access while calling registerBootstrapLibrary */
604
vmFuncs->internalReleaseVMAccess(vmThread);
605
606
if (vmFuncs->registerBootstrapLibrary(vmThread, dllName, &nativeLibrary, FALSE) != J9NATIVELIB_LOAD_OK) {
607
return 1;
608
}
609
610
/* If we have a JitConfig, add the JIT dll to the bootstrap loader so we can add JNI natives in the JIT */
611
if (NULL != vm->jitConfig) {
612
J9NativeLibrary* jitLibrary = NULL;
613
614
if (vmFuncs->registerBootstrapLibrary(vmThread, J9_JIT_DLL_NAME, &jitLibrary, FALSE) != J9NATIVELIB_LOAD_OK) {
615
return 1;
616
}
617
}
618
vmFuncs->internalAcquireVMAccess(vmThread);
619
620
/* request an extra slot in java/lang/Module which we will use to connect native data to the Module object */
621
if (0 != vmFuncs->addHiddenInstanceField(vm, "java/lang/Module", "modulePointer", "J", &vm->modulePointerOffset)) {
622
return 1;
623
}
624
625
#ifdef J9VM_OPT_OPENJDK_METHODHANDLE
626
if (0 != vmFuncs->addHiddenInstanceField(vm, "java/lang/invoke/MemberName", "vmindex", "J", &vm->vmindexOffset)) {
627
return 1;
628
}
629
630
if (0 != vmFuncs->addHiddenInstanceField(vm, "java/lang/invoke/MemberName", "vmtarget", "J", &vm->vmtargetOffset)) {
631
return 1;
632
}
633
634
if (0 != vmFuncs->addHiddenInstanceField(vm, "java/lang/invoke/MutableCallSite", "invalidationCookie", "J", &vm->mutableCallSiteInvalidationCookieOffset)) {
635
return 1;
636
}
637
638
if (0 != vmFuncs->addHiddenInstanceField(vm, "java/lang/invoke/MethodHandle", "jitVMEntryKeepAlive", "Ljava/lang/invoke/MemberName;", &vm->jitVMEntryKeepAliveOffset)) {
639
return 1;
640
}
641
#endif /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
642
643
644
vmThread->privateFlags |= J9_PRIVATE_FLAGS_REPORT_ERROR_LOADING_CLASS;
645
646
objectClass = vmFuncs->internalFindKnownClass(vmThread, J9VMCONSTANTPOOL_JAVALANGOBJECT, J9_FINDKNOWNCLASS_FLAG_NON_FATAL);
647
if (NULL == objectClass) {
648
return 1;
649
}
650
vmInternalsClass = vmFuncs->internalFindKnownClass(vmThread, J9VMCONSTANTPOOL_JAVALANGJ9VMINTERNALS, J9_FINDKNOWNCLASS_FLAG_NON_FATAL);
651
if ((NULL == vmInternalsClass) || (NULL != vmThread->currentException)) {
652
return 1;
653
}
654
vmInternalsClass->initializeStatus = J9ClassInitSucceeded;
655
if (JNI_OK != intializeVMConstants(vmThread)) {
656
return 1;
657
}
658
659
if (doJCLCheck(vm, vmInternalsClass) != 0) {
660
return 1;
661
}
662
663
/* Load ClassInitializationLock as early as possible */
664
665
lockClass = vmFuncs->internalFindKnownClass(vmThread, J9VMCONSTANTPOOL_JAVALANGJ9VMINTERNALSCLASSINITIALIZATIONLOCK, J9_FINDKNOWNCLASS_FLAG_NON_FATAL);
666
if ((NULL == lockClass) || (NULL != vmThread->currentException)) {
667
return 1;
668
}
669
lockClass->initializeStatus = J9ClassInitSucceeded;
670
671
/* Load java.lang.Class. This makes sure that the slot in the known class array is filled in. Since
672
* the slot was previously uninitialized, set the class of all existing classes java.lang.Class. Subsequent
673
* class creations will correctly initialize the value from the slot in the known class array. This code
674
* runs only in JNI_CreateJavaVM, so no need to mutex the class table access.
675
*/
676
677
classClass = vmFuncs->internalFindKnownClass(vmThread, J9VMCONSTANTPOOL_JAVALANGCLASS, J9_FINDKNOWNCLASS_FLAG_NON_FATAL);
678
if ((NULL == classClass) || (NULL != vmThread->currentException)) {
679
return 1;
680
}
681
682
clazz = vmFuncs->allClassesStartDo(&state, vm, vm->systemClassLoader);
683
do {
684
j9object_t classObj = gcFuncs->J9AllocateObject(vmThread, classClass, J9_GC_ALLOCATE_OBJECT_TENURED | J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE | J9_GC_ALLOCATE_OBJECT_HASHED);
685
j9object_t lockObject;
686
UDATA allocateFlags = J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE;
687
688
if (NULL == classObj) {
689
return 1;
690
}
691
J9VMJAVALANGCLASS_SET_VMREF(vmThread, classObj, clazz);
692
clazz->classObject = classObj;
693
lockObject = gcFuncs->J9AllocateObject(vmThread, lockClass, allocateFlags);
694
classObj = clazz->classObject;
695
if (lockObject == NULL) {
696
return 1;
697
}
698
J9VMJAVALANGJ9VMINTERNALSCLASSINITIALIZATIONLOCK_SET_THECLASS(vmThread, lockObject, (j9object_t)classObj);
699
J9VMJAVALANGCLASS_SET_INITIALIZATIONLOCK(vmThread, (j9object_t)classObj, lockObject);
700
} while ((clazz = vmFuncs->allClassesNextDo(&state)) != NULL);
701
vmFuncs->allClassesEndDo(&state);
702
703
/* This runtime flag indicates that j.l.Class has been loaded, and all classes have a valid classObject.
704
* It is not safe to invoke GC before this point.
705
*/
706
vm->extendedRuntimeFlags |= J9_EXTENDED_RUNTIME_CLASS_OBJECT_ASSIGNED;
707
708
if (vmFuncs->internalCreateBaseTypePrimitiveAndArrayClasses(vmThread) != 0) {
709
return 1;
710
}
711
712
/* Initialize early since sendInitialize() uses this */
713
if (initializeStaticMethod(vm, J9VMCONSTANTPOOL_JAVALANGJ9VMINTERNALS_INITIALIZATIONALREADYFAILED)) {
714
return 1;
715
}
716
if (initializeStaticMethod(vm, J9VMCONSTANTPOOL_JAVALANGJ9VMINTERNALS_RECORDINITIALIZATIONFAILURE)) {
717
return 1;
718
}
719
/* Load java.lang.String. This makes sure that the slot in the known class array is filled in.
720
* String may be needed to initialize Object.
721
*/
722
stringClass = vmFuncs->internalFindKnownClass(vmThread, J9VMCONSTANTPOOL_JAVALANGSTRING, J9_FINDKNOWNCLASS_FLAG_NON_FATAL);
723
if ((NULL == stringClass) || (NULL != vmThread->currentException)) {
724
return 1;
725
}
726
727
/* Initialize the java.lang.String.compressionFlag static field early enough so that we have
728
* access to it during the resolution of other classes in which Strings may need to be created
729
* in StringTable.cpp
730
*/
731
if (initializeStaticField(vm, J9VMCONSTANTPOOL_JAVALANGSTRING_COMPRESSIONFLAG, J9_RESOLVE_FLAG_NO_THROW_ON_FAIL | J9_RESOLVE_FLAG_NO_CLASS_INIT)) {
732
return 1;
733
}
734
735
/* Run the JCL initialization code (what used to be JNI_OnLoad) */
736
jniVersion = nativeLibrary->send_lifecycle_event(vmThread, nativeLibrary, "JCL_OnLoad", JNI_VERSION_1_1);
737
if (!vmFuncs->jniVersionIsValid(jniVersion)) {
738
return 1;
739
}
740
741
/* Initialize java.lang.String which will also initialize java.lang.Object. */
742
vmFuncs->initializeClass(vmThread, stringClass);
743
if (vmThread->currentException != NULL) {
744
return 1;
745
}
746
747
/* Initialize java.lang.Class. */
748
vmFuncs->initializeClass(vmThread, classClass);
749
if (vmThread->currentException != NULL) {
750
return 1;
751
}
752
753
/* Load some other needed classes. */
754
for (i=0; i < sizeof(requiredClasses) / sizeof(UDATA); i++) {
755
clazz = vmFuncs->internalFindKnownClass(vmThread, requiredClasses[i], J9_FINDKNOWNCLASS_FLAG_NON_FATAL);
756
if ((NULL == clazz) || (NULL != vmThread->currentException)) {
757
Trc_JCL_initializeRequiredClasses_ExitError(vmThread, i);
758
Trc_JCL_Assert_StartupFailure();
759
return 1;
760
}
761
vmFuncs->initializeClass(vmThread, clazz);
762
if (NULL != vmThread->currentException) {
763
return 1;
764
}
765
}
766
767
if (J9_ARE_ANY_BITS_SET(vm->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_LOAD_AGENT_MODULE)
768
&& (NULL != vm->modulesPathEntry->extraInfo))
769
{
770
const char *packageName = "jdk/internal/agent";
771
const char *expectedModuleName = "jdk.management.agent";
772
const char *moduleName = vm->jimageIntf->jimagePackageToModule(
773
vm->jimageIntf, (UDATA) vm->modulesPathEntry->extraInfo,
774
packageName);
775
if (NULL == moduleName) {
776
Trc_JCL_initializeRequiredClasses_moduleForPackageNotFound(vmThread, packageName);
777
} else if (0 != strcmp(expectedModuleName, moduleName)) {
778
Trc_JCL_initializeRequiredClasses_unexpectedModuleForPackage(vmThread, packageName, moduleName, expectedModuleName);
779
} else {
780
J9VMSystemProperty *systemProperty = NULL;
781
Trc_JCL_initializeRequiredClasses_addAgentModuleEntry(vmThread, moduleName);
782
/* Handle the case where there are no user-specified modules. In this case, there
783
* is typically one system property but no user-set "add-modules" arguments.
784
*/
785
if ((0 == vm->addModulesCount)
786
&& (J9SYSPROP_ERROR_NONE == vmFuncs->getSystemProperty(vm, ADDMODS_PROPERTY_BASE "0", &systemProperty)))
787
{
788
/* this is implicitly an unused property */
789
vmFuncs->setSystemProperty(vm, systemProperty, moduleName);
790
} else {
791
UDATA indexLen = j9str_printf(PORTLIB, NULL, 0, "%zu", vm->addModulesCount); /* get the length of the number string */
792
char *propNameBuffer = j9mem_allocate_memory(sizeof(ADDMODS_PROPERTY_BASE) + indexLen, OMRMEM_CATEGORY_VM);
793
if (NULL == propNameBuffer) {
794
Trc_JCL_initializeRequiredClasses_addAgentModuleOutOfMemory(vmThread);
795
return 1;
796
}
797
j9str_printf(PORTLIB, propNameBuffer, sizeof(ADDMODS_PROPERTY_BASE) + indexLen, ADDMODS_PROPERTY_BASE "%zu", vm->addModulesCount);
798
Trc_JCL_initializeRequiredClasses_addAgentModuleSetProperty(vmThread, propNameBuffer, moduleName);
799
vmFuncs->addSystemProperty(vm, propNameBuffer, moduleName, J9SYSPROP_FLAG_NAME_ALLOCATED);
800
}
801
vm->addModulesCount += 1;
802
}
803
}
804
805
if (J9_ARE_ANY_BITS_SET(vm->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_LOAD_HEALTHCENTER_MODULE)
806
&& (NULL != vm->modulesPathEntry->extraInfo))
807
{
808
const char *packageName = "com/ibm/java/diagnostics/healthcenter/agent";
809
const char *expectedModuleName = "ibm.healthcenter";
810
const char *moduleName = vm->jimageIntf->jimagePackageToModule(
811
vm->jimageIntf, (UDATA) vm->modulesPathEntry->extraInfo,
812
packageName);
813
if (NULL == moduleName) {
814
Trc_JCL_initializeRequiredClasses_moduleForPackageNotFound(vmThread, packageName);
815
} else if (0 != strcmp(expectedModuleName, moduleName)) {
816
// package %s found in module %s (expected %s) - not loading"
817
Trc_JCL_initializeRequiredClasses_unexpectedModuleForPackage(vmThread, packageName, moduleName, expectedModuleName);
818
} else {
819
J9VMSystemProperty *systemProperty = NULL;
820
Trc_JCL_initializeRequiredClasses_addAgentModuleEntry(vmThread, moduleName);
821
/* Handle the case where there are no user-specified modules. In this case, there
822
* is typically one system property but no user-set "add-modules" arguments.
823
*/
824
if ((0 == vm->addModulesCount)
825
&& (J9SYSPROP_ERROR_NONE == vmFuncs->getSystemProperty(vm, ADDMODS_PROPERTY_BASE "0", &systemProperty)))
826
{
827
/* this is implicitly an unused property */
828
vmFuncs->setSystemProperty(vm, systemProperty, moduleName);
829
} else {
830
UDATA indexLen = j9str_printf(PORTLIB, NULL, 0, "%zu", vm->addModulesCount); /* get the length of the number string */
831
char *propNameBuffer = j9mem_allocate_memory(sizeof(ADDMODS_PROPERTY_BASE) + indexLen, OMRMEM_CATEGORY_VM);
832
if (NULL == propNameBuffer) {
833
Trc_JCL_initializeRequiredClasses_addAgentModuleOutOfMemory(vmThread);
834
return 1;
835
}
836
j9str_printf(PORTLIB, propNameBuffer, sizeof(ADDMODS_PROPERTY_BASE) + indexLen, ADDMODS_PROPERTY_BASE "%zu", vm->addModulesCount);
837
Trc_JCL_initializeRequiredClasses_addAgentModuleSetProperty(vmThread, propNameBuffer, moduleName);
838
vmFuncs->addSystemProperty(vm, propNameBuffer, moduleName, J9SYSPROP_FLAG_NAME_ALLOCATED);
839
}
840
vm->addModulesCount += 1;
841
}
842
}
843
844
vmThread->privateFlags &= (~J9_PRIVATE_FLAGS_REPORT_ERROR_LOADING_CLASS);
845
846
/* Create an OutOfMemoryError now in case we run out during startup
847
* (1GDH3HI: J9VM:Neutrino - GPF reading manifest file during class loading).
848
*/
849
oom = vmFuncs->createCachedOutOfMemoryError(vmThread, NULL);
850
if (NULL == oom) {
851
return 1;
852
}
853
vmThread->outOfMemoryError = oom;
854
855
return 0;
856
}
857
#undef ADDMODS_PROPERTY_BASE
858
859