Module Name: src
Committed By: joerg
Date: Mon Mar 24 21:25:03 UTC 2014
Modified Files:
src/share/mk: bsd.own.mk
src/sys/lib/libunwind: Registers.hpp libunwind.cxx unwind_registers.S
Log Message:
Add m68k support to our unwinder.
To generate a diff of this commit:
cvs rdiff -u -r1.790 -r1.791 src/share/mk/bsd.own.mk
cvs rdiff -u -r1.5 -r1.6 src/sys/lib/libunwind/Registers.hpp \
src/sys/lib/libunwind/libunwind.cxx \
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.790 src/share/mk/bsd.own.mk:1.791
--- src/share/mk/bsd.own.mk:1.790 Tue Mar 18 13:10:27 2014
+++ src/share/mk/bsd.own.mk Mon Mar 24 21:25:03 2014
@@ -1,4 +1,4 @@
-# $NetBSD: bsd.own.mk,v 1.790 2014/03/18 13:10:27 joerg Exp $
+# $NetBSD: bsd.own.mk,v 1.791 2014/03/24 21:25:03 joerg Exp $
# This needs to be before bsd.init.mk
.if defined(BSD_MK_COMPAT_FILE)
@@ -99,6 +99,7 @@ HAVE_LIBGCC?= yes
.endif
_LIBC_UNWIND_SUPPORT.i386= yes
+_LIBC_UNWIND_SUPPORT.m68k= yes
_LIBC_UNWIND_SUPPORT.powerpc= yes
_LIBC_UNWIND_SUPPORT.vax= yes
_LIBC_UNWIND_SUPPORT.x86_64= yes
Index: src/sys/lib/libunwind/Registers.hpp
diff -u src/sys/lib/libunwind/Registers.hpp:1.5 src/sys/lib/libunwind/Registers.hpp:1.6
--- src/sys/lib/libunwind/Registers.hpp:1.5 Tue Mar 18 13:08:15 2014
+++ src/sys/lib/libunwind/Registers.hpp Mon Mar 24 21:25:03 2014
@@ -372,6 +372,75 @@ private:
uint32_t reg[REGNO_VAX_PSW + 1];
};
+enum {
+ DWARF_M68K_A0 = 0,
+ DWARF_M68K_A7 = 7,
+ DWARF_M68K_D0 = 8,
+ DWARF_M68K_D7 = 15,
+ DWARF_M68K_PC = 24,
+
+ REGNO_M68K_A0 = 0,
+ REGNO_M68K_A7 = 7,
+ REGNO_M68K_D0 = 8,
+ REGNO_M68K_D7 = 15,
+ REGNO_M68K_PC = 16,
+};
+
+class Registers_M68K {
+public:
+ enum {
+ LAST_REGISTER = REGNO_M68K_PC,
+ LAST_RESTORE_REG = REGNO_M68K_PC,
+ RETURN_REG = REGNO_M68K_PC,
+ };
+
+ __dso_hidden Registers_M68K();
+
+ static int dwarf2regno(int num) {
+ if (num >= DWARF_M68K_A0 && num <= DWARF_M68K_A7)
+ return REGNO_M68K_A0 + (num - DWARF_M68K_A0);
+ if (num >= DWARF_M68K_D0 && num <= DWARF_M68K_D7)
+ return REGNO_M68K_D0 + (num - DWARF_M68K_D0);
+ if (num == DWARF_M68K_PC)
+ return REGNO_M68K_PC;
+ 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_M68K_PC]; }
+
+ void setIP(uint64_t value) { reg[REGNO_M68K_PC] = value; }
+
+ uint64_t getSP() const { return reg[REGNO_M68K_A7]; }
+
+ void setSP(uint64_t value) { reg[REGNO_M68K_A7] = 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_M68K_PC + 1];
+};
+
} // namespace _Unwind
#endif // __REGISTERS_HPP__
Index: src/sys/lib/libunwind/libunwind.cxx
diff -u src/sys/lib/libunwind/libunwind.cxx:1.5 src/sys/lib/libunwind/libunwind.cxx:1.6
--- src/sys/lib/libunwind/libunwind.cxx:1.5 Thu Mar 20 01:35:45 2014
+++ src/sys/lib/libunwind/libunwind.cxx Mon Mar 24 21:25:03 2014
@@ -27,6 +27,8 @@ typedef Registers_ppc32 ThisUnwindRegist
typedef Registers_arm32 ThisUnwindRegisters;
#elif __vax__
typedef Registers_vax ThisUnwindRegisters;
+#elif __m68k__
+typedef Registers_M68K ThisUnwindRegisters;
#else
#error Unsupported architecture
#endif
Index: src/sys/lib/libunwind/unwind_registers.S
diff -u src/sys/lib/libunwind/unwind_registers.S:1.5 src/sys/lib/libunwind/unwind_registers.S:1.6
--- src/sys/lib/libunwind/unwind_registers.S:1.5 Wed Mar 19 21:15:45 2014
+++ src/sys/lib/libunwind/unwind_registers.S Mon Mar 24 21:25:03 2014
@@ -339,6 +339,26 @@ ENTRY(_ZNK7_Unwind13Registers_vax6jumpto
movl 0(%r0), %r0
/* XXX restore PSW */
rsb
-
END(_ZNK7_Unwind13Registers_vax6jumptoEv)
#endif
+
+#if defined(__m68k__)
+ENTRY(_ZN7_Unwind14Registers_M68KC1Ev)
+ move.l 4(%sp), %a0
+ movem.l %d0-%d7/%a0-%a7, (%a0)
+ move.l 0(%sp), %a1
+ move.l %a1, 64(%a0)
+ addq.l #4, 60(%a0)
+ rts
+END(_ZN7_Unwind14Registers_M68KC1Ev)
+
+ENTRY(_ZNK7_Unwind14Registers_M68K6jumptoEv)
+ move.l 4(%sp), %a0
+ subq.l #4, 60(%a0)
+ move.l 64(%a0), %a1
+ move.l 60(%a0), %a2
+ move.l %a1, (%a2)
+ movem.l (%a0), %d0-%d7/%a0-%a7
+ rts
+END(_ZNK7_Unwind14Registers_M68K6jumptoEv)
+#endif