Module Name: src Committed By: thorpej Date: Sun Nov 21 21:15:17 UTC 2021
Modified Files: src/sys/lib/libunwind: Registers.hpp Log Message: Teach the LLVM-derived unwinder about the DWARF pseudo-register defined by GCC for PPC32 to hold the return address where the signal trampoline will resume, as well as for the CTR and XER registers. To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sys/lib/libunwind/Registers.hpp Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/lib/libunwind/Registers.hpp diff -u src/sys/lib/libunwind/Registers.hpp:1.32 src/sys/lib/libunwind/Registers.hpp:1.33 --- src/sys/lib/libunwind/Registers.hpp:1.32 Sun Nov 21 10:53:01 2021 +++ src/sys/lib/libunwind/Registers.hpp Sun Nov 21 21:15:17 2021 @@ -148,8 +148,11 @@ enum { DWARF_PPC32_F0 = 32, DWARF_PPC32_F31 = 63, DWARF_PPC32_LR = 65, + DWARF_PPC32_CTR = 66, DWARF_PPC32_CR = 70, + DWARF_PPC32_XER = 76, DWARF_PPC32_V0 = 77, + DWARF_PPC32_SIGRETURN = 99, DWARF_PPC32_V31 = 108, REGNO_PPC32_R0 = 0, @@ -163,13 +166,17 @@ enum { REGNO_PPC32_F31 = REGNO_PPC32_F0 + 31, REGNO_PPC32_V0 = REGNO_PPC32_F31 + 1, REGNO_PPC32_V31 = REGNO_PPC32_V0 + 31, + + REGNO_PPC32_CTR = REGNO_PPC32_V31 + 1, + REGNO_PPC32_XER = REGNO_PPC32_CTR + 1, + REGNO_PPC32_SIGRETURN = REGNO_PPC32_XER + 1 }; class Registers_ppc32 { public: enum { - LAST_REGISTER = REGNO_PPC32_V31, - LAST_RESTORE_REG = REGNO_PPC32_V31, + LAST_REGISTER = REGNO_PPC32_SIGRETURN, + LAST_RESTORE_REG = REGNO_PPC32_SIGRETURN, RETURN_OFFSET = 0, RETURN_MASK = 0, }; @@ -188,23 +195,51 @@ public: return REGNO_PPC32_LR; case DWARF_PPC32_CR: return REGNO_PPC32_CR; + case DWARF_PPC32_CTR: + return REGNO_PPC32_CTR; + case DWARF_PPC32_XER: + return REGNO_PPC32_XER; + case DWARF_PPC32_SIGRETURN: + return REGNO_PPC32_SIGRETURN; default: return LAST_REGISTER + 1; } } bool validRegister(int num) const { - return num >= 0 && num <= LAST_RESTORE_REG; + return (num >= 0 && num <= REGNO_PPC32_SRR0) || + (num >= REGNO_PPC32_CTR && num <= REGNO_PPC32_SIGRETURN); } uint64_t getRegister(int num) const { assert(validRegister(num)); - return reg[num]; + switch (num) { + case REGNO_PPC32_CTR: + return ctr_reg; + case REGNO_PPC32_XER: + return xer_reg; + case REGNO_PPC32_SIGRETURN: + return sigreturn_reg; + default: + return reg[num]; + } } void setRegister(int num, uint64_t value) { assert(validRegister(num)); - reg[num] = value; + switch (num) { + case REGNO_PPC32_CTR: + ctr_reg = value; + break; + case REGNO_PPC32_XER: + xer_reg = value; + break; + case REGNO_PPC32_SIGRETURN: + sigreturn_reg = value; + break; + default: + reg[num] = value; + } } uint64_t getIP() const { return reg[REGNO_PPC32_SRR0]; } @@ -238,6 +273,9 @@ private: uint32_t dummy; uint64_t fpreg[32]; vecreg_t vecreg[64]; + uint32_t ctr_reg; + uint32_t xer_reg; + uint32_t sigreturn_reg; }; enum {