716 void os::print_context(outputStream *st, void *context) { |
716 void os::print_context(outputStream *st, void *context) { |
717 if (context == NULL) return; |
717 if (context == NULL) return; |
718 |
718 |
719 ucontext_t *uc = (ucontext_t*)context; |
719 ucontext_t *uc = (ucontext_t*)context; |
720 st->print_cr("Registers:"); |
720 st->print_cr("Registers:"); |
721 |
|
722 // this is horrendously verbose but the layout of the registers in the |
|
723 // context does not match how we defined our abstract Register set, so |
|
724 // we can't just iterate through the gregs area |
|
725 |
|
726 #ifdef AMD64 |
721 #ifdef AMD64 |
727 st->print( "RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]); |
722 st->print( "RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]); |
728 st->print(", RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]); |
723 st->print(", RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]); |
729 st->print(", RCX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RCX]); |
724 st->print(", RCX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RCX]); |
730 st->print(", RDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDX]); |
725 st->print(", RDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDX]); |
743 st->print(", R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]); |
738 st->print(", R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]); |
744 st->print(", R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]); |
739 st->print(", R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]); |
745 st->print(", R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]); |
740 st->print(", R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]); |
746 st->cr(); |
741 st->cr(); |
747 st->print( "RIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RIP]); |
742 st->print( "RIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RIP]); |
748 st->print(", EFL=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]); |
743 st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]); |
749 st->print(", CSGSFS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_CSGSFS]); |
744 st->print(", CSGSFS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_CSGSFS]); |
750 st->print(", ERR=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ERR]); |
745 st->print(", ERR=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ERR]); |
751 st->cr(); |
746 st->cr(); |
752 st->print(" TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]); |
747 st->print(" TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]); |
753 |
|
754 st->cr(); |
|
755 st->cr(); |
|
756 |
|
757 st->print_cr("Register to memory mapping:"); |
|
758 st->cr(); |
|
759 |
|
760 // this is only for the "general purpose" registers |
|
761 |
|
762 st->print_cr("RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]); |
|
763 print_location(st, uc->uc_mcontext.gregs[REG_RAX]); |
|
764 st->cr(); |
|
765 st->print_cr("RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]); |
|
766 print_location(st, uc->uc_mcontext.gregs[REG_RBX]); |
|
767 st->cr(); |
|
768 st->print_cr("RCX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RCX]); |
|
769 print_location(st, uc->uc_mcontext.gregs[REG_RCX]); |
|
770 st->cr(); |
|
771 st->print_cr("RDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDX]); |
|
772 print_location(st, uc->uc_mcontext.gregs[REG_RDX]); |
|
773 st->cr(); |
|
774 st->print_cr("RSP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSP]); |
|
775 print_location(st, uc->uc_mcontext.gregs[REG_RSP]); |
|
776 st->cr(); |
|
777 st->print_cr("RBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBP]); |
|
778 print_location(st, uc->uc_mcontext.gregs[REG_RBP]); |
|
779 st->cr(); |
|
780 st->print_cr("RSI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSI]); |
|
781 print_location(st, uc->uc_mcontext.gregs[REG_RSI]); |
|
782 st->cr(); |
|
783 st->print_cr("RDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDI]); |
|
784 print_location(st, uc->uc_mcontext.gregs[REG_RDI]); |
|
785 st->cr(); |
|
786 st->print_cr("R8 =" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R8]); |
|
787 print_location(st, uc->uc_mcontext.gregs[REG_R8]); |
|
788 st->cr(); |
|
789 st->print_cr("R9 =" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R9]); |
|
790 print_location(st, uc->uc_mcontext.gregs[REG_R9]); |
|
791 st->cr(); |
|
792 st->print_cr("R10=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R10]); |
|
793 print_location(st, uc->uc_mcontext.gregs[REG_R10]); |
|
794 st->cr(); |
|
795 st->print_cr("R11=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R11]); |
|
796 print_location(st, uc->uc_mcontext.gregs[REG_R11]); |
|
797 st->cr(); |
|
798 st->print_cr("R12=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R12]); |
|
799 print_location(st, uc->uc_mcontext.gregs[REG_R12]); |
|
800 st->cr(); |
|
801 st->print_cr("R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]); |
|
802 print_location(st, uc->uc_mcontext.gregs[REG_R13]); |
|
803 st->cr(); |
|
804 st->print_cr("R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]); |
|
805 print_location(st, uc->uc_mcontext.gregs[REG_R14]); |
|
806 st->cr(); |
|
807 st->print_cr("R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]); |
|
808 print_location(st, uc->uc_mcontext.gregs[REG_R15]); |
|
809 |
|
810 #else |
748 #else |
811 st->print( "EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]); |
749 st->print( "EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]); |
812 st->print(", EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]); |
750 st->print(", EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]); |
813 st->print(", ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]); |
751 st->print(", ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]); |
814 st->print(", EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]); |
752 st->print(", EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]); |
817 st->print(", EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]); |
755 st->print(", EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]); |
818 st->print(", ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]); |
756 st->print(", ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]); |
819 st->print(", EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]); |
757 st->print(", EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]); |
820 st->cr(); |
758 st->cr(); |
821 st->print( "EIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EIP]); |
759 st->print( "EIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EIP]); |
|
760 st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]); |
822 st->print(", CR2=" INTPTR_FORMAT, uc->uc_mcontext.cr2); |
761 st->print(", CR2=" INTPTR_FORMAT, uc->uc_mcontext.cr2); |
823 st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]); |
|
824 |
|
825 st->cr(); |
|
826 st->cr(); |
|
827 |
|
828 st->print_cr("Register to memory mapping:"); |
|
829 st->cr(); |
|
830 |
|
831 // this is only for the "general purpose" registers |
|
832 |
|
833 st->print_cr("EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]); |
|
834 print_location(st, uc->uc_mcontext.gregs[REG_EAX]); |
|
835 st->cr(); |
|
836 st->print_cr("EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]); |
|
837 print_location(st, uc->uc_mcontext.gregs[REG_EBX]); |
|
838 st->cr(); |
|
839 st->print_cr("ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]); |
|
840 print_location(st, uc->uc_mcontext.gregs[REG_ECX]); |
|
841 st->cr(); |
|
842 st->print_cr("EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]); |
|
843 print_location(st, uc->uc_mcontext.gregs[REG_EDX]); |
|
844 st->cr(); |
|
845 st->print_cr("ESP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESP]); |
|
846 print_location(st, uc->uc_mcontext.gregs[REG_ESP]); |
|
847 st->cr(); |
|
848 st->print_cr("EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]); |
|
849 print_location(st, uc->uc_mcontext.gregs[REG_EBP]); |
|
850 st->cr(); |
|
851 st->print_cr("ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]); |
|
852 print_location(st, uc->uc_mcontext.gregs[REG_ESI]); |
|
853 st->cr(); |
|
854 st->print_cr("EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]); |
|
855 print_location(st, uc->uc_mcontext.gregs[REG_EDI]); |
|
856 |
|
857 #endif // AMD64 |
762 #endif // AMD64 |
858 st->cr(); |
763 st->cr(); |
859 st->cr(); |
764 st->cr(); |
860 |
765 |
861 intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc); |
766 intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc); |
866 // Note: it may be unsafe to inspect memory near pc. For example, pc may |
771 // Note: it may be unsafe to inspect memory near pc. For example, pc may |
867 // point to garbage if entry point in an nmethod is corrupted. Leave |
772 // point to garbage if entry point in an nmethod is corrupted. Leave |
868 // this at the end, and hope for the best. |
773 // this at the end, and hope for the best. |
869 address pc = os::Linux::ucontext_get_pc(uc); |
774 address pc = os::Linux::ucontext_get_pc(uc); |
870 st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc); |
775 st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc); |
871 print_hex_dump(st, pc - 16, pc + 16, sizeof(char)); |
776 print_hex_dump(st, pc - 32, pc + 32, sizeof(char)); |
|
777 } |
|
778 |
|
779 void os::print_register_info(outputStream *st, void *context) { |
|
780 if (context == NULL) return; |
|
781 |
|
782 ucontext_t *uc = (ucontext_t*)context; |
|
783 |
|
784 st->print_cr("Register to memory mapping:"); |
|
785 st->cr(); |
|
786 |
|
787 // this is horrendously verbose but the layout of the registers in the |
|
788 // context does not match how we defined our abstract Register set, so |
|
789 // we can't just iterate through the gregs area |
|
790 |
|
791 // this is only for the "general purpose" registers |
|
792 |
|
793 #ifdef AMD64 |
|
794 st->print("RAX="); print_location(st, uc->uc_mcontext.gregs[REG_RAX]); |
|
795 st->print("RBX="); print_location(st, uc->uc_mcontext.gregs[REG_RBX]); |
|
796 st->print("RCX="); print_location(st, uc->uc_mcontext.gregs[REG_RCX]); |
|
797 st->print("RDX="); print_location(st, uc->uc_mcontext.gregs[REG_RDX]); |
|
798 st->print("RSP="); print_location(st, uc->uc_mcontext.gregs[REG_RSP]); |
|
799 st->print("RBP="); print_location(st, uc->uc_mcontext.gregs[REG_RBP]); |
|
800 st->print("RSI="); print_location(st, uc->uc_mcontext.gregs[REG_RSI]); |
|
801 st->print("RDI="); print_location(st, uc->uc_mcontext.gregs[REG_RDI]); |
|
802 st->print("R8 ="); print_location(st, uc->uc_mcontext.gregs[REG_R8]); |
|
803 st->print("R9 ="); print_location(st, uc->uc_mcontext.gregs[REG_R9]); |
|
804 st->print("R10="); print_location(st, uc->uc_mcontext.gregs[REG_R10]); |
|
805 st->print("R11="); print_location(st, uc->uc_mcontext.gregs[REG_R11]); |
|
806 st->print("R12="); print_location(st, uc->uc_mcontext.gregs[REG_R12]); |
|
807 st->print("R13="); print_location(st, uc->uc_mcontext.gregs[REG_R13]); |
|
808 st->print("R14="); print_location(st, uc->uc_mcontext.gregs[REG_R14]); |
|
809 st->print("R15="); print_location(st, uc->uc_mcontext.gregs[REG_R15]); |
|
810 #else |
|
811 st->print("EAX="); print_location(st, uc->uc_mcontext.gregs[REG_EAX]); |
|
812 st->print("EBX="); print_location(st, uc->uc_mcontext.gregs[REG_EBX]); |
|
813 st->print("ECX="); print_location(st, uc->uc_mcontext.gregs[REG_ECX]); |
|
814 st->print("EDX="); print_location(st, uc->uc_mcontext.gregs[REG_EDX]); |
|
815 st->print("ESP="); print_location(st, uc->uc_mcontext.gregs[REG_ESP]); |
|
816 st->print("EBP="); print_location(st, uc->uc_mcontext.gregs[REG_EBP]); |
|
817 st->print("ESI="); print_location(st, uc->uc_mcontext.gregs[REG_ESI]); |
|
818 st->print("EDI="); print_location(st, uc->uc_mcontext.gregs[REG_EDI]); |
|
819 #endif // AMD64 |
|
820 |
|
821 st->cr(); |
872 } |
822 } |
873 |
823 |
874 void os::setup_fpu() { |
824 void os::setup_fpu() { |
875 #ifndef AMD64 |
825 #ifndef AMD64 |
876 address fpu_cntrl = StubRoutines::addr_fpu_cntrl_wrd_std(); |
826 address fpu_cntrl = StubRoutines::addr_fpu_cntrl_wrd_std(); |