Module Name:    src
Committed By:   joerg
Date:           Wed Mar 12 00:01:12 UTC 2014

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

Log Message:
Add a dummy element as explicit padding for PPC32. Fix DWARF enumeration
to match the values created by GCC. Fix DWARFish -> index conversion.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/lib/libunwind/Registers.hpp
cvs rdiff -u -r1.2 -r1.3 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.3 src/sys/lib/libunwind/Registers.hpp:1.4
--- src/sys/lib/libunwind/Registers.hpp:1.3	Tue Mar 11 23:57:42 2014
+++ src/sys/lib/libunwind/Registers.hpp	Wed Mar 12 00:01:12 2014
@@ -144,19 +144,18 @@ enum {
   DWARF_PPC32_R31 = 31,
   DWARF_PPC32_F0 = 32,
   DWARF_PPC32_F31 = 63,
-  DWARF_PPC32_V0 = 1124,
-  DWARF_PPC32_V31 = 1155,
   DWARF_PPC32_LR = 65,
-  DWARF_PPC32_CTR = 66,
-  DWARF_PPC32_XER = 76,
+  DWARF_PPC32_CR = 70,
+  DWARF_PPC32_V0 = 77,
+  DWARF_PPC32_V31 = 108,
+
   REGNO_PPC32_R0 = 0,
-  REGNO_PPC32_R1 = 0,
+  REGNO_PPC32_R1 = 1,
   REGNO_PPC32_R31 = 31,
-  REGNO_PPC32_CR = 32,
-  REGNO_PPC32_LR = 33,
-  REGNO_PPC32_CTR = 34,
-  REGNO_PPC32_XER = 35,
-  REGNO_PPC32_SRR0 = 36,
+  REGNO_PPC32_LR = 32,
+  REGNO_PPC32_CR = 33,
+  REGNO_PPC32_SRR0 = 34,
+
   REGNO_PPC32_F0 = REGNO_PPC32_SRR0 + 1,
   REGNO_PPC32_F31 = REGNO_PPC32_F0 + 31,
   REGNO_PPC32_V0 = REGNO_PPC32_F31 + 1,
@@ -180,7 +179,14 @@ public:
       return REGNO_PPC32_F0 + (num - DWARF_PPC32_F0);
     if (num >= DWARF_PPC32_V0 && num <= DWARF_PPC32_V31)
       return REGNO_PPC32_V0 + (num - DWARF_PPC32_V0);
-    return LAST_REGISTER + 1;
+    switch (num) {
+    case DWARF_PPC32_LR:
+      return REGNO_PPC32_LR;
+    case DWARF_PPC32_CR:
+      return REGNO_PPC32_CR;
+    default:
+      return LAST_REGISTER + 1;
+    }
   }
 
   bool validRegister(int num) const {
@@ -225,6 +231,7 @@ private:
     uint64_t low, high;
   };
   uint32_t reg[REGNO_PPC32_SRR0 + 1];
+  uint32_t dummy;
   uint64_t fpreg[32];
   vecreg_t vecreg[64];
 };

Index: src/sys/lib/libunwind/unwind_registers.S
diff -u src/sys/lib/libunwind/unwind_registers.S:1.2 src/sys/lib/libunwind/unwind_registers.S:1.3
--- src/sys/lib/libunwind/unwind_registers.S:1.2	Wed Jan 29 06:59:53 2014
+++ src/sys/lib/libunwind/unwind_registers.S	Wed Mar 12 00:01:12 2014
@@ -116,6 +116,7 @@ ENTRY(_ZNK7_Unwind16Registers_x86_646jum
 #ifdef __powerpc__
 	.hidden _ZN7_Unwind15Registers_ppc32C1Ev
 ENTRY(_ZN7_Unwind15Registers_ppc32C1Ev)
+	/* TODO: skip non-callee-safe registers */
 	stw		 %r0,  0(%r3)
 	stw		 %r1,  4(%r3)
 	stw		 %r2,  8(%r3)
@@ -148,21 +149,82 @@ ENTRY(_ZN7_Unwind15Registers_ppc32C1Ev)
 	stw		%r29,116(%r3)
 	stw		%r30,120(%r3)
 	stw		%r31,124(%r3)
-
-	mfcr		%r0
-	stw		%r0, 128(%r3) /* CR */
 	mflr		%r0
-	stw		%r0, 132(%r3) /* LR */
-	stw		%r0, 144(%r3) /* LR */
-	mfctr		%r0
-	stw		%r0, 136(%r3) /* CTR */
-	mfxer		%r0
-	stw		%r0, 140(%r3) /*  XER */
+	stw		%r0, 136(%r3) /* SRR0 */
+	mfcr		%r0
+	stw		%r0, 132(%r3) /* CR */
+
+	stfd		 %f0, 144(%r3)
+	stfd		 %f1, 152(%r3)
+	stfd		 %f2, 160(%r3)
+	stfd		 %f3, 168(%r3)
+	stfd		 %f4, 176(%r3)
+	stfd		 %f5, 184(%r3)
+	stfd		 %f6, 192(%r3)
+	stfd		 %f7, 200(%r3)
+	stfd		 %f8, 208(%r3)
+	stfd		 %f9, 216(%r3)
+	stfd		%f10, 224(%r3)
+	stfd		%f11, 232(%r3)
+	stfd		%f12, 240(%r3)
+	stfd		%f13, 248(%r3)
+	stfd		%f14, 256(%r3)
+	stfd		%f15, 264(%r3)
+	stfd		%f16, 272(%r3)
+	stfd		%f17, 280(%r3)
+	stfd		%f18, 288(%r3)
+	stfd		%f19, 296(%r3)
+	stfd		%f20, 304(%r3)
+	stfd		%f21, 312(%r3)
+	stfd		%f22, 320(%r3)
+	stfd		%f23, 328(%r3)
+	stfd		%f24, 336(%r3)
+	stfd		%f25, 344(%r3)
+	stfd		%f26, 352(%r3)
+	stfd		%f27, 360(%r3)
+	stfd		%f28, 368(%r3)
+	stfd		%f29, 376(%r3)
+	stfd		%f30, 384(%r3)
+	stfd		%f31, 392(%r3)
 
+	/* LR is undefined */
 	blr
 
 	.hidden _ZNK7_Unwind15Registers_ppc326jumptoEv
 ENTRY(_ZNK7_Unwind15Registers_ppc326jumptoEv)
+	lfd		 %f0, 144(%r3)
+	lfd		 %f1, 152(%r3)
+	lfd		 %f2, 160(%r3)
+	lfd		 %f3, 168(%r3)
+	lfd		 %f4, 176(%r3)
+	lfd		 %f5, 184(%r3)
+	lfd		 %f6, 192(%r3)
+	lfd		 %f7, 200(%r3)
+	lfd		 %f8, 208(%r3)
+	lfd		 %f9, 216(%r3)
+	lfd		%f10, 224(%r3)
+	lfd		%f11, 232(%r3)
+	lfd		%f12, 240(%r3)
+	lfd		%f13, 248(%r3)
+	lfd		%f14, 256(%r3)
+	lfd		%f15, 264(%r3)
+	lfd		%f16, 272(%r3)
+	lfd		%f17, 280(%r3)
+	lfd		%f18, 288(%r3)
+	lfd		%f19, 296(%r3)
+	lfd		%f20, 304(%r3)
+	lfd		%f21, 312(%r3)
+	lfd		%f22, 320(%r3)
+	lfd		%f23, 328(%r3)
+	lfd		%f24, 336(%r3)
+	lfd		%f25, 344(%r3)
+	lfd		%f26, 352(%r3)
+	lfd		%f27, 360(%r3)
+	lfd		%f28, 368(%r3)
+	lfd		%f29, 376(%r3)
+	lfd		%f30, 384(%r3)
+	lfd		%f31, 392(%r3)
+
 	lwz		 %r2, 8(%r3)
 	/* skip r3 for now */
 	lwz		 %r4, 16(%r3)
@@ -194,20 +256,16 @@ ENTRY(_ZNK7_Unwind15Registers_ppc326jump
 	lwz		%r30,120(%r3)
 	lwz		%r31,124(%r3)
 
-	lwz		%r0, 128(%r3) /* CR */
-	mtcr		%r0
-	lwz		%r0, 132(%r3) /* LR */
+	lwz		%r0, 128(%r3) /* LR */
 	mtlr		%r0
-	lwz		%r0, 136(%r3) /* CTR */
-	mtctr		%r0
-	lwz		%r0, 140(%r3) /*  XER */
-	mtxer		%r0
-	lwz		%r0, 144(%r3) /* SRR0 ? */
+	lwz		%r0, 132(%r3) /* CR */
+	mtcr		%r0
+	lwz		%r0, 136(%r3) /* SRR0 */
 	mtctr		%r0
 
-	lwz		%r0, 0(%r3)   /* do r0 now */
-	lwz		%r1,4(%r3)    /* do sp now */
-	lwz		%r3,12(%r3)   /* do r3 last */
+	lwz		%r0,  0(%r3)   /* do r0 now */
+	lwz		%r1,  4(%r3)   /* do sp now */
+	lwz		%r3, 12(%r3)   /* do r3 last */
 	bctr
 #endif
 

Reply via email to