| @@ -645,56 +645,76 @@ public: | | | @@ -645,56 +645,76 @@ public: |
645 | private: | | 645 | private: |
646 | typedef uint32_t fpreg_t[3]; | | 646 | typedef uint32_t fpreg_t[3]; |
647 | | | 647 | |
648 | uint32_t reg[REGNO_M68K_PC + 1]; | | 648 | uint32_t reg[REGNO_M68K_PC + 1]; |
649 | uint32_t dummy; | | 649 | uint32_t dummy; |
650 | fpreg_t fpreg[8]; | | 650 | fpreg_t fpreg[8]; |
651 | }; | | 651 | }; |
652 | | | 652 | |
653 | enum { | | 653 | enum { |
654 | DWARF_SH3_R0 = 0, | | 654 | DWARF_SH3_R0 = 0, |
655 | DWARF_SH3_R15 = 15, | | 655 | DWARF_SH3_R15 = 15, |
656 | DWARF_SH3_PC = 16, | | 656 | DWARF_SH3_PC = 16, |
657 | DWARF_SH3_PR = 17, | | 657 | DWARF_SH3_PR = 17, |
| | | 658 | DWARF_SH3_GBR = 18, |
| | | 659 | DWARF_SH3_MACH = 20, |
| | | 660 | DWARF_SH3_MACL = 21, |
| | | 661 | DWARF_SH3_SR = 22, |
658 | | | 662 | |
659 | REGNO_SH3_R0 = 0, | | 663 | REGNO_SH3_R0 = 0, |
660 | REGNO_SH3_R15 = 15, | | 664 | REGNO_SH3_R15 = 15, |
661 | REGNO_SH3_PC = 16, | | 665 | REGNO_SH3_PC = 16, |
662 | REGNO_SH3_PR = 17, | | 666 | REGNO_SH3_PR = 17, |
| | | 667 | REGNO_SH3_GBR = 18, |
| | | 668 | REGNO_SH3_MACH = 20, |
| | | 669 | REGNO_SH3_MACL = 21, |
| | | 670 | REGNO_SH3_SR = 22, |
663 | }; | | 671 | }; |
664 | | | 672 | |
665 | class Registers_SH3 { | | 673 | class Registers_SH3 { |
666 | public: | | 674 | public: |
667 | enum { | | 675 | enum { |
668 | LAST_REGISTER = REGNO_SH3_PR, | | 676 | LAST_REGISTER = REGNO_SH3_SR, |
669 | LAST_RESTORE_REG = REGNO_SH3_PR, | | 677 | LAST_RESTORE_REG = REGNO_SH3_SR, |
670 | RETURN_OFFSET = 0, | | 678 | RETURN_OFFSET = 0, |
671 | RETURN_MASK = 0, | | 679 | RETURN_MASK = 0, |
672 | }; | | 680 | }; |
673 | | | 681 | |
674 | __dso_hidden Registers_SH3(); | | 682 | __dso_hidden Registers_SH3(); |
675 | | | 683 | |
676 | static int dwarf2regno(int num) { | | 684 | static int dwarf2regno(int num) { |
677 | if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15) | | 685 | if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15) |
678 | return REGNO_SH3_R0 + (num - DWARF_SH3_R0); | | 686 | return REGNO_SH3_R0 + (num - DWARF_SH3_R0); |
679 | if (num == DWARF_SH3_PC) | | 687 | switch (num) { |
| | | 688 | case DWARF_SH3_PC: |
680 | return REGNO_SH3_PC; | | 689 | return REGNO_SH3_PC; |
681 | if (num == DWARF_SH3_PR) | | 690 | case DWARF_SH3_PR: |
682 | return REGNO_SH3_PR; | | 691 | return REGNO_SH3_PR; |
683 | return LAST_REGISTER + 1; | | 692 | case DWARF_SH3_GBR: |
| | | 693 | return REGNO_SH3_GBR; |
| | | 694 | case DWARF_SH3_MACH: |
| | | 695 | return REGNO_SH3_MACH; |
| | | 696 | case DWARF_SH3_MACL: |
| | | 697 | return REGNO_SH3_MACL; |
| | | 698 | case DWARF_SH3_SR: |
| | | 699 | return REGNO_SH3_SR; |
| | | 700 | default: |
| | | 701 | return LAST_REGISTER + 1; |
| | | 702 | } |
684 | } | | 703 | } |
685 | | | 704 | |
686 | bool validRegister(int num) const { | | 705 | bool validRegister(int num) const { |
687 | return num >= 0 && num <= REGNO_SH3_PR; | | 706 | return (num >= 0 && num <= REGNO_SH3_GBR) || |
| | | 707 | (num >= REGNO_SH3_MACH && num <= REGNO_SH3_SR); |
688 | } | | 708 | } |
689 | | | 709 | |
690 | uint64_t getRegister(int num) const { | | 710 | uint64_t getRegister(int num) const { |
691 | assert(validRegister(num)); | | 711 | assert(validRegister(num)); |
692 | return reg[num]; | | 712 | return reg[num]; |
693 | } | | 713 | } |
694 | | | 714 | |
695 | void setRegister(int num, uint64_t value) { | | 715 | void setRegister(int num, uint64_t value) { |
696 | assert(validRegister(num)); | | 716 | assert(validRegister(num)); |
697 | reg[num] = value; | | 717 | reg[num] = value; |
698 | } | | 718 | } |
699 | | | 719 | |
700 | uint64_t getIP() const { return reg[REGNO_SH3_PC]; } | | 720 | uint64_t getIP() const { return reg[REGNO_SH3_PC]; } |
| @@ -702,27 +722,27 @@ public: | | | @@ -702,27 +722,27 @@ public: |
702 | void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; } | | 722 | void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; } |
703 | | | 723 | |
704 | uint64_t getSP() const { return reg[REGNO_SH3_R15]; } | | 724 | uint64_t getSP() const { return reg[REGNO_SH3_R15]; } |
705 | | | 725 | |
706 | void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; } | | 726 | void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; } |
707 | | | 727 | |
708 | bool validFloatVectorRegister(int num) const { return false; } | | 728 | bool validFloatVectorRegister(int num) const { return false; } |
709 | | | 729 | |
710 | void copyFloatVectorRegister(int num, uint64_t addr_) {} | | 730 | void copyFloatVectorRegister(int num, uint64_t addr_) {} |
711 | | | 731 | |
712 | __dso_hidden void jumpto() const __dead; | | 732 | __dso_hidden void jumpto() const __dead; |
713 | | | 733 | |
714 | private: | | 734 | private: |
715 | uint32_t reg[REGNO_SH3_PR + 1]; | | 735 | uint32_t reg[REGNO_SH3_SR + 1]; |
716 | }; | | 736 | }; |
717 | | | 737 | |
718 | enum { | | 738 | enum { |
719 | DWARF_SPARC64_R0 = 0, | | 739 | DWARF_SPARC64_R0 = 0, |
720 | DWARF_SPARC64_R31 = 31, | | 740 | DWARF_SPARC64_R31 = 31, |
721 | DWARF_SPARC64_PC = 32, | | 741 | DWARF_SPARC64_PC = 32, |
722 | | | 742 | |
723 | REGNO_SPARC64_R0 = 0, | | 743 | REGNO_SPARC64_R0 = 0, |
724 | REGNO_SPARC64_R14 = 14, | | 744 | REGNO_SPARC64_R14 = 14, |
725 | REGNO_SPARC64_R15 = 15, | | 745 | REGNO_SPARC64_R15 = 15, |
726 | REGNO_SPARC64_R31 = 31, | | 746 | REGNO_SPARC64_R31 = 31, |
727 | REGNO_SPARC64_PC = 32, | | 747 | REGNO_SPARC64_PC = 32, |
728 | }; | | 748 | }; |