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