803 const Register ret_addr = Rtmp_save1; // R5/R20
804 assert_different_registers(oop, klass, tmp1, tmp2, flags, ret_addr, R7);
805
806 Label exit, error;
807 InlinedAddress verify_oop_count((address) StubRoutines::verify_oop_count_addr());
808
809 __ mrs(Assembler::CPSR, flags);
810
811 __ ldr_literal(tmp1, verify_oop_count);
812 __ ldr_s32(tmp2, Address(tmp1));
813 __ add(tmp2, tmp2, 1);
814 __ str_32(tmp2, Address(tmp1));
815
816 // make sure object is 'reasonable'
817 __ cbz(oop, exit); // if obj is NULL it is ok
818
819 // Check if the oop is in the right area of memory
820 // Note: oop_mask and oop_bits must be updated if the code is saved/reused
821 const address oop_mask = (address) Universe::verify_oop_mask();
822 const address oop_bits = (address) Universe::verify_oop_bits();
823 __ mov_address(tmp1, oop_mask, symbolic_Relocation::oop_mask_reference);
824 __ andr(tmp2, oop, tmp1);
825 __ mov_address(tmp1, oop_bits, symbolic_Relocation::oop_bits_reference);
826 __ cmp(tmp2, tmp1);
827 __ b(error, ne);
828
829 // make sure klass is 'reasonable'
830 __ load_klass(klass, oop); // get klass
831 __ cbz(klass, error); // if klass is NULL it is broken
832
833 // return if everything seems ok
834 __ bind(exit);
835
836 __ msr(Assembler::CPSR_f, flags);
837
838 __ ret();
839
840 // handle errors
841 __ bind(error);
842
843 __ mov(ret_addr, LR); // save return address
844
845 // R0: error message
|
803 const Register ret_addr = Rtmp_save1; // R5/R20
804 assert_different_registers(oop, klass, tmp1, tmp2, flags, ret_addr, R7);
805
806 Label exit, error;
807 InlinedAddress verify_oop_count((address) StubRoutines::verify_oop_count_addr());
808
809 __ mrs(Assembler::CPSR, flags);
810
811 __ ldr_literal(tmp1, verify_oop_count);
812 __ ldr_s32(tmp2, Address(tmp1));
813 __ add(tmp2, tmp2, 1);
814 __ str_32(tmp2, Address(tmp1));
815
816 // make sure object is 'reasonable'
817 __ cbz(oop, exit); // if obj is NULL it is ok
818
819 // Check if the oop is in the right area of memory
820 // Note: oop_mask and oop_bits must be updated if the code is saved/reused
821 const address oop_mask = (address) Universe::verify_oop_mask();
822 const address oop_bits = (address) Universe::verify_oop_bits();
823 __ mov_address(tmp1, oop_mask);
824 __ andr(tmp2, oop, tmp1);
825 __ mov_address(tmp1, oop_bits);
826 __ cmp(tmp2, tmp1);
827 __ b(error, ne);
828
829 // make sure klass is 'reasonable'
830 __ load_klass(klass, oop); // get klass
831 __ cbz(klass, error); // if klass is NULL it is broken
832
833 // return if everything seems ok
834 __ bind(exit);
835
836 __ msr(Assembler::CPSR_f, flags);
837
838 __ ret();
839
840 // handle errors
841 __ bind(error);
842
843 __ mov(ret_addr, LR); // save return address
844
845 // R0: error message
|