52 #include "utilities/align.hpp"
53 #include "utilities/bytes.hpp"
54
55 #define NOFAILOVER_MAJOR_VERSION 51
56 #define NONZERO_PADDING_BYTES_IN_SWITCH_MAJOR_VERSION 51
57 #define STATIC_METHOD_IN_INTERFACE_MAJOR_VERSION 52
58 #define MAX_ARRAY_DIMENSIONS 255
59
60 // Access to external entry for VerifyClassCodes - old byte code verifier
61
62 extern "C" {
63 typedef jboolean (*verify_byte_codes_fn_t)(JNIEnv *, jclass, char *, jint);
64 typedef jboolean (*verify_byte_codes_fn_new_t)(JNIEnv *, jclass, char *, jint, jint);
65 }
66
67 static void* volatile _verify_byte_codes_fn = NULL;
68
69 static volatile jint _is_new_verify_byte_codes_fn = (jint) true;
70
71 static void* verify_byte_codes_fn() {
72 if (OrderAccess::load_ptr_acquire(&_verify_byte_codes_fn) == NULL) {
73 void *lib_handle = os::native_java_library();
74 void *func = os::dll_lookup(lib_handle, "VerifyClassCodesForMajorVersion");
75 OrderAccess::release_store_ptr(&_verify_byte_codes_fn, func);
76 if (func == NULL) {
77 _is_new_verify_byte_codes_fn = false;
78 func = os::dll_lookup(lib_handle, "VerifyClassCodes");
79 OrderAccess::release_store_ptr(&_verify_byte_codes_fn, func);
80 }
81 }
82 return (void*)_verify_byte_codes_fn;
83 }
84
85
86 // Methods in Verifier
87
88 bool Verifier::should_verify_for(oop class_loader, bool should_verify_class) {
89 return (class_loader == NULL || !should_verify_class) ?
90 BytecodeVerificationLocal : BytecodeVerificationRemote;
91 }
92
93 bool Verifier::relax_access_for(oop loader) {
94 bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
95 bool need_verify =
96 // verifyAll
97 (BytecodeVerificationLocal && BytecodeVerificationRemote) ||
98 // verifyRemote
99 (!BytecodeVerificationLocal && BytecodeVerificationRemote && !trusted);
|
52 #include "utilities/align.hpp"
53 #include "utilities/bytes.hpp"
54
55 #define NOFAILOVER_MAJOR_VERSION 51
56 #define NONZERO_PADDING_BYTES_IN_SWITCH_MAJOR_VERSION 51
57 #define STATIC_METHOD_IN_INTERFACE_MAJOR_VERSION 52
58 #define MAX_ARRAY_DIMENSIONS 255
59
60 // Access to external entry for VerifyClassCodes - old byte code verifier
61
62 extern "C" {
63 typedef jboolean (*verify_byte_codes_fn_t)(JNIEnv *, jclass, char *, jint);
64 typedef jboolean (*verify_byte_codes_fn_new_t)(JNIEnv *, jclass, char *, jint, jint);
65 }
66
67 static void* volatile _verify_byte_codes_fn = NULL;
68
69 static volatile jint _is_new_verify_byte_codes_fn = (jint) true;
70
71 static void* verify_byte_codes_fn() {
72 if (OrderAccess::load_acquire(&_verify_byte_codes_fn) == NULL) {
73 void *lib_handle = os::native_java_library();
74 void *func = os::dll_lookup(lib_handle, "VerifyClassCodesForMajorVersion");
75 OrderAccess::release_store(&_verify_byte_codes_fn, func);
76 if (func == NULL) {
77 _is_new_verify_byte_codes_fn = false;
78 func = os::dll_lookup(lib_handle, "VerifyClassCodes");
79 OrderAccess::release_store(&_verify_byte_codes_fn, func);
80 }
81 }
82 return (void*)_verify_byte_codes_fn;
83 }
84
85
86 // Methods in Verifier
87
88 bool Verifier::should_verify_for(oop class_loader, bool should_verify_class) {
89 return (class_loader == NULL || !should_verify_class) ?
90 BytecodeVerificationLocal : BytecodeVerificationRemote;
91 }
92
93 bool Verifier::relax_access_for(oop loader) {
94 bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
95 bool need_verify =
96 // verifyAll
97 (BytecodeVerificationLocal && BytecodeVerificationRemote) ||
98 // verifyRemote
99 (!BytecodeVerificationLocal && BytecodeVerificationRemote && !trusted);
|