Module Name: src
Committed By: joerg
Date: Sat Apr 26 20:15:48 UTC 2014
Modified Files:
src/share/mk: bsd.own.mk
src/sys/lib/libunwind: Registers.hpp unwind_registers.S
Log Message:
Add initial unwind support for MIPS and MIPS64.
To generate a diff of this commit:
cvs rdiff -u -r1.800 -r1.801 src/share/mk/bsd.own.mk
cvs rdiff -u -r1.13 -r1.14 src/sys/lib/libunwind/Registers.hpp
cvs rdiff -u -r1.11 -r1.12 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/share/mk/bsd.own.mk
diff -u src/share/mk/bsd.own.mk:1.800 src/share/mk/bsd.own.mk:1.801
--- src/share/mk/bsd.own.mk:1.800 Tue Apr 22 13:20:58 2014
+++ src/share/mk/bsd.own.mk Sat Apr 26 20:15:48 2014
@@ -1,4 +1,4 @@
-# $NetBSD: bsd.own.mk,v 1.800 2014/04/22 13:20:58 joerg Exp $
+# $NetBSD: bsd.own.mk,v 1.801 2014/04/26 20:15:48 joerg Exp $
# This needs to be before bsd.init.mk
.if defined(BSD_MK_COMPAT_FILE)
@@ -97,6 +97,10 @@ _LIBC_UNWIND_SUPPORT.alpha= yes
_LIBC_UNWIND_SUPPORT.hppa= yes
_LIBC_UNWIND_SUPPORT.i386= yes
_LIBC_UNWIND_SUPPORT.m68k= yes
+_LIBC_UNWIND_SUPPORT.mipseb= yes
+_LIBC_UNWIND_SUPPORT.mipsel= yes
+_LIBC_UNWIND_SUPPORT.mips64eb= yes
+_LIBC_UNWIND_SUPPORT.mipse64l= yes
_LIBC_UNWIND_SUPPORT.powerpc= yes
_LIBC_UNWIND_SUPPORT.sh3el= yes
_LIBC_UNWIND_SUPPORT.sh3eb= yes
Index: src/sys/lib/libunwind/Registers.hpp
diff -u src/sys/lib/libunwind/Registers.hpp:1.13 src/sys/lib/libunwind/Registers.hpp:1.14
--- src/sys/lib/libunwind/Registers.hpp:1.13 Sat Apr 19 21:21:24 2014
+++ src/sys/lib/libunwind/Registers.hpp Sat Apr 26 20:15:48 2014
@@ -793,6 +793,150 @@ private:
uint32_t fpreg[56];
};
+enum {
+ DWARF_MIPS_R1 = 0,
+ DWARF_MIPS_R31 = 31,
+ DWARF_MIPS_F0 = 32,
+ DWARF_MIPS_F31 = 63,
+
+ REGNO_MIPS_PC = 0,
+ REGNO_MIPS_R1 = 0,
+ REGNO_MIPS_R29 = 29,
+ REGNO_MIPS_R31 = 31,
+ REGNO_MIPS_F0 = 33,
+ REGNO_MIPS_F31 = 64
+};
+
+class Registers_MIPS {
+public:
+ enum {
+ LAST_REGISTER = REGNO_MIPS_F31,
+ LAST_RESTORE_REG = REGNO_MIPS_F31,
+ RETURN_REG = REGNO_MIPS_R31,
+ RETURN_OFFSET = 0,
+ };
+
+ __dso_hidden Registers_MIPS();
+
+ static int dwarf2regno(int num) {
+ if (num >= DWARF_MIPS_R1 && num <= DWARF_MIPS_R31)
+ return REGNO_MIPS_R1 + (num - DWARF_MIPS_R1);
+ if (num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31)
+ return REGNO_MIPS_F0 + (num - DWARF_MIPS_F0);
+ return LAST_REGISTER + 1;
+ }
+
+ bool validRegister(int num) const {
+ return num >= REGNO_MIPS_PC && num <= REGNO_MIPS_R31;
+ }
+
+ 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_MIPS_PC]; }
+
+ void setIP(uint64_t value) { reg[REGNO_MIPS_PC] = value; }
+
+ uint64_t getSP() const { return reg[REGNO_MIPS_R29]; }
+
+ void setSP(uint64_t value) { reg[REGNO_MIPS_R29] = value; }
+
+ bool validFloatVectorRegister(int num) const {
+ return num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31;
+ }
+
+ void copyFloatVectorRegister(int num, uint64_t addr_) {
+ assert(validFloatVectorRegister(num));
+ const void *addr = reinterpret_cast<const void *>(addr_);
+ memcpy(fpreg + (num - REGNO_MIPS_F0), addr, sizeof(fpreg[0]));
+ }
+
+ __dso_hidden void jumpto() const __dead;
+
+private:
+ uint32_t reg[REGNO_MIPS_R31 + 1];
+ uint64_t fpreg[32];
+};
+
+enum {
+ DWARF_MIPS64_R1 = 0,
+ DWARF_MIPS64_R31 = 31,
+ DWARF_MIPS64_F0 = 32,
+ DWARF_MIPS64_F31 = 63,
+
+ REGNO_MIPS64_PC = 0,
+ REGNO_MIPS64_R1 = 0,
+ REGNO_MIPS64_R29 = 29,
+ REGNO_MIPS64_R31 = 31,
+ REGNO_MIPS64_F0 = 33,
+ REGNO_MIPS64_F31 = 64
+};
+
+class Registers_MIPS64 {
+public:
+ enum {
+ LAST_REGISTER = REGNO_MIPS64_F31,
+ LAST_RESTORE_REG = REGNO_MIPS64_F31,
+ RETURN_REG = REGNO_MIPS64_R31,
+ RETURN_OFFSET = 0,
+ };
+
+ __dso_hidden Registers_MIPS64();
+
+ static int dwarf2regno(int num) {
+ if (num >= DWARF_MIPS64_R1 && num <= DWARF_MIPS64_R31)
+ return REGNO_MIPS64_R1 + (num - DWARF_MIPS64_R1);
+ if (num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31)
+ return REGNO_MIPS64_F0 + (num - DWARF_MIPS64_F0);
+ return LAST_REGISTER + 1;
+ }
+
+ bool validRegister(int num) const {
+ return num >= REGNO_MIPS64_PC && num <= REGNO_MIPS64_R31;
+ }
+
+ 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_MIPS64_PC]; }
+
+ void setIP(uint64_t value) { reg[REGNO_MIPS64_PC] = value; }
+
+ uint64_t getSP() const { return reg[REGNO_MIPS64_R29]; }
+
+ void setSP(uint64_t value) { reg[REGNO_MIPS64_R29] = value; }
+
+ bool validFloatVectorRegister(int num) const {
+ return num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31;
+ }
+
+ void copyFloatVectorRegister(int num, uint64_t addr_) {
+ assert(validFloatVectorRegister(num));
+ const void *addr = reinterpret_cast<const void *>(addr_);
+ memcpy(fpreg + (num - REGNO_MIPS64_F0), addr, sizeof(fpreg[0]));
+ }
+
+ __dso_hidden void jumpto() const __dead;
+
+private:
+ uint64_t reg[REGNO_MIPS64_R31 + 1];
+ uint64_t fpreg[32];
+};
+
#if __i386__
typedef Registers_x86 NativeUnwindRegisters;
#elif __x86_64__
@@ -805,6 +949,10 @@ typedef Registers_arm32 NativeUnwindRegi
typedef Registers_vax NativeUnwindRegisters;
#elif __m68k__
typedef Registers_M68K NativeUnwindRegisters;
+#elif __mips_n64 || __mips_n32
+typedef Registers_MIPS64 NativeUnwindRegisters;
+#elif __mips__
+typedef Registers_MIPS NativeUnwindRegisters;
#elif __sh3__
typedef Registers_SH3 NativeUnwindRegisters;
#elif __sparc64__
Index: src/sys/lib/libunwind/unwind_registers.S
diff -u src/sys/lib/libunwind/unwind_registers.S:1.11 src/sys/lib/libunwind/unwind_registers.S:1.12
--- src/sys/lib/libunwind/unwind_registers.S:1.11 Sat Apr 19 21:21:24 2014
+++ src/sys/lib/libunwind/unwind_registers.S Sat Apr 26 20:15:48 2014
@@ -733,6 +733,298 @@ LEAF_NOPROFILE(_ZNK7_Unwind15Registers_A
END(_ZNK7_Unwind15Registers_Alpha6jumptoEv)
#endif
+#if defined(__mips_n64) || defined(__mips_n32)
+ .set noat
+LEAF(_ZN7_Unwind16Registers_MIPS64C1Ev)
+#if 0
+ FP_S $f0, 256($4)
+ FP_S $f1, 264($4)
+ FP_S $f2, 272($4)
+ FP_S $f3, 280($4)
+ FP_S $f4, 288($4)
+ FP_S $f5, 296($4)
+ FP_S $f6, 304($4)
+ FP_S $f7, 312($4)
+ FP_S $f8, 320($4)
+ FP_S $f9, 328($4)
+ FP_S $f10, 336($4)
+ FP_S $f11, 344($4)
+ FP_S $f12, 352($4)
+ FP_S $f13, 360($4)
+ FP_S $f14, 368($4)
+ FP_S $f15, 376($4)
+ FP_S $f16, 384($4)
+ FP_S $f17, 392($4)
+ FP_S $f18, 400($4)
+ FP_S $f19, 408($4)
+ FP_S $f20, 416($4)
+ FP_S $f21, 424($4)
+ FP_S $f22, 432($4)
+ FP_S $f23, 440($4)
+ FP_S $f24, 448($4)
+ FP_S $f25, 456($4)
+ FP_S $f26, 464($4)
+ FP_S $f27, 472($4)
+ FP_S $f28, 480($4)
+ FP_S $f29, 488($4)
+ FP_S $f30, 496($4)
+ FP_S $f31, 504($4)
+#endif
+ sd $31, 0($4)
+ sd $1, 4($4)
+ sd $2, 8($4)
+ sd $3, 12($4)
+ sd $4, 16($4)
+ sd $5, 20($4)
+ sd $6, 24($4)
+ sd $7, 28($4)
+ sd $8, 32($4)
+ sd $9, 36($4)
+ sd $10, 40($4)
+ sd $11, 44($4)
+ sd $12, 48($4)
+ sd $13, 52($4)
+ sd $14, 56($4)
+ sd $15, 60($4)
+ sd $16, 64($4)
+ sd $17, 68($4)
+ sd $18, 72($4)
+ sd $19, 76($4)
+ sd $20, 80($4)
+ sd $21, 84($4)
+ sd $22, 88($4)
+ sd $23, 92($4)
+ sd $24, 96($4)
+ sd $25, 100($4)
+ sd $26, 104($4)
+ sd $27, 108($4)
+ sd $28, 112($4)
+ sd $29, 116($4)
+ sd $30, 120($4)
+ sd $31, 124($4)
+ jr $31
+ nop
+END(_ZN7_Unwind16Registers_MIPS64C1Ev)
+
+LEAF(_ZNK7_Unwind16Registers_MIPS646jumptoEv)
+#if 0
+ FP_L $f0, 256($4)
+ FP_L $f1, 264($4)
+ FP_L $f2, 272($4)
+ FP_L $f3, 280($4)
+ FP_L $f4, 288($4)
+ FP_L $f5, 296($4)
+ FP_L $f6, 304($4)
+ FP_L $f7, 312($4)
+ FP_L $f8, 320($4)
+ FP_L $f9, 328($4)
+ FP_L $f10, 336($4)
+ FP_L $f11, 344($4)
+ FP_L $f12, 352($4)
+ FP_L $f13, 360($4)
+ FP_L $f14, 368($4)
+ FP_L $f15, 376($4)
+ FP_L $f16, 384($4)
+ FP_L $f17, 392($4)
+ FP_L $f18, 400($4)
+ FP_L $f19, 408($4)
+ FP_L $f20, 416($4)
+ FP_L $f21, 424($4)
+ FP_L $f22, 432($4)
+ FP_L $f23, 440($4)
+ FP_L $f24, 448($4)
+ FP_L $f25, 456($4)
+ FP_L $f26, 464($4)
+ FP_L $f27, 472($4)
+ FP_L $f28, 480($4)
+ FP_L $f29, 488($4)
+ FP_L $f30, 496($4)
+ FP_L $f31, 504($4)
+#endif
+
+ ld $31, 0($4)
+ ld $1, 8($4)
+ ld $2, 16($4)
+ ld $3, 24($4)
+ ld $5, 40($4)
+ ld $6, 48($4)
+ ld $7, 56($4)
+ ld $8, 64($4)
+ ld $9, 72($4)
+ ld $10, 80($4)
+ ld $11, 88($4)
+ ld $12, 96($4)
+ ld $13, 104($4)
+ ld $14, 112($4)
+ ld $15, 120($4)
+ ld $16, 128($4)
+ ld $17, 136($4)
+ ld $18, 144($4)
+ ld $19, 152($4)
+ ld $20, 160($4)
+ ld $21, 168($4)
+ ld $22, 176($4)
+ ld $23, 184($4)
+ ld $24, 192($4)
+ ld $25, 200($4)
+ ld $26, 208($4)
+ ld $27, 216($4)
+ ld $28, 224($4)
+ ld $29, 232($4)
+ ld $30, 240($4)
+ ld $4, 32($4)
+ jr $31
+ nop
+END(_ZNK7_Unwind16Registers_MIPS646jumptoEv)
+#elif defined(__mips__)
+ .set noat
+LEAF(_ZN7_Unwind14Registers_MIPSC1Ev)
+#if 0
+#if __mips > 1
+ FP_S $f0, 128($4)
+ FP_S $f1, 136($4)
+ FP_S $f2, 144($4)
+ FP_S $f3, 152($4)
+ FP_S $f4, 160($4)
+ FP_S $f5, 168($4)
+ FP_S $f6, 176($4)
+ FP_S $f7, 184($4)
+ FP_S $f8, 192($4)
+ FP_S $f9, 200($4)
+ FP_S $f10, 208($4)
+ FP_S $f11, 216($4)
+ FP_S $f12, 224($4)
+ FP_S $f13, 232($4)
+ FP_S $f14, 240($4)
+ FP_S $f15, 248($4)
+ FP_S $f16, 256($4)
+ FP_S $f17, 264($4)
+ FP_S $f18, 272($4)
+ FP_S $f19, 280($4)
+ FP_S $f20, 288($4)
+ FP_S $f21, 296($4)
+ FP_S $f22, 304($4)
+ FP_S $f23, 312($4)
+ FP_S $f24, 320($4)
+ FP_S $f25, 328($4)
+ FP_S $f26, 336($4)
+ FP_S $f27, 344($4)
+ FP_S $f28, 352($4)
+ FP_S $f29, 360($4)
+ FP_S $f30, 368($4)
+ FP_S $f31, 376($4)
+#endif
+#endif
+ sw $31, 0($4)
+ sw $1, 4($4)
+ sw $2, 8($4)
+ sw $3, 12($4)
+ sw $4, 16($4)
+ sw $5, 20($4)
+ sw $6, 24($4)
+ sw $7, 28($4)
+ sw $8, 32($4)
+ sw $9, 36($4)
+ sw $10, 40($4)
+ sw $11, 44($4)
+ sw $12, 48($4)
+ sw $13, 52($4)
+ sw $14, 56($4)
+ sw $15, 60($4)
+ sw $16, 64($4)
+ sw $17, 68($4)
+ sw $18, 72($4)
+ sw $19, 76($4)
+ sw $20, 80($4)
+ sw $21, 84($4)
+ sw $22, 88($4)
+ sw $23, 92($4)
+ sw $24, 96($4)
+ sw $25, 100($4)
+ sw $26, 104($4)
+ sw $27, 108($4)
+ sw $28, 112($4)
+ sw $29, 116($4)
+ sw $30, 120($4)
+ sw $31, 124($4)
+ jr $31
+ nop
+END(_ZN7_Unwind14Registers_MIPSC1Ev)
+
+LEAF(_ZNK7_Unwind14Registers_MIPS6jumptoEv)
+#if 0
+#if __mips > 1
+ FP_L $f0, 128($4)
+ FP_L $f1, 136($4)
+ FP_L $f2, 144($4)
+ FP_L $f3, 152($4)
+ FP_L $f4, 160($4)
+ FP_L $f5, 168($4)
+ FP_L $f6, 176($4)
+ FP_L $f7, 184($4)
+ FP_L $f8, 192($4)
+ FP_L $f9, 200($4)
+ FP_L $f10, 208($4)
+ FP_L $f11, 216($4)
+ FP_L $f12, 224($4)
+ FP_L $f13, 232($4)
+ FP_L $f14, 240($4)
+ FP_L $f15, 248($4)
+ FP_L $f16, 256($4)
+ FP_L $f17, 264($4)
+ FP_L $f18, 272($4)
+ FP_L $f19, 280($4)
+ FP_L $f20, 288($4)
+ FP_L $f21, 296($4)
+ FP_L $f22, 304($4)
+ FP_L $f23, 312($4)
+ FP_L $f24, 320($4)
+ FP_L $f25, 328($4)
+ FP_L $f26, 336($4)
+ FP_L $f27, 344($4)
+ FP_L $f28, 352($4)
+ FP_L $f29, 360($4)
+ FP_L $f30, 368($4)
+ FP_L $f31, 376($4)
+#endif
+#endif
+
+ lw $31, 0($4)
+ lw $1, 4($4)
+ lw $2, 8($4)
+ lw $3, 12($4)
+ lw $5, 20($4)
+ lw $6, 24($4)
+ lw $7, 28($4)
+ lw $8, 32($4)
+ lw $9, 36($4)
+ lw $10, 40($4)
+ lw $11, 44($4)
+ lw $12, 48($4)
+ lw $13, 52($4)
+ lw $14, 56($4)
+ lw $15, 60($4)
+ lw $16, 64($4)
+ lw $17, 68($4)
+ lw $18, 72($4)
+ lw $19, 76($4)
+ lw $20, 80($4)
+ lw $21, 84($4)
+ lw $22, 88($4)
+ lw $23, 92($4)
+ lw $24, 96($4)
+ lw $25, 100($4)
+ lw $26, 104($4)
+ lw $27, 108($4)
+ lw $28, 112($4)
+ lw $29, 116($4)
+ lw $30, 120($4)
+ lw $4, 16($4)
+ jr $31
+ nop
+END(_ZNK7_Unwind14Registers_MIPS6jumptoEv)
+#endif
+
#if defined(__hppa__)
LEAF_ENTRY_NOPROFILE(_ZN7_Unwind14Registers_HPPAC1Ev)
stw %r2, 0(%r26)