Module Name: src Committed By: joerg Date: Sat Sep 27 12:08:46 UTC 2014
Modified Files: src/sys/lib/libunwind: DwarfInstructions.hpp Registers.hpp Log Message: Introduce a separate bit mask for the return address. Use it on HPPA. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/lib/libunwind/DwarfInstructions.hpp cvs rdiff -u -r1.18 -r1.19 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/DwarfInstructions.hpp diff -u src/sys/lib/libunwind/DwarfInstructions.hpp:1.5 src/sys/lib/libunwind/DwarfInstructions.hpp:1.6 --- src/sys/lib/libunwind/DwarfInstructions.hpp:1.5 Sat Apr 26 23:17:38 2014 +++ src/sys/lib/libunwind/DwarfInstructions.hpp Sat Sep 27 12:08:46 2014 @@ -154,6 +154,9 @@ step_result DwarfInstructions<A, R>::ste // Therefore the SP is restored by setting it to the CFA. newRegisters.setSP(cfa); newRegisters.setIP(returnAddress + R::RETURN_OFFSET); + returnAddress += R::RETURN_OFFSET; + returnAddress &= ~R::RETURN_MASK; + newRegisters.setIP(returnAddress); // Now replace register set with the working copy. registers = newRegisters; Index: src/sys/lib/libunwind/Registers.hpp diff -u src/sys/lib/libunwind/Registers.hpp:1.18 src/sys/lib/libunwind/Registers.hpp:1.19 --- src/sys/lib/libunwind/Registers.hpp:1.18 Wed Sep 3 19:27:21 2014 +++ src/sys/lib/libunwind/Registers.hpp Sat Sep 27 12:08:46 2014 @@ -35,6 +35,7 @@ public: LAST_REGISTER = REGNO_X86_EIP, LAST_RESTORE_REG = REGNO_X86_EIP, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_x86(); @@ -100,6 +101,7 @@ public: LAST_REGISTER = REGNO_X86_64_RIP, LAST_RESTORE_REG = REGNO_X86_64_RIP, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_x86_64(); @@ -168,6 +170,7 @@ public: LAST_REGISTER = REGNO_PPC32_V31, LAST_RESTORE_REG = REGNO_PPC32_V31, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_ppc32(); @@ -258,6 +261,7 @@ public: LAST_RESTORE_REG = REGNO_AARCH64_V31, LAST_REGISTER = REGNO_AARCH64_V31, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_aarch64(); @@ -338,6 +342,7 @@ public: LAST_REGISTER = REGNO_ARM32_D31, LAST_RESTORE_REG = REGNO_ARM32_D31, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_arm32(); @@ -425,6 +430,7 @@ public: LAST_REGISTER = REGNO_VAX_PSW, LAST_RESTORE_REG = REGNO_VAX_PSW, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_vax(); @@ -496,6 +502,7 @@ public: LAST_REGISTER = REGNO_M68K_FP7, LAST_RESTORE_REG = REGNO_M68K_FP7, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_M68K(); @@ -572,6 +579,7 @@ public: LAST_REGISTER = REGNO_SH3_PR, LAST_RESTORE_REG = REGNO_SH3_PR, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_SH3(); @@ -636,6 +644,7 @@ public: LAST_REGISTER = REGNO_SPARC64_PC, LAST_RESTORE_REG = REGNO_SPARC64_PC, RETURN_OFFSET = 8, + RETURN_MASK = 0, }; typedef uint64_t reg_t; @@ -699,6 +708,7 @@ public: LAST_REGISTER = REGNO_SPARC_PC, LAST_RESTORE_REG = REGNO_SPARC_PC, RETURN_OFFSET = 8, + RETURN_MASK = 0, }; typedef uint32_t reg_t; @@ -764,6 +774,7 @@ public: LAST_REGISTER = REGNO_ALPHA_F30, LAST_RESTORE_REG = REGNO_ALPHA_F30, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; typedef uint32_t reg_t; @@ -830,7 +841,8 @@ public: enum { LAST_REGISTER = REGNO_HPPA_FR31H, LAST_RESTORE_REG = REGNO_HPPA_FR31H, - RETURN_OFFSET = -3, // strictly speaking, this is a mask + RETURN_OFFSET = 0, + RETURN_MASK = 3, }; __dso_hidden Registers_HPPA(); @@ -902,6 +914,7 @@ public: LAST_REGISTER = REGNO_MIPS_F31, LAST_RESTORE_REG = REGNO_MIPS_F31, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_MIPS(); @@ -973,6 +986,7 @@ public: LAST_REGISTER = REGNO_MIPS64_F31, LAST_RESTORE_REG = REGNO_MIPS64_F31, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_MIPS64(); @@ -1044,6 +1058,7 @@ public: LAST_REGISTER = REGNO_OR1K_FPCSR, LAST_RESTORE_REG = REGNO_OR1K_FPCSR, RETURN_OFFSET = 0, + RETURN_MASK = 0, }; __dso_hidden Registers_or1k();