Module Name:    src
Committed By:   matt
Date:           Wed Sep  3 19:27:22 UTC 2014

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

Log Message:
Add OR1K support


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/lib/libunwind/Registers.hpp
cvs rdiff -u -r1.15 -r1.16 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.17 src/sys/lib/libunwind/Registers.hpp:1.18
--- src/sys/lib/libunwind/Registers.hpp:1.17	Sun Aug 10 05:57:31 2014
+++ src/sys/lib/libunwind/Registers.hpp	Wed Sep  3 19:27:21 2014
@@ -1024,6 +1024,73 @@ private:
   uint64_t fpreg[32];
 };
 
+enum {
+  DWARF_OR1K_R0 = 0,
+  DWARF_OR1K_SP = 1,
+  DWARF_OR1K_LR = 9,
+  DWARF_OR1K_R31 = 31,
+  DWARF_OR1K_FPCSR = 32,
+
+  REGNO_OR1K_R0 = 0,
+  REGNO_OR1K_SP = 1,
+  REGNO_OR1K_LR = 9,
+  REGNO_OR1K_R31 = 31,
+  REGNO_OR1K_FPCSR = 32,
+};
+
+class Registers_or1k {
+public:
+  enum {
+    LAST_REGISTER = REGNO_OR1K_FPCSR,
+    LAST_RESTORE_REG = REGNO_OR1K_FPCSR,
+    RETURN_OFFSET = 0,
+  };
+
+  __dso_hidden Registers_or1k();
+
+  static int dwarf2regno(int num) {
+    if (num >= DWARF_OR1K_R0 && num <= DWARF_OR1K_R31)
+      return REGNO_OR1K_R0 + (num - DWARF_OR1K_R0);
+    if (num == DWARF_OR1K_FPCSR)
+      return REGNO_OR1K_FPCSR;
+    return LAST_REGISTER + 1;
+  }
+
+  bool validRegister(int num) const {
+    return num >= 0 && num <= LAST_RESTORE_REG;
+  }
+
+  uint64_t getRegister(int num) const {
+    assert(validRegister(num));
+    return reg[num];
+  }
+
+  void setRegister(int num, uint64_t value) {
+    assert(validRegister(num));
+    reg[num] = value;
+  }
+
+  uint64_t getIP() const { return reg[REGNO_OR1K_LR]; }
+
+  void setIP(uint64_t value) { reg[REGNO_OR1K_LR] = value; }
+
+  uint64_t getSP() const { return reg[REGNO_OR1K_SP]; }
+
+  void setSP(uint64_t value) { reg[REGNO_OR1K_SP] = value; }
+
+  bool validFloatVectorRegister(int num) const {
+    return false;
+  }
+
+  void copyFloatVectorRegister(int num, uint64_t addr_) {
+  }
+
+  __dso_hidden void jumpto() const __dead;
+
+private:
+  uint32_t reg[REGNO_OR1K_FPCSR + 1];
+};
+
 #if __i386__
 typedef Registers_x86 NativeUnwindRegisters;
 #elif __x86_64__
@@ -1052,6 +1119,8 @@ typedef Registers_SPARC NativeUnwindRegi
 typedef Registers_Alpha NativeUnwindRegisters;
 #elif __hppa__
 typedef Registers_HPPA NativeUnwindRegisters;
+#elif __or1k__
+typedef Registers_or1k NativeUnwindRegisters;
 #endif
 } // namespace _Unwind
 

Index: src/sys/lib/libunwind/unwind_registers.S
diff -u src/sys/lib/libunwind/unwind_registers.S:1.15 src/sys/lib/libunwind/unwind_registers.S:1.16
--- src/sys/lib/libunwind/unwind_registers.S:1.15	Sun Aug 10 05:57:31 2014
+++ src/sys/lib/libunwind/unwind_registers.S	Wed Sep  3 19:27:21 2014
@@ -1253,3 +1253,84 @@ LEAF_ENTRY_NOPROFILE(_ZNK7_Unwind14Regis
 	bv,n %r0(%r2)
 EXIT(_ZNK7_Unwind14Registers_HPPA6jumptoEv)
 #endif
+
+#ifdef __or1k__
+ENTRY_NP(_ZN7_Unwind14Registers_or1kC1Ev)
+	l.sw	(0*3)(r3), r0
+	l.sw	(1*3)(r3), r1
+	l.sw	(2*3)(r3), r2
+	l.sw	(3*3)(r3), r3
+	l.sw	(4*3)(r3), r4
+	l.sw	(5*3)(r3), r5
+	l.sw	(6*3)(r3), r6
+	l.sw	(7*3)(r3), r7
+	l.sw	(8*3)(r3), r8
+	l.sw	(9*3)(r3), r9
+	l.sw	(10*3)(r3), r10
+	l.sw	(11*3)(r3), r11
+	l.sw	(12*3)(r3), r12
+	l.sw	(13*3)(r3), r13
+	l.sw	(14*3)(r3), r14
+	l.sw	(15*3)(r3), r15
+	l.sw	(16*3)(r3), r16
+	l.sw	(17*3)(r3), r17
+	l.sw	(18*3)(r3), r18
+	l.sw	(19*3)(r3), r19
+	l.sw	(20*3)(r3), r20
+	l.sw	(21*3)(r3), r21
+	l.sw	(22*3)(r3), r22
+	l.sw	(23*3)(r3), r23
+	l.sw	(24*3)(r3), r24
+	l.sw	(25*3)(r3), r25
+	l.sw	(26*3)(r3), r26
+	l.sw	(27*3)(r3), r27
+	l.sw	(28*3)(r3), r28
+	l.sw	(29*3)(r3), r29
+	l.sw	(30*3)(r3), r30
+	l.sw	(31*3)(r3), r31
+	l.mfspr	r4, r0, 20
+	l.sw	(32*4)(r3), r4
+	l.jr	lr
+	l.nop
+END(_ZN7_Unwind14Registers_or1kC1Ev)
+
+ENTRY_NP(_ZNK7_Unwind14Registers_or1k6jumptoEv)
+	l.lwz	r6, (32*4)(r3)
+	l.mtspr	r0, r6, 20
+	l.lwz	r0, (0*4)(r3)
+	l.lwz	r1, (1*4)(r3)
+	l.lwz	r2, (2*4)(r3)
+	l.lwz	r4, (4*4)(r3)
+	l.lwz	r5, (5*4)(r3)
+	l.lwz	r6, (6*4)(r3)
+	l.lwz	r7, (7*4)(r3)
+	l.lwz	r8, (8*4)(r3)
+	l.lwz	r9, (9*4)(r3)
+	l.lwz	r10, (10*4)(r3)
+	l.lwz	r11, (11*4)(r3)
+	l.lwz	r12, (12*4)(r3)
+	l.lwz	r13, (13*4)(r3)
+	l.lwz	r14, (14*4)(r3)
+	l.lwz	r15, (15*4)(r3)
+	l.lwz	r16, (16*4)(r3)
+	l.lwz	r17, (17*4)(r3)
+	l.lwz	r18, (18*4)(r3)
+	l.lwz	r19, (19*4)(r3)
+	l.lwz	r20, (20*4)(r3)
+	l.lwz	r21, (21*4)(r3)
+	l.lwz	r22, (22*4)(r3)
+	l.lwz	r23, (23*4)(r3)
+	l.lwz	r24, (24*4)(r3)
+	l.lwz	r25, (25*4)(r3)
+	l.lwz	r26, (26*4)(r3)
+	l.lwz	r27, (27*4)(r3)
+	l.lwz	r28, (28*4)(r3)
+	l.lwz	r29, (29*4)(r3)
+	l.lwz	r30, (30*4)(r3)
+	l.lwz	r31, (31*4)(r3)
+
+	l.lwz	r3, (3*4)(r3)		/* return r3 */
+	l.jr	lr
+END(_ZNK7_Unwind14Registers_or1k6jumptoEv)
+
+#endif

Reply via email to