Module Name:    src
Committed By:   thorpej
Date:           Mon Nov 22 16:40:01 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 AArch64 to hold the return address where the signal trampoline
will resume.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 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.34 src/sys/lib/libunwind/Registers.hpp:1.35
--- src/sys/lib/libunwind/Registers.hpp:1.34	Sun Nov 21 23:34:44 2021
+++ src/sys/lib/libunwind/Registers.hpp	Mon Nov 22 16:40:01 2021
@@ -284,19 +284,21 @@ enum {
   DWARF_AARCH64_SP = 31,
   DWARF_AARCH64_V0 = 64,
   DWARF_AARCH64_V31 = 95,
+  DWARF_AARCH64_SIGRETURN = 96,
 
   REGNO_AARCH64_X0 = 0,
   REGNO_AARCH64_X30 = 30,
   REGNO_AARCH64_SP = 31,
   REGNO_AARCH64_V0 = 32,
   REGNO_AARCH64_V31 = 63,
+  REGNO_AARCH64_SIGRETURN = 64,
 };
 
 class Registers_aarch64 {
 public:
   enum {
-    LAST_RESTORE_REG = REGNO_AARCH64_V31,
-    LAST_REGISTER = REGNO_AARCH64_V31,
+    LAST_RESTORE_REG = REGNO_AARCH64_SIGRETURN,
+    LAST_REGISTER = REGNO_AARCH64_SIGRETURN,
     RETURN_OFFSET = 0,
     RETURN_MASK = 0,
   };
@@ -310,21 +312,29 @@ public:
       return REGNO_AARCH64_SP;
     if (num >= DWARF_AARCH64_V0 && num <= DWARF_AARCH64_V31)
       return REGNO_AARCH64_V0 + (num - DWARF_AARCH64_V0);
+    if (num == DWARF_AARCH64_SIGRETURN)
+      return REGNO_AARCH64_SIGRETURN;
     return LAST_REGISTER + 1;
   }
 
   bool validRegister(int num) const {
-    return num >= 0 && num <= LAST_RESTORE_REG;
+    return (num >= DWARF_AARCH64_X0 && num <= DWARF_AARCH64_SP) ||
+	num == DWARF_AARCH64_SIGRETURN;
   }
 
   uint64_t getRegister(int num) const {
     assert(validRegister(num));
+    if (reg == REGNO_AARCH64_SIGRETURN)
+      return sigreturn_reg;
     return reg[num];
   }
 
   void setRegister(int num, uint64_t value) {
     assert(validRegister(num));
-    reg[num] = value;
+    if (reg == REGNO_AARCH64_SIGRETURN)
+      sigreturn_reg = value;
+    else
+      reg[num] = value;
   }
 
   uint64_t getIP() const { return reg[REGNO_AARCH64_X30]; }
@@ -349,6 +359,7 @@ public:
 private:
   uint64_t reg[REGNO_AARCH64_SP + 1];
   uint64_t vecreg[64];
+  uint64_t sigreturn_reg;
 };
 
 enum {

Reply via email to