27 #include "asm/macroAssembler.inline.hpp" 28 #include "ci/ciUtilities.hpp" 29 #include "gc/shared/barrierSet.hpp" 30 #include "gc/shared/barrierSetAssembler.hpp" 31 #include "interpreter/interpreter.hpp" 32 #include "nativeInst_x86.hpp" 33 #include "oops/instanceOop.hpp" 34 #include "oops/method.hpp" 35 #include "oops/objArrayKlass.hpp" 36 #include "oops/oop.inline.hpp" 37 #include "prims/methodHandles.hpp" 38 #include "runtime/frame.inline.hpp" 39 #include "runtime/handles.inline.hpp" 40 #include "runtime/sharedRuntime.hpp" 41 #include "runtime/stubCodeGenerator.hpp" 42 #include "runtime/stubRoutines.hpp" 43 #include "runtime/thread.inline.hpp" 44 #ifdef COMPILER2 45 #include "opto/runtime.hpp" 46 #endif 47 48 // Declaration and definition of StubGenerator (no .hpp file). 49 // For a more detailed description of the stub routine structure 50 // see the comment in stubRoutines.hpp 51 52 #define __ _masm-> 53 #define TIMES_OOP (UseCompressedOops ? Address::times_4 : Address::times_8) 54 #define a__ ((Assembler*)_masm)-> 55 56 #ifdef PRODUCT 57 #define BLOCK_COMMENT(str) /* nothing */ 58 #else 59 #define BLOCK_COMMENT(str) __ block_comment(str) 60 #endif 61 62 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":") 63 const int MXCSR_MASK = 0xFFC0; // Mask out any pending exceptions 64 65 // Stub Code definitions 66 1009 __ push(c_rarg2); 1010 __ push(c_rarg3); 1011 1012 enum { 1013 // After previous pushes. 1014 oop_to_verify = 6 * wordSize, 1015 saved_rax = 7 * wordSize, 1016 saved_r10 = 8 * wordSize, 1017 1018 // Before the call to MacroAssembler::debug(), see below. 1019 return_addr = 16 * wordSize, 1020 error_msg = 17 * wordSize 1021 }; 1022 1023 // get object 1024 __ movptr(rax, Address(rsp, oop_to_verify)); 1025 1026 // make sure object is 'reasonable' 1027 __ testptr(rax, rax); 1028 __ jcc(Assembler::zero, exit); // if obj is NULL it is OK 1029 // Check if the oop is in the right area of memory 1030 __ movptr(c_rarg2, rax); 1031 __ movptr(c_rarg3, (intptr_t) Universe::verify_oop_mask()); 1032 __ andptr(c_rarg2, c_rarg3); 1033 __ movptr(c_rarg3, (intptr_t) Universe::verify_oop_bits()); 1034 __ cmpptr(c_rarg2, c_rarg3); 1035 __ jcc(Assembler::notZero, error); 1036 1037 // set r12 to heapbase for load_klass() 1038 __ reinit_heapbase(); 1039 1040 // make sure klass is 'reasonable', which is not zero. 1041 __ load_klass(rax, rax); // get klass 1042 __ testptr(rax, rax); 1043 __ jcc(Assembler::zero, error); // if klass is NULL it is broken 1044 1045 // return if everything seems ok 1046 __ bind(exit); 1047 __ movptr(rax, Address(rsp, saved_rax)); // get saved rax back 1048 __ movptr(rscratch1, Address(rsp, saved_r10)); // get saved r10 back | 27 #include "asm/macroAssembler.inline.hpp" 28 #include "ci/ciUtilities.hpp" 29 #include "gc/shared/barrierSet.hpp" 30 #include "gc/shared/barrierSetAssembler.hpp" 31 #include "interpreter/interpreter.hpp" 32 #include "nativeInst_x86.hpp" 33 #include "oops/instanceOop.hpp" 34 #include "oops/method.hpp" 35 #include "oops/objArrayKlass.hpp" 36 #include "oops/oop.inline.hpp" 37 #include "prims/methodHandles.hpp" 38 #include "runtime/frame.inline.hpp" 39 #include "runtime/handles.inline.hpp" 40 #include "runtime/sharedRuntime.hpp" 41 #include "runtime/stubCodeGenerator.hpp" 42 #include "runtime/stubRoutines.hpp" 43 #include "runtime/thread.inline.hpp" 44 #ifdef COMPILER2 45 #include "opto/runtime.hpp" 46 #endif 47 #if INCLUDE_ZGC 48 #include "gc/z/zThreadLocalData.hpp" 49 #endif 50 51 // Declaration and definition of StubGenerator (no .hpp file). 52 // For a more detailed description of the stub routine structure 53 // see the comment in stubRoutines.hpp 54 55 #define __ _masm-> 56 #define TIMES_OOP (UseCompressedOops ? Address::times_4 : Address::times_8) 57 #define a__ ((Assembler*)_masm)-> 58 59 #ifdef PRODUCT 60 #define BLOCK_COMMENT(str) /* nothing */ 61 #else 62 #define BLOCK_COMMENT(str) __ block_comment(str) 63 #endif 64 65 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":") 66 const int MXCSR_MASK = 0xFFC0; // Mask out any pending exceptions 67 68 // Stub Code definitions 69 1012 __ push(c_rarg2); 1013 __ push(c_rarg3); 1014 1015 enum { 1016 // After previous pushes. 1017 oop_to_verify = 6 * wordSize, 1018 saved_rax = 7 * wordSize, 1019 saved_r10 = 8 * wordSize, 1020 1021 // Before the call to MacroAssembler::debug(), see below. 1022 return_addr = 16 * wordSize, 1023 error_msg = 17 * wordSize 1024 }; 1025 1026 // get object 1027 __ movptr(rax, Address(rsp, oop_to_verify)); 1028 1029 // make sure object is 'reasonable' 1030 __ testptr(rax, rax); 1031 __ jcc(Assembler::zero, exit); // if obj is NULL it is OK 1032 1033 #if INCLUDE_ZGC 1034 if (UseZGC) { 1035 // Check if metadata bits indicate a bad oop 1036 __ testptr(rax, Address(r15_thread, ZThreadLocalData::address_bad_mask_offset())); 1037 __ jcc(Assembler::notZero, error); 1038 } 1039 #endif 1040 1041 // Check if the oop is in the right area of memory 1042 __ movptr(c_rarg2, rax); 1043 __ movptr(c_rarg3, (intptr_t) Universe::verify_oop_mask()); 1044 __ andptr(c_rarg2, c_rarg3); 1045 __ movptr(c_rarg3, (intptr_t) Universe::verify_oop_bits()); 1046 __ cmpptr(c_rarg2, c_rarg3); 1047 __ jcc(Assembler::notZero, error); 1048 1049 // set r12 to heapbase for load_klass() 1050 __ reinit_heapbase(); 1051 1052 // make sure klass is 'reasonable', which is not zero. 1053 __ load_klass(rax, rax); // get klass 1054 __ testptr(rax, rax); 1055 __ jcc(Assembler::zero, error); // if klass is NULL it is broken 1056 1057 // return if everything seems ok 1058 __ bind(exit); 1059 __ movptr(rax, Address(rsp, saved_rax)); // get saved rax back 1060 __ movptr(rscratch1, Address(rsp, saved_r10)); // get saved r10 back |