comparison src/cpu/x86/vm/c1_Runtime1_x86.cpp @ 20702:b5eb829bbce1

8066900: Array Out Of Bounds Exception causes variable corruption Summary: Fix FP registers save/restore during exception handling Reviewed-by: kvn, vlivanov
author iveresov
date Tue, 09 Dec 2014 12:25:38 -0800
parents 55fb97c4c58d
children 7848fc12602b e8260b6328fb
comparison
equal deleted inserted replaced
20701:b6585ac86988 20702:b5eb829bbce1
673 __ movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD); 673 __ movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD);
674 break; 674 break;
675 case handle_exception_nofpu_id: 675 case handle_exception_nofpu_id:
676 case handle_exception_id: 676 case handle_exception_id:
677 // At this point all registers MAY be live. 677 // At this point all registers MAY be live.
678 oop_map = save_live_registers(sasm, 1 /*thread*/, id == handle_exception_nofpu_id); 678 oop_map = save_live_registers(sasm, 1 /*thread*/, id != handle_exception_nofpu_id);
679 break; 679 break;
680 case handle_exception_from_callee_id: { 680 case handle_exception_from_callee_id: {
681 // At this point all registers except exception oop (RAX) and 681 // At this point all registers except exception oop (RAX) and
682 // exception pc (RDX) are dead. 682 // exception pc (RDX) are dead.
683 const int frame_size = 2 /*BP, return address*/ NOT_LP64(+ 1 /*thread*/) WIN64_ONLY(+ frame::arg_reg_save_area_bytes / BytesPerWord); 683 const int frame_size = 2 /*BP, return address*/ NOT_LP64(+ 1 /*thread*/) WIN64_ONLY(+ frame::arg_reg_save_area_bytes / BytesPerWord);
746 switch (id) { 746 switch (id) {
747 case forward_exception_id: 747 case forward_exception_id:
748 case handle_exception_nofpu_id: 748 case handle_exception_nofpu_id:
749 case handle_exception_id: 749 case handle_exception_id:
750 // Restore the registers that were saved at the beginning. 750 // Restore the registers that were saved at the beginning.
751 restore_live_registers(sasm, id == handle_exception_nofpu_id); 751 restore_live_registers(sasm, id != handle_exception_nofpu_id);
752 break; 752 break;
753 case handle_exception_from_callee_id: 753 case handle_exception_from_callee_id:
754 // WIN64_ONLY: No need to add frame::arg_reg_save_area_bytes to SP 754 // WIN64_ONLY: No need to add frame::arg_reg_save_area_bytes to SP
755 // since we do a leave anyway. 755 // since we do a leave anyway.
756 756