Module Name:    src
Committed By:   joerg
Date:           Tue Feb 23 15:09:27 UTC 2021

Modified Files:
        src/sys/lib/libunwind: Registers.hpp unwind_registers.S

Log Message:
Redo the aarch64 support in libunwind. This included a number of bugs
starting from returning the wrong value from the constructor to
completely bogus offset computations. Drop the ELR support for now.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/lib/libunwind/Registers.hpp
cvs rdiff -u -r1.17 -r1.18 src/sys/lib/libunwind/unwind_registers.S

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.20 src/sys/lib/libunwind/Registers.hpp:1.21
--- src/sys/lib/libunwind/Registers.hpp:1.20	Thu Jul 13 15:13:19 2017
+++ src/sys/lib/libunwind/Registers.hpp	Tue Feb 23 15:09:27 2021
@@ -244,16 +244,14 @@ enum {
   DWARF_AARCH64_X0 = 0,
   DWARF_AARCH64_X30 = 30,
   DWARF_AARCH64_SP = 31,
-  DWARF_AARCH64_ELR_MODE = 33,
   DWARF_AARCH64_V0 = 64,
   DWARF_AARCH64_V31 = 95,
 
   REGNO_AARCH64_X0 = 0,
   REGNO_AARCH64_X30 = 30,
   REGNO_AARCH64_SP = 31,
-  REGNO_AARCH64_ELR_MODE = 32,
-  REGNO_AARCH64_V0 = 33,
-  REGNO_AARCH64_V31 = 64,
+  REGNO_AARCH64_V0 = 32,
+  REGNO_AARCH64_V31 = 63,
 };
 
 class Registers_aarch64 {
@@ -272,8 +270,6 @@ public:
       return REGNO_AARCH64_X0 + (num - DWARF_AARCH64_X0);
     if (num == DWARF_AARCH64_SP)
       return REGNO_AARCH64_SP;
-    if (num == DWARF_AARCH64_ELR_MODE)
-      return REGNO_AARCH64_ELR_MODE;
     if (num >= DWARF_AARCH64_V0 && num <= DWARF_AARCH64_V31)
       return REGNO_AARCH64_V0 + (num - DWARF_AARCH64_V0);
     return LAST_REGISTER + 1;
@@ -307,17 +303,14 @@ public:
 
   void copyFloatVectorRegister(int num, uint64_t addr_) {
     const void *addr = reinterpret_cast<const void *>(addr_);
-    memcpy(vecreg + (num - REGNO_AARCH64_V0), addr, sizeof(vecreg[0]));
+    memcpy(vecreg + (num - REGNO_AARCH64_V0), addr, 16);
   }
 
   __dso_hidden void jumpto() const __dead;
 
 private:
-  struct vecreg_t {
-    uint64_t low, high;
-  };
-  uint64_t reg[REGNO_AARCH64_ELR_MODE + 1];
-  vecreg_t vecreg[32];
+  uint64_t reg[REGNO_AARCH64_SP + 1];
+  uint64_t vecreg[64];
 };
 
 enum {

Index: src/sys/lib/libunwind/unwind_registers.S
diff -u src/sys/lib/libunwind/unwind_registers.S:1.17 src/sys/lib/libunwind/unwind_registers.S:1.18
--- src/sys/lib/libunwind/unwind_registers.S:1.17	Mon May 25 18:41:08 2015
+++ src/sys/lib/libunwind/unwind_registers.S	Tue Feb 23 15:09:27 2021
@@ -272,68 +272,81 @@ ENTRY(_ZNK7_Unwind15Registers_ppc326jump
 #ifdef __aarch64__
 	.hidden _ZN7_Unwind17Registers_aarch64C1Ev
 ENTRY(_ZN7_Unwind17Registers_aarch64C1Ev)
-	stp	x0, x1, [x0]
-	add	x0, x0, #16
-	stp	x2, x3, [x0], #16
-	stp	x4, x5, [x0], #16
-	stp	x6, x7, [x0], #16
-	stp	x8, x9, [x0], #16
-	stp	x10, x11, [x0], #16
-	stp	x12, x13, [x0], #16
-	stp	x14, x15, [x0], #16
-	stp	x16, x17, [x0], #16
-	stp	x18, x19, [x0], #16
-	stp	x20, x22, [x0], #16
-	stp	x22, x24, [x0], #16
-	stp	x24, x26, [x0], #16
-	stp	x26, x27, [x0], #16
-	stp	x28, x29, [x0], #16
-	mov	x1, sp
-	stp	x30, x1,  [x0], #16
-
-	add	x0, x0, #8
-	str	xzr, [x0], #8
-
-	stp	q0, q1, [x0], #64
-	stp	q2, q3, [x0], #64
-	stp	q4, q5, [x0], #64
-	stp	q6, q7, [x0], #64
-	stp	q8, q9, [x0], #64
-	stp	q10, q11, [x0], #64
-	stp	q12, q13, [x0], #64
-	stp	q14, q15, [x0], #64
-	stp	q16, q17, [x0], #64
-	stp	q18, q19, [x0], #64
-	stp	q20, q21, [x0], #64
-	stp	q22, q23, [x0], #64
-	stp	q24, q25, [x0], #64
-	stp	q26, q27, [x0], #64
-	stp	q28, q29, [x0], #64
-	stp	q30, q31, [x0], #64
+	stp	x0, x1,  [x0, #0x000]
+	stp	x2, x3,  [x0, #0x010]
+	stp	x4, x5,  [x0, #0x020]
+	stp	x6, x7,  [x0, #0x030]
+	stp	x8, x9,  [x0, #0x040]
+	stp	x10,x11, [x0, #0x050]
+	stp	x12,x13, [x0, #0x060]
+	stp	x14,x15, [x0, #0x070]
+	stp	x16,x17, [x0, #0x080]
+	stp	x18,x19, [x0, #0x090]
+	stp	x20,x21, [x0, #0x0A0]
+	stp	x22,x23, [x0, #0x0B0]
+	stp	x24,x25, [x0, #0x0C0]
+	stp	x26,x27, [x0, #0x0D0]
+	stp	x28,x29, [x0, #0x0E0]
+	mov	x1,sp
+	stp	x30,x1,  [x0, #0x0F0]
+
+	stp	q0, q1,   [x0, #0x100]
+	stp	q2, q3,   [x0, #0x120]
+	stp	q4, q5,   [x0, #0x140]
+	stp	q6, q7,   [x0, #0x160]
+	stp	q8, q9,   [x0, #0x180]
+	stp	q10, q11, [x0, #0x1a0]
+	stp	q12, q13, [x0, #0x1c0]
+	stp	q14, q15, [x0, #0x1e0]
+	stp	q16, q17, [x0, #0x200]
+	stp	q18, q19, [x0, #0x220]
+	stp	q20, q21, [x0, #0x240]
+	stp	q22, q23, [x0, #0x260]
+	stp	q24, q25, [x0, #0x280]
+	stp	q26, q27, [x0, #0x2a0]
+	stp	q28, q29, [x0, #0x2c0]
+	stp	q30, q31, [x0, #0x2e0]
 
 	ret
 END(_ZN7_Unwind17Registers_aarch64C1Ev)
 
 	.hidden _ZNK7_Unwind17Registers_aarch646jumptoEv
 ENTRY(_ZNK7_Unwind17Registers_aarch646jumptoEv)
-	ldp	x2, x3, [x0, #16]
-	ldp	x4, x6, [x0, #32]
-	ldp	x6, x7, [x0, #48]
-	ldp	x8, x9, [x0, #64]
-	ldp	x10, x11, [x0, #80]
-	ldp	x12, x13, [x0, #96]
-	ldp	x14, x16, [x0, #112]
-	ldp	x16, x17, [x0, #128]
-	ldp	x18, x19, [x0, #144]
-	ldp	x20, x21, [x0, #160]
-	ldp	x22, x23, [x0, #176]
-	ldp	x24, x26, [x0, #192]
-	ldp	x26, x27, [x0, #208]
-	ldp	x28, x29, [x0, #224]
-	ldp	x30, x1, [x0, #240]
-	mov	sp, x1
+	ldp    x2, x3,   [x0, #0x010]
+	ldp    x4, x5,   [x0, #0x020]
+	ldp    x6, x7,   [x0, #0x030]
+	ldp    x8, x9,   [x0, #0x040]
+	ldp    x10, x11, [x0, #0x050]
+	ldp    x12, x13, [x0, #0x060]
+	ldp    x14, x15, [x0, #0x070]
+	ldp    x16, x17, [x0, #0x080]
+	ldp    x18, x19, [x0, #0x090]
+	ldp    x20, x21, [x0, #0x0A0]
+	ldp    x22, x23, [x0, #0x0B0]
+	ldp    x24, x25, [x0, #0x0C0]
+	ldp    x26, x27, [x0, #0x0D0]
+	ldp    x28, x29, [x0, #0x0E0]
+	ldp    x30, x1,  [x0, #0x0F0]
+	mov    sp, x1
+
+	ldp	q0, q1,   [x0, #0x100]
+	ldp	q2, q3,   [x0, #0x120]
+	ldp	q4, q5,   [x0, #0x140]
+	ldp	q6, q7,   [x0, #0x160]
+	ldp	q8, q9,   [x0, #0x180]
+	ldp	q10, q11, [x0, #0x1a0]
+	ldp	q12, q13, [x0, #0x1c0]
+	ldp	q14, q15, [x0, #0x1e0]
+	ldp	q16, q17, [x0, #0x200]
+	ldp	q18, q19, [x0, #0x220]
+	ldp	q20, q21, [x0, #0x240]
+	ldp	q22, q23, [x0, #0x260]
+	ldp	q24, q25, [x0, #0x280]
+	ldp	q26, q27, [x0, #0x2a0]
+	ldp	q28, q29, [x0, #0x2c0]
+	ldp	q30, q31, [x0, #0x2e0]
 
-	ldp	x0, x1, [x0, #0]
+	ldp    x0, x1,  [x0, #0x000]
 	ret
 END(_ZNK7_Unwind17Registers_aarch646jumptoEv)
 #endif /* __aarch64__ */

Reply via email to